OmniAICreator/Qiita-1.07M huggingface dataset:
【合格体験記】LPIC-1(Level1) ver5.0

# 本記事の概要

LPIC-1(Level1)version5.0 を受験し取得したので勉強方法を備忘録として投稿します。
LPICを受けようと思っている方や、現在勉強している方がこの記事を参考の一つにしていただけたら幸いです。

# 使用した教材

参考書
・[あずき本 (Linux教科書 LPICレベル1 Version5.0対応)](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798160490/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)
・[Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応](https://www.amazon.co.jp/gp/product/4798160857/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1)

WEBサイト
・[Ping-t (101試験の範囲は無料)](https://ping-t.com/)

# 勉強の流れ(101試験編)

試験にビビり倒していたので勉強時間をとりあえず１ヶ月に設定して勉強スタート

**第1週**
**・とりあえずあずき本を1冊読む**
コマンドのオプションを覚えたり細かい部分を理解しきろうとせず、なんとな～く全体像を掴むイメージで読む。
元々知っているコマンド等もあったが、ほぼ初見の知識ばかりでモチベが続かず1週間かかってしまう。

↓
**第2,3週**
**・Ping-tのWEB問題集を分野毎に解いていき、間違えた問題は解答を読んでノートにまとめる。**
もちろん最初は間違えまくるのでとても時間がかかった。
あずき本読んでる時は「オプションたくさんありすぎ！覚えられる気がしない！」と思っていたが、
ノートに自分なりにまとめてみると案外覚えられる。

**・↑が終わったら主題毎に全問金になるまで解きまくる。**
問題総数が100問以下なら1日、150問～なら2日かけて金にすることを意識。

↓
**第4週**
**・Ping-tのコマ問を解く**
コマ問に関しては全問網羅せず、主題毎に出題数を20問にして80%くらい安定して正解出来ればよし。
（コマ問の問題総数を見て軽く絶望したので）

**・スピードマスター問題集を解く。**
スピマスはPing-tでは問われなかった問題もそこそこ載っていた。
この問題ちょっと難しいな～って思っていたやつがそっくりそのまま本試験に出たりしたので、
金銭的、時間的に余裕があればとてもおすすめ。
ただ、感覚的にはPing-tだけでも7割くらいはカバーできる気はする。

**・Ping-tのWEB問題集で模擬試験モードをやりまくる**
とにかく解く。暇さえあればPing-tをやる。Ping-t人間。

# 試験結果(101試験)

受験日：2020年6月27日
スコア：700
合格ライン：500
結果：pass

システムアーキテクチャ：87%
Linuxのインストール及びパッケージ管理：75%
GNUコマンドおよびUnixコマンド：92%
デバイス、Linuxファイルシステム、ファイルシステム、階層標準：92%

101試験を受けた率直な感想は **「準備期間１ヶ月もいらなかった」**
解き終わった際もかなり手ごたえを感じていて、安心して「試験終了」ボタンを押せた。

# 勉強の流れ(102試験編)

101試験の結果から「2週間でいけるんじゃね？」と思い勉強時間を2週間に設定。
流れは101の時と大体同じ。

**第1週**
**・Ping-tのWEB問題集を分野毎に解いていき、間違えた問題は解答を読んで自分なりにノートにまとめる。**
102試験は設定ファイルやディレクトリを完全パスで問われることが多いとのことから、
コマ問をやる前から意識して覚えるようにしていた。

**・↑が終わったら主題毎に全問金になるまで解きまくる。**

**・全問金にしたら模擬試験モードを5回ほどやる。**
101の時とは違い、時間が少なかったため5回ほどやったら妥協して次に。
（もちろん間違えた問題は金にする）

↓
**第2週**
**・Ping-tのコマ問を解く**
102のコマ問が個人的には結構難しく、80%超えるまでやってたら時間が足りないと思い65%以上正解で妥協。

**・スピードマスター問題集を解く。**
101の時とは違い、Ping-tで問われない問題がかなり多く乗っている印象を受けた。
理解があやふやな問題も残っていたが、とりあえず1冊通して終わらせてこれも妥協。

# 試験結果(102試験)

受験日：2020年7月12日
スコア：680
合格ライン：500
結果：pass

シェルおよびシェルスクリプト：75%
ユーザーインターフェースとデスクトップ：100%
管理タスク：83%
Essential System Service(エッセンシャルシステムサービス)：91%
Networking Fundamentals(ネットワーキングの基礎)：100%
セキュリティ：70%

102試験は勉強段階で妥協した部分が多い事もあり、かなり緊張して挑むことに。
自信をもって解答できない問題が多く、ドキドキで「試験終了」ボタンを押した。

# 受験後の感想

Linuxに関して体系的に学ぶことが出来るので受ける価値はとてもある試験だと思います。

資格を持っているからなんだという訳ではない。というのは重々承知していますが、
この１ヶ月半の経験が「全くの無駄」ではないと思っています。
どう活かすかは結局自分次第ですので、無駄にしないようにしたいですね。

この記事を開いていただき、また、
ここまで読んでいただきありがとうございました。
MacでCPU 物理コア数 / 論理コア数・物理メモリの総量を確認するコマンド

#はじめに
本投稿は備忘録です。
頻繁に使うものではありませんが、誰かのお役に立てれば幸いです。

なお、記念すべき(?)Qiita初投稿です。

##CPU 物理コア数を確認する
ターミナルでコマンドを実行する。

```
$ sysctl -n hw.physicalcpu_max
```

##CPU 論理コア数を確認する
ターミナルでコマンドを実行する。

```
$ sysctl -n hw.logicalcpu_max
```

##物理メモリの総量を確認する
ターミナルでコマンドを実行する。

```
$ sysctl hw.memsize
```

バイトで結果が表示されるので、適宜変換してください。


#まとめ
もっとスペックの良いMacBookProが欲しいです。
Ruby で 繰返し二乗法 を解くなら Integer#pow がお薦め

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 事の始まり
*[Ruby と Perl と Java と Python で解く AtCoder ATC 002 B 繰返し二乗法](https://qiita.com/superrino130/items/adbb485637e45a024fa1)* でコメントをいただきました。
> Ruby だと専用メソッド Integer#pow がありますね。

早速試しました。
# [AtCoder Typical Contest 002 B - n^p mod m](https://atcoder.jp/contests/atc002/tasks/atc002_b)
```pow.rb
n, m, p = gets.split.map(&:to_i)
puts n.pow(p, m)
```
```zisaku.rb
n, m, p = gets.split.map(&:to_i)
def mpow(n, p, mod)
  r = 1
  while p > 0
    r = r * n % mod if p % 2 == 1
    n = n * n % mod
    p >>= 1
  end
  r
end
puts mpow(n, p, m)
```
||Integer#pow|自作mpow|
|:--:|:--:|:--:|
|コード長 (Byte)|50|183|
|実行時間 (ms)|68|62|
|メモリ (KB)|14356|14356|
# [AtCoder Regular Contest 066 C - Lining Up](https://atcoder.jp/contests/arc066/tasks/arc066_a)
```pow.rb
n = gets.to_i
a = gets.split.map(&:to_i)
h = Hash.new(0)
a.each do |x|
  h[x] += 1
end
f = true
h.each do |k, v|
  if n.odd? && k == 0
    if v != 1
      f = false
      break
    end
  elsif v != 2
    f = false
    break
  end
end
MOD = 1_000_000_007
puts (f ? 2.pow(n / 2, MOD) : 0)
```
||Integer#pow|自作mpow|
|:--:|:--:|:--:|
|コード長 (Byte)|305|438|
|実行時間 (ms)|101|100|
|メモリ (KB)|22676|22488|
# [エイシング プログラミング コンテスト 2020](https://atcoder.jp/contests/aising2020)
```pow.rb
n = gets.to_i
x = gets.chomp
xs = x.to_i(2)
xc = x.count('1')
def mpow(n, p, mod)
  return 0 if mod.zero?
  n.pow(p, mod)
end
def popcount(u)
  return 0 if u.zero?
  a = u % u.to_s(2).count('1')
  1 + popcount(a)
end
xsp = mpow(xs, 1, xc + 1)
xsm = mpow(xs, 1, xc - 1)
n.times do |i|
  if x[i] == '0'
    y = xsp + mpow(2, n - i - 1, xc + 1)
    y = mpow(y, 1, xc + 1)
  elsif xc == 1
    puts '0'
    next
  else
    y = xsm - mpow(2, n - i - 1, xc - 1)
    y = mpow(y, 1, xc - 1)
  end
  puts popcount(y) + 1
end
```
||Integer#pow|自作mpow|
|:--:|:--:|:--:|
|コード長 (Byte)|541|629|
|実行時間 (ms)|421|625|
|メモリ (KB)|14704|15392|
いずれも同等以上の成績でした。
`ruby`の時代が来ましたね。
# まとめ
+ Integer#pow を使おう
+ Ruby の時代が来た

参照したサイト
*[instance method Integer#\*\*](https://docs.ruby-lang.org/ja/2.7.0/method/Integer/i/=2a=2a.html)*
*[Ruby と Perl と Java と Python で解く AtCoder ATC 002 B 繰返し二乗法](https://qiita.com/superrino130/items/adbb485637e45a024fa1)*
*[Ruby と Python で解く AtCoder ARC 059 C 最小二乗法](https://qiita.com/superrino130/items/025e9632d58738935504)*
*[Ruby と Python で解く AtCoder AISING2020 D 繰返し二乗法](https://qiita.com/superrino130/items/765eb7f8facc06786794)*
vue-property-decoratorで動的コンポーネント

# vue-property-decoratorで動的コンポーネント

## コード

```vue
<template>
  <component v-bind:is="content" />
</script>

<script>
  import {Component, Vue} from "vue-property-decorator";

  @Component({
    comonents: {
      hoge: Hoge
      fuga: Fuga
    }
  })
  export default class SampleComponent extends Vue {
    private content = "hoge"
  }
</script>
```

## 解説

`<component>`タグで`v-bind:is`で指定したプロパティに一致するコンポーネントを表示させる。`@Component`の`components`に`エイリアス: コンポーネント`と書き、プロパティには表示させたいコンポーネントのエイリアスを代入する。
コンポーネントを切り替えた際に元のコンポーネントが破棄されないようにするには、`<keep-alive>`タグで`<component>`タグを囲ってあげると良い。
国立国会図書館サーチAPIとExcel関数を用いた書誌情報の簡易取得ツール

#はじめに
本ツールは、国立国会図書館サーチのAPI（SRU）とExcel（WEBSERVICEとFILTERXML）を利用して、
Excelに入力した書名から著者や出版者などの書誌情報をセルに表示します。

注意点として、本ツールでは書名に対して最新の書誌情報1件しか取得しないため、
同一の書名の場合は欲しい情報が得られない場合があります。

また、本ツールでは国立国会図書館サーチのAPIを利用するため、
必ず利用条件をご確認ください。（ https://iss.ndl.go.jp/information/api/ ）

##前提条件
(1) Excelから国立国会図書館のURLへ通信できること
(2) Excelのバージョンが2013以降であること

##動作確認PC
(1) Windows 10 Pro Version 1909
(2) Microsoft Office Home and Business 2019
(3) ESET Security 12

#簡易取得ツールの作成
##(1)Excelの用意
書名を入力する列（①）、WEBSERVICE関数を入力する列（②）、FILTERXML関数を入力する列（取得したいデータ項目数分）（③）を用意します。
##(2)WEBSERVICE関数を利用して書誌情報のXMLを取得
②の列に次のWEBSERVICE関数を入力します。
```=WEBSERVICE("https://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl&onlyBib=true&recordPacking=xml&maximumRecords=1&startRecord=1&query=title%3d%22"&B4&"%22%20AND%20mediatype%3d%221%22")```
・onlyBib=trueで書誌情報のみ取得
・maximumRecords=1で1件のみ取得
・query=titleで書誌のタイトルを検索
・B4はこの場合の書名を入力するセル
詳しくはAPI仕様書をご確認ください。（ https://iss.ndl.go.jp/information/api/riyou/ ）
##(3)FILTERXML関数を利用してXMLから欲しい項目を抽出
③の列に取得したいデータ項目ごとに次のFILTERXML関数を入力します。（C4はこの場合のXMLを取得したセル）
○著者
```=FILTERXML($C4,"/searchRetrieveResponse/records/record/recordData/rdf:RDF/dcndl:BibResource/dc:creator")```
○出版年月
```=FILTERXML($C4,"/searchRetrieveResponse/records/record/recordData/rdf:RDF/dcndl:BibResource/dcterms:date | dcterms:issued")```
○出版者
```=FILTERXML($C4,"/searchRetrieveResponse/records/record/recordData/rdf:RDF/dcndl:BibResource/dcterms:publisher/foaf:Agent/foaf:name")```
○JP番号/ISBN番号
```=FILTERXML($C4,"/searchRetrieveResponse/records/record/recordData/rdf:RDF/dcndl:BibResource/rdfs:seeAlso/@rdf:resource")```
○URLリンク
```=HYPERLINK(FILTERXML($C4,"/searchRetrieveResponse/records/record/recordData/rdf:RDF/dcndl:BibAdminResource/dcndl:record/@rdf:resource"))```
#参考
APIに問い合わせるURLやFILTERXMLで用いるXPATHの書き方は、API仕様書にくわえて同志社大学図書館情報学研究室（原田隆史教授）のNDL書誌データ検索シート Ver 1.2.3も参考にしています。（ http://www.slis.doshisha.ac.jp/~ushi/ToolNDL/ ）
#おわりに
本ツールは高機能ではないですが、書名さえ入力すれば比較的簡単に書誌情報を取得できます。
ただし、国立国会図書館サーチに登録されている書誌情報に依存するため、入力する書名のスペースの有無などで情報が取得できるか変わります。
また、Excelの更新のタイミングなどXMLをすべて再取得する場合があるので、サーバへの大量通信を防ぐため、図書目録等に実装するのではなく、一時的に書誌情報を取得するツールとして利用した方がよいと思います。
Laravel エラーメッセージのメソッドについて

# Laravel $errors　のメソッドについて
自分用のメモなのでざっくりと書いてます。

## $変数 = $errors->first(項目名);
指定した項目の最初のエラーメッセージを取得する

## $変数 = $errors->get(項目名);
指定した項目のエラーメッセージをすべて配列で取得する

## $変数 = $errors->all(項目名);
すべてのエラーメッセージを配列で取得する
GitHubのパスワードの正規表現を書くのだ！

## タイトルの通りなのだ！

そのままのやつを見つけられなかったから書くのだ。正規表現苦手なのだ！
GitHubのトップページのパスワードフォームに適当に入力すると以下のメッセージが出てくるのだ。

> Make sure it's at least 15 characters OR at least 8 characters including a number and a lowercase letter. [Learn more.](https://docs.github.com/en/github/authenticating-to-github/creating-a-strong-password)

訳すとこうなのだ！ (自信ないからDeepL使ったのだ)

> 15文字以上、または数字と小文字を含む8文字以上であることを確認してください。詳細は[こちら](https://docs.github.com/en/github/authenticating-to-github/creating-a-strong-password)をご覧ください。

これを正規表現にするのだ！
15文字以上の文字列は簡単そうなのだ

```javascript:15文字以上の文字列
/.{15,}/
```

これで良いはずなのだ。けど15文字以上の文字列って言ったときに`^`と`$`をつけるべきなのかはアライさんにはわかんないのだ。。
次に数字と小文字を含む8文字以上の文字列なのだ

```javascript:数字と小文字を含む8文字以上の文字列
/(?=.*\d)(?=.*[a-z]).{8,}/
```

`?=`は肯定先読みなのだ。でも手前に何もないのだ。丸括弧があるからcapturing groupの気がしたけど`/(?=.*\d)/.exec`したらここはキャプチャしてなかったのだ！
文字列中に`[0-9]`か`[a-z]`があって、8文字以上ならvalidになるのだ。

## 組み合わせるのだ！
パイプで良いと思うのだ。

```javascript:15文字以上、または数字と小文字を含む8文字以上の文字列
/.{15,}|(?=.*\d)(?=.*[a-z]).{8,}/
```

[Regexper](https://regexper.com/)に入力してみたら良さそうだったのだ！
https://regexper.com/#%2F.%7B15%2C%7D%7C%28%3F%3D.*%5Cd%29%28%3F%3D.*%5Ba-z%5D%29.%7B8%2C%7D%2F

## おわりなのだ
変なとこやもっと良い書き方があったら教えてくれると嬉しいのだ！

## 参考にしたページなのだ
[Creating a strong password](https://docs.github.com/en/github/authenticating-to-github/creating-a-strong-password)
[Regex for password validation](https://gist.github.com/rezigned/2469020)
[こんどこそわかる(肯|否)定(先|後)読み](https://qiita.com/tohta/items/2ba7ecde5636b38ef1f6)
[正規表現での、OR（いずれか、または）の表現方法](http://www-creators.com/archives/5039)
【HTML/CSS】ブロック要素から文字をはみ出して、特殊なレイアウトを構築！

#はじめに
<img width="1142" alt="スクリーンショット 2020-07-12 17.14.37.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/62431909-a0f9-d9e3-bb12-66a3fc7e7c5e.jpeg">

一見するとかなり難しそうな構成のWebページとなっているが、、、重要なのは下記の２点
**・ブロック要素から文字をはみ出させる**
**・空白のブロックを使う**

これらを意識してやれば、そこまで難しくなかったです。

#前提
・bootstrap4を使用（ほんの一部）
・`display: flex;`を理解している

#コード全て

```html
 <div class="flexParent animation01">
        <div class="animationNum01 animationNum">
          01
        </div>
        <div class="animationText01 aniText">
          <ul>
            <li>・ああああああああああああああああああああああ</li>
            <li>・いいいいいいいいいいいいいいいいいいいいいいい</li>
          </ul>
        </div>
      </div>

      <div class="flexParent animation02">
        <div>
          <div class="animationEmpty01">
           </div>
            <div class="flexParent animation03">
              <div class="animationNum01 animationNum">
                03
              </div>
              <div class="animationText03 aniText">
                <ul>
                  <li>・ううううううううううううううううう</li>
                  <li>・ええええええええええええええええええええええええ</li>
                </ul>
              </div>
            </div>
        </div>

        <div>
          <div class="text-center">
            <img src="img/main.png" alt="">
          </div> 
          <div class="flexParent animation04">
            <div class="animationNum01 animationNum">
              04
            </div>
            <div class="animationText04 aniText">
              <ul>
                <li>・おおおおおおおおおおおおおおおおおおおおお</li>
                <li>・っっっっっっっっっっっっっっっっっっっっっっk</li>
                <li>・aaaaaaaaaaaaaaaaaaaaaaaaaaaa</li>
              </ul>
            </div>
          </div>
        </div>

        <div class="animationNum02 animationNum">
          02
        </div>
        <div class="animationText02 aniText">
          <ul>
            <li>・bbbbbbbbbbbbbbbbbbb</li>
            <li>・cccccccccccccccccccccccccccccc</li>
            <li>・ddddddddddddddddddddddddddddddddddddddddd</li>
          </ul>
        </div>
      </div>
```

```css
.animation01 {
  width: 600px;
  margin: 0 0 25px 0;
}
.aniText {
  border-left: solid 2px #41A849;
  height: 100%;
}
.animationNum {
  padding-right: 10px;
  font-size: 48px;
}
.animationNum02 {
  height: 265px;
  width: 90px;
  margin-left: 25px;
}
.flexParent {
  display: flex;
}
.flexParent ul {
  margin-bottom: 0;
  list-style: none;
  font-size: 15px;
  padding-left: 10px;
}
/*空白のブロック*/
.animationEmpty01 {
  width: 200px;
  height: 250px;
  margin: 0 6%;
}
.animationText03 {
  margin-right: 20px;
}
/*要素から文字をはみ出させる*/
.animation04 {
  margin-top: 28px;
  margin-left: 300px;
  margin-right: calc(((80vw - 100%) / 2) * -1);
}
```
アルファベットさいころを使って英単語を作るゲーム①

##これは
自分が考案したゲームを個人開発してリリースするまでの軌跡を記録します。
（という体裁で書いてますが、完成に辿り着く可能性は極めて低いです。）

##基本ルール
* 六面体の各面にアルファベット一文字が書かれたものをいくつか用意する。
* これらを「並び替え」＋「回転」させて、できるだけたくさんの英単語を作る。
 ![radBB7BE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164214/fba925c8-8225-4b02-94d6-473caa9907ca.png)

##モード
* ステージモード
* 対戦モード
* エンドレスモード
* さいころエディット

##次回予告
[最高に使い勝手のよい「究極のサイコロ」を導出するプログラム]( )
Vagrantの開発環境でも高機能エディタ(VSCode)でアプリを作成できるようにする手順

#環境
Vagrant 2.2.9
macOS 10.15.4

#拡張機能SSH FSを追加する
拡張機能SSH FSを追加するために「表示」→「拡張機能」から検索で「SSH FS」と検索しインストールします。
<img width="801" alt="スクリーンショット 2020-07-12 17.13.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/f5113e1e-ac72-1c9b-27cc-48f035ad173d.png">

そしてインストールしたあと、ファイル一覧の下の方に「SSH FILE SYSTEM」タブがあるのが確認できるかと思います。現時点ではファイルは何もありません。
※わたしは事前に作成しているためssf-fsというファイルが存在しています。
<img width="801" alt="スクリーンショット 2020-07-12 17.11.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/e7d00689-5f27-3078-8b7a-b92f75832141.png">

#接続の設定を行う
仮想環境を構築したディレクトリに移動して下記のコマンドを実行します。

```ruby:terminal
$ vagrant ssh-config
```
自身の出力結果が表示されます。

```ruby:terminal
Host homestead
  HostName 127.0.0.1
  User vagrant
  Port [port No.]
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/[username]/Homestead/.vagrant/machines/homestead/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes
```

次に先ほどの「SSH FILE SYSTEMS」項目を右クリックして「Connect as Workspace folder」からファイルを作成し先ほどの出力情報を入力していきます。
<img width="1077" alt="スクリーンショット 2020-07-12 17.26.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/72394872-4127-1e42-b020-b82a5acb41ec.png">

入力する内容は下記になります。

- Host : HostName
- Port : Port
- Username : User
- Private Key : /Users/[username]/Homestead/.vagrant/machines/homestead/virtualbox/private_key

入力後にsaveしたらVagrantの仮想環境でもVScodeでアプリの作成や編集などを行えることを可能にしてくれます^_^
Vue.jsでdt、ddタグをv-forループで作る

dlタグをv-forループで生成するのは簡単ですよね

```vuejs

<template>
  <dl v-for="item in items">
    <dt>{{ item.name }}</dt>
    <dd>{{ item.description }}</dt>
  </dl>
</template>

↓

<dl>
  <dt>えるしつているか</dt>
  <dd>りんごしかたべない</dt>
</dl>
<dl>
  <dt>死神は</dt>
  <dd>手が赤い</dt>
</dl>
```

でも一つのdlタグの中でdtとddを複数個作りたい時ありますよね。
むしろそっちが大多数かなと。

こうします。

```vuejs

<template>
  <dl>
    <template v-for="item in items">
      <dt>{{ item.name }}</dt>
      <dd>{{ item.description }}</dt>
    </template>
  </dl>
</template>

↓

<dl>
  <dt>えるしつているか</dt>
  <dd>りんごしかたべない</dt>
  <dt>死神は</dt>
  <dd>手が赤い</dt>
</dl>
```

templateタグの中でtemplateタグを使えることを知りませんでした。
homebrewでghostscriptがlinkできない時の対処法

#エラー内容
`brew doctor`をしたらこういうのが出た。

```
~
❯ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  ghostscript
```

なので`brew link ghostscript`したら怒られた。(overwriteでもダメだった。)

```
~
❯ brew link ghostscript
Linking /usr/local/Cellar/ghostscript/9.52...
Error: Could not symlink share/doc/ghostscript/9.52
/usr/local/share/doc/ghostscript is not writable.
```

#対処法

以下を入力

```zsh

sudo chown -R 'whoami' /usr/local/share/ghostscript
```
`'whoami'`は自分のユーザ名を入れる。
わからなければ`whoami`コマンドで確認できる。

その後、ghostscriptのリンクをoverwriteすれば解決する。

```zsh
~
❯ brew link --overwrite ghostscript
Linking /usr/local/Cellar/ghostscript/9.52... 59 symlinks created

~
❯ brew doctor
Your system is ready to brew.
```
コロナ中、約2週間（16日）でAWS認定クラウドプラクティショナーを受けてみた。

##はじめに
はじめまして。
私はIT企業に2020年の4月から勤めています。4月から8月までの研修が昨今のコロナウイルスの影響でずーーっと在宅なので、何か資格を取ってみようということで、勤め先の企業でも使用実績があり、かつこれからの時代で持っていて損はないだろうと思い、AWSの資格を受けてみようと思いました。
##パーソナル情報について
持っている資格
・基本情報技術者（ボーダーラインぎりぎりで受かった（笑））
出身大学
・非情報系
・卒業研究でPythonを少しいじった。
使用したことがある言語
・C      （初心者）
・Python （初心者）
・COBOL  （超初心者）

ってことで、「The 新卒エンジニア」って感じ
（エンジニアといっていいのか？笑 -> 言わせてください！！）
ぐらいの実力です。（笑）クラウドに関しては、無知識。

##まずやったこと
<b>情報収集</b>
たぶん一番大事です。
自分の実力に合った資格を受けることで、お金も無駄にならず、受かると自身がついて勉強意欲がわきます。
これは、基本情報を受けて、受かった時に思いました。

今回は、「クラウド」、「AWS」ともに初めて扱う話題だったので、AWSのなかでも一番ベーシックな試験である「<b>AWSクラウドプラクティショナー</b>」を選択しました。

##使った教材
「AWS認定資格試験テキスト　AWS認定クラウドプラクティショナー」
「Udemy教材」
「ホワイトペーパー」
「AWSが提供しているオンライン授業」

##１日目～４日目
ひたすら教科書を読み、問題を解く！！

ここで大事なのはとりあえずわからない言葉があったら調べること。
わかったふりをして、次に進むことも大事だとは思います。しかし、内容によっては意味が分からなければ、その後の内容も全くわからいことにも繋がります。そのため、つまったところは調べる癖をつけた方がいいと思います！
例：「ストレージとデータベース、何が違う？？」
　  「リージョン、アベイラビリティゾーン、エッジロケーション」

##５日目～７日目
<b>一番悩む・・・</b>
なんとなーくは理解したけど、絶対うからない自信がある。
（自身のない資格試験あるある笑）
・もう１回教科書を読みなおして、総復習
・とりあえず問題を解いてみる
・ホワイトペーパー読む
の３つに絞り、考えます。

んーーーーーーーーーーーー、わからん！！！

よし、とりあえず問題解いてみよう
ってことで問題解きました。
Udemyの問題（模擬試験問題集（7回分455問））を最初の２回分解いてみました。




結果は、、、、56％と48％




絶対受からない（笑）
この試験問題から何がわかったかというと、とりあえずAWSの全体像がつかめていない。誰のための、どんなメリットがあるのか、が全くつかめていない、ということである。

##７日目～９日目
このままではまずいということで、本家本元のAWSさんに助けを求める。
AWSのオンライン講座を受けてみました。

受けてみた感想
ー＞「すごくわかりやすい。もっと早く受ければよかった．．．」

英語の説明ではあるが、和訳が不自然ではなく、とても分かりやすかったです。
特に、IAMの説明に関しては、わかっていない人はぜひ見た方がいいと思います。（全部で6時間近くあるので、試験直前の人は分からない分野だけでもいいと思います。）

##１０日目～１２日目
よし、問題を解きまくる、ということでUdemyの問題を3回分解きました（応用問題）。応用問題だけあって、全て合格点とはいきませんでしたが、分かる内容は増えてきました。
また、わからない問題についてはしっかりと復習し、毎回毎回知識をインプットしていきました。

##１３日目～１５日目
問題の解きなおしをしました。
言うことは全くなく、只々たくさんの問題を解きなおしまくりました。
もう試験本番も近いので、頭に詰め込むだけ詰め込み、最後の方は85％程度とれるようになってきました。

##試験当日
試験の結果は、、、<b>合格しました</b>。
スコアは824で良いのか悪いのか分からないけど、受かってよかった！！

試験を受けた感想は、「問題が難しい気がする．．．」

恥ずかしながら、受けている内も受け終わった後も、落ちた気しかしませんでした。でも、分かる知識から回答を絞っていけばどうにかなると思います。
また、ダミー問題のようなものもあるようなので、全く分からない問題があったとしてもビビらないことが重要だと思います。

##おわりに
今回AWSの資格を受けてみて思ったことは、実際に扱っていないと難しいということです。他の人の合格体験記を見てみると、「業務で使ったことがある」とか「いままで、SEの仕事をしてきた」など経験者の方が多く見受けられました。AWSは無料枠があるそうなので、実際に使いながら学ぶとより早く受かると思います。

私は今回、「テレワーク中」ということもあり、膨大な勉強量を確保できました。しかし、これから勉強時間は確保しづらくなってしまうので、コツコツ次の資格の勉強をしていきたいと思います。
最後に行ったことを簡単にまとめたいと思います。
１．クラウド、AWSの知識をインプット
２．問題解答
３．授業で再インプット
４．問題解答（解きなおし）

##まとめ
以上です。いかがだったでしょうか？改善点など多々あると思いますので、ご指摘よろしくお願いいたします。
また、Qiita初心者でもあるので、見やすいスライドのつくり方などあれば教えてください。
Bリーグの得失点をヒートマップで可視化

# 目的
Bリーグの試合結果から得失点のヒートマップを作成します

<img width="600" alt="heatmap" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e19c63b4-b610-078c-469e-150936326ef6.png">


# 実装
## データ取得
こちらのサイトからBリーグの試合結果を取得します
https://www.bleague.jp/schedule/?s=1&tab=1&year=2019&event=2&club=&setuFrom=1

取得はPythonのSeleniumを使用します
取得結果はpandas.DataFrameにまとめます

## 結果
<img width="500" alt="データ取得DF" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/2596a72f-9d07-f6dc-4423-72c05f671081.png">


## 整形
### 得点頒布のラベル付け
バスケはサッカーや野球と比較すると得点の幅が広いため、10点区切りの頒布表を作成します

こちらの記事を参考に得点の階級カラムを追加します
https://qiita.com/kshigeru/items/bfa8c11d1e6487c791d3

```python:
labels = [ "{0} - {1}".format(i, i + 9) for i in range(40, 200, 10) ]
df['ホームスコア頒布'] = pd.cut(df['ホームスコア'], np.arange(40, 201, 10), labels=labels)
df['アウェイスコア頒布'] = pd.cut(df['アウェイスコア'], np.arange(40, 201, 10), labels=labels)
```

40〜200点までを10点区切りでラベル付けを行います
範囲外のものにはNaNがセットされます

#### 結果
<img width="700" alt="得点頒布のラベル付けDF" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/9a0c8a32-3a9c-c481-4d2b-46ffc4b921bc.png">


### ホーム/アウェイごとにグルーピング
ホームの戦績とアウェイの戦績は差が出ることが予想できるので、
ホーム戦のヒートマップ、アウェイ戦のヒートマップ、全戦のヒートマップを作成します

```python:
for team in teamList:
    teamHomeDf = df.query('ホーム == @team')
    teamAweyDf = df.query('アウェイ == @team')
    teamDf = pd.concat([teamHomeDf, teamAweyDf])
```
teamListには全チームのチーム名が格納されています

#### 結果
<img width="700" alt="グルーピングDF" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/10a36ee1-e490-a12b-ee8b-5b75e49c3d8c.png">

### ヒートマップ用のデータ作成
ヒートマップ作成のためにデータを図のように整形します
<img width="700" alt="ヒートマップ用のデータ作成DF" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/33253674-7fff-6dc5-8f8a-e488e9360f9a.png">

```python:
distributionDf = teamHomeDf.groupby(['ホームスコア頒布', 'アウェイスコア頒布'])
distributionDf = distributionDf.size().unstack()
distributionDf = distributionDf.fillna(0)

cols = distributionDf.columns
indexs = distributionDf.index

for index in indexs:
	for col in cols:
		allDf.at[index, col] = round(distributionDf.at[index, col] / total, 2)

plt.figure(figsize=(8, 8))
sns.heatmap(allDf, annot = True, cmap = color, vmin = 0, square = True)
if not os.path.exists(path):
	os.makedirs(path)
plt.savefig(path + '/' + fileNm)
plt.close('all')
```

allDfには図のようなデータをセットしておきます
<img width="700" alt="allDf" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/11c8d6a0-14c2-012a-7c25-1533e0cbb805.png">

## 出力
整形したデータをもとにヒートマップを出力します
ヒートマップについてはこちら
https://note.nkmk.me/python-seaborn-heatmap/
https://matplotlib.org/tutorials/colors/colormaps.html

```python:
plt.figure(figsize=(8, 8))
sns.heatmap(allDf, annot = True, cmap = 'hot', vmin = 0, square = True)
if not os.path.exists(path):
	os.makedirs(path)
plt.savefig(path + '/' + fileNm)
plt.close('all')
```

### 出力されたヒートマップ
<img width="700" alt="allDf" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/a285e0d0-4173-076a-b326-b4913373b59e.png">
Vue Router利用のための最低限の実装

Vue Routerをとりあえず導入して、最低限の動きを見るまでの手順メモです。

Vue Routerはシンプルに使うことができて大変便利ですが、
本当はもっと複雑な設定もできる奥深いプラグインみたいです。

##Vue Routerとは
- Vue.jsの公式プラグイン
- SPAを構築するためのルーティングライブラリ

クライアントの履歴管理を含めたページ遷移（＝ルーティング管理）やデータ取得・描画の機能を担ってくれます。
（何を言っているのかよくわかっていません）

##Vue Router 導入
既存のプロジェクトにインストールします。

```
npm install vue-router
```

※ 新規プロジェクトの場合、vue createの際にvue-routerも併せて導入できるようです。


##Vue Routerの設定
srcフォルダ配下に「router.js」という新規JSファイルを作成し、Vue Routerの設定を書いていきます。
main.jsに書いても問題ないですが、なるべく疎にしておきます。

```javascript:router.js
//import
import Vue from 'vue';
import router from 'vue-router';

//1.component読み込み
import top from "./components/top"
import end from "./components/end"

//vue-routerをインストール
Vue.use(router);

//2.routerの設定とインスタンス生成
export default new router({
  routes:[
    {
      path: "/", //トップページ
      component:top
      },
      
      {
      path: "/end", //終点ページ
      component:end
      }  
  ]
});
```

####1.component読み込み
routerで表示を制御したいコンポーネントをimportしておきます。
参考までに、topとendの中身はこんな感じです。

```vuejs:top.vue
<template>
  <div id="app">
    トップ
  </div>
</template>
```

```vuejs:end.vue
<template>
  <div id="app">
    終点
  </div>
</template>
```

####2.routerの設定とインスタンス生成
他にも様々な設定が可能ですが、今回はroutesのみ設定します。
ここでURLとコンポーネントの組み合わせを定義できます。

今回の例だと、URLが
"~xxx/"のときはtopコンポーネントが描画され、
"~xxx/end"のときはendコンポーネントが描画されます。



####main.jsで読み込む
上記で作成したrouter.jsをmain.jsで読み込みます。

```javascript:main.js
import Vue from 'vue'
import App from './App.vue'
import router from "./router";

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
```


以上でRouterの設定は完了です。


##親コンポーネント側の設定
あとはこれを受けるための要素を親コンポーネント側で用意します。

今回は「App.vue」の特定の部分にtopコンポーネントとendコンポーネントを出し分けしたいので、
App.vueの中に`router-view`要素を書いておきます

以下の`<router-view></router-view>`の部分に、routesで設定したコンポーネントが描画されます。


```vuejs:App.vue
<template>
  <div id="app">

    <router-link to="/">トップページ</router-link><br>
    <router-link to="/end">終点ページ</router-link>
    <!--↑Routerのリンク（ページ遷移）を定義-->

    <router-view></router-view>
    <!--↑ここにRouterで設定したコンポーネントが描画される -->

  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>
```

`router-view`だけだとアドレスバー直打ちで遷移する羽目になるので、
`<router-link to="xxx">`でリンクを表示して、ページ遷移できるようにしています。


##動かす
localhostで動かしてみます。

#####初期表示
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/e65242df-d7d4-276d-b3f2-e05b349d37d6.png" width=50%>

######「終点ページ」押下
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/4a6713e3-bb29-9812-ac76-476167850c1a.png" width=50%>

######「終点ページ」押下後、「トップページ」押下
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/056edabd-ece4-9e87-78cf-48bd92cc2a8c.png" width=50%>


※routerの設定でmodeをhistoryにすると、URLの#が消えていい感じになるようです。

##参考

- [[Vue.js] vue-routerのhashモードとhistoryモードの違いをざっくり理解する](https://qiita.com/kozzzz/items/af9ad63fa70d4724cc2a)
-  [【Vue.js】vue-routerの基礎をサンプルを用いて解説]
(https://b1tblog.com/2019/10/03/vue-router/)
-  『Vue.js入門 基礎から実践アプリケーション開発まで』/技術評論社
InvalidSmsRoleTrustRelationshipException

すぐにたどり着く解決策がないので、ユーザープール作り直しが吉。

[[document Page] TInvalidSmsRoleTrustRelationshipException](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CognitoIdentityProvider/TInvalidSmsRoleTrustRelationshipException.html)
Raspberry PiのImage Writerで他のOSの起動ディスクを作成する

###Raspberry PiのImage Writerで他のOSの起動ディスクを作成する

Ubunch.isoを使って、USBメモリを起動ディスクを作ります。

[Imager Wirter](https://www.raspberrypi.org/downloads/)をダウンロードする
<img width="453" alt="スクリーンショット 2020-07-02 21.13.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/4d296b9a-c8c2-7942-63da-32bef46c7973.png">

[Ubunch日本語版](http://ubuntulinux.jp/download/ja-remix)をダウンロードする

**ダウンロードしたiSOをZipに変換すること**
####Image Writerを起動
<img width="370" alt="スクリーンショット 2020-07-02 21.24.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/e20f5f0c-b008-d7a7-8a39-c95f94b840be.png">

<img width="374" alt="スクリーンショット 2020-07-02 21.18.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671913/a3f885f4-9dcb-ba64-3f24-a458a550ece3.png">

USE Customを選択する。

Zipに変換したISOを選択する。

間違えてISOを読むこんで書き込むを押すと、うまくいかがずUSBメモリがマウントできなくなります。
Image Wirterの中にあるEraseを選択すると元に戻ります。

SDカードを選択しWriteボタンを押す。

以上

JetsonをOSをセットアップする時も使うことができます
PiotroskiのF-Scoreとは

#1 この記事は？

株式投資の銘柄スクリーニングを行うときの有名な指標として[Joel GreenblattのMagic formula](https://qiita.com/NT1123/items/d1b99beb6d61d58d264e)がありますが、この記事では別の銘柄スクリーニング手法であるPiotroskiのF-Scoreを紹介したと思います。


#2 PiotroskiのF-Scoreとは

下記の9個の基準のうち、対象銘柄がその基準を満たせば+1点得点を加算していきます。

#2-1 Profitability Criteria
基準に合致していれば得点を1点、合致していなければ得点を0点とする。

| 番号 | 基準 |  得点 |
|:-----------|:------------| :------------| 
| 1 | 過去1年度のリターンがプラスになっていること | 0 or 1 | 
| 2 | 過去1年度の営業キャッシュフロー(operating cash flow)がプラスになっていること |0 or 1 |      
| 3  | 前年度に対し今年度のROA(総資産利益率)が上昇していること |0 or 1 |   
| 4  |  今年度について、 営業キャッシュフロー/総資産 > ROA  であること |0 or 1 |  
|    |  得点小計1 |0 ～ 4 |  

#2-2 Leverage, Kiquidity and Source of Funds Criteria

| 番号 | 基準 |  得点 |
|:-----------|:------------| :------------| 
| 5 | 前年度に対し今年度の長期借入金が減っていること | 0 or 1 | 
| 6 | 前年度に対し今年度の流動比率(*1)が上昇していること |0 or 1 |      
| 7  | 前年度に新規株式発行を行っていないこと |0 or 1 |   
|    |  得点小計2 |0 ～ 4 |  

(*1)流動比率(=流動資産/流動負債)は、1年以内に現金化できる資産が、1年以内に返済すべき負債をどれだけ上回っているかを表す指標

#2-3 Operating Efficiency Criteria

| 番号 | 基準 |  得点 |
|:-----------|:------------| :------------| 
| 8 | 前年度に対し本年度の売上総利益(gross margin)が上昇していること | 0 or 1 | 
| 9 | 前年度に対し今年度の資本回転率(asset turnover ratio)が上昇していること |0 or 1 |      
|    |  得点小計3 |0 ～ 2 |  

売上総利益(gross margin) = 売上高 - 売上原価
資本回転率(asset turnover ratio) = 売上高 / 総資本


#2-4 F-Score

<b>F-Scoreは上記記載の9項目の得点(=得点小計1 + 得点小計2 + 得点小計3)のことです。</b>
F-Scoreが8点以上の銘柄を投資対象とし、半年に1回か1年に1回ほどF-Scoreの再計算を行います。
F-Scoreの考え方は、小型株や中型株の選定に適していると一般的に言われます。


#3 Coming Soon
日本株を対象にして、F-Score戦略をとるとどの程度Returnを出せるのか？ Pythonでcodingを行い検証してみたいです。
hamlでYouTube動画をDBから呼び出して埋め込み表示させてみた

##自作アプリでYouTubeの動画を埋め込み表示させてみた時に見付けた方法

自作アプリの作成でお気に入りの動画を一旦DBに保存して、呼び出す際に埋め込み表示させたかったので、色々模索したやり方を紹介します。

###一般的な埋め込みの方法
好きなYouTube動画の共有ってところを選ぶ

<img width="462" alt="スクリーンショット 2020-07-12 16.16.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/521b5946-3034-ea70-4981-bfdfd96da87e.png">

さらにそこから埋め込みってやつを選ぶ
<img width="549" alt="スクリーンショット 2020-07-12 16.16.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/79123162-f9b7-10a0-4906-d552a47080ad.png">

動画の埋め込み用のURLが出るので、コピーをクリックする
<img width="463" alt="スクリーンショット 2020-07-12 16.16.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/6060b0b0-e59f-0147-cd32-064b8b381b58.png">

これをHTML(haml)に直接貼り付ければ完成

出来上がりがこんな感じ
<img width="709" alt="スクリーンショット 2020-07-12 16.21.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/48c54801-5273-7380-500f-4dd482c7ba82.png">



ただ、これでDBに投稿して、hamlファイルから呼び出そうとすると文字列で出てしまったので、それを解消する方法です。

##実際に行ったやり方
```
%iframe#player{frameborder: "0", height:"390", src: (movie.url), type: "text/html", width: "640"}
※今回はMovieモデルと言うのを作って、カラム名をurlにしてます
```
簡単に言うと、
・外枠の部分はhamlファイルにしておく（サイズ等はお好みで変えられるはずです）
・DBにはURL部分のみ保存→呼び出す記述にしてます
・タイトルや内容なども別のカラムで保存

こうする事で、DBに投稿→呼び出しの際も埋め込み表示に出来ました。

###実際の画像（まだ開発中ですが）
<img width="662" alt="スクリーンショット 2020-07-12 16.36.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/024aea79-ff33-d1de-241d-ee582851061d.png">
↑無事に全部投稿機能で実装が出来ました（パチパチ）

###１つ注意ポイント

私が使ったURLですが、この青下線の部分です（ダブルクォーテーションは要らないです）
<img width="417" alt="スクリーンショット 2020-07-12 16.38.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/b0b37bea-1d28-e015-586f-e5ac41cd4661.png">



<img width="549" alt="スクリーンショット 2020-07-12 16.16.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629627/fe486be2-0bd4-f435-fdab-61ca70b6c356.png">

こっちの青下線のURLではダメでした。
おそらく埋め込み用のURLでは無いからだと思います。

以上、同じ様な実装をされたい方の参考になれば幸いです
2023年度最新版IaCツールの比較

# 概要
IaC(Infrastructure as Code)は今やITインフラを効率的に運用・保守する上で欠かせない考え方になっている。ここではIaC(Infrastructure as Code)を実現するためのIaCツールを比較してみる。

# IaCツール一覧
<table>
<tr>
  <th width="">ツール名</th>
  <th width="">対応リソース</th>
  <th width="">コード定義</th>
  <th width="">特徴</th>
</tr>
<tr>
  <td><a href="https://www.terraform.io">Terraform</a>
  </td>
  <td>・クラウドプロバイダー(AWS,Azure,GCP,OracleCloud,Tencent Cloud,Alibaba Cloud,etc...)<br>・オンプレ用ソフトウェア(VMWare,Nutanix,etc...)<br>・ネットワーク機器(CISCO,F5,etc...)<br>・SaaS(GitHub,NewRelic,etc...)</td>
  <td>HCL</td>
　<td>・複数のクラウド<br>プラットフォーム対応<br>・各クラウドサービス<br>が提供しているwebAPIで<br>操作できる範囲のみ<br>が管理可能</td>
</tr>
<tr>
  <td><a href="https://www.pulumi.com/product/">Pulumi</a>
  </td>
  <td>・クラウドプロバイダー(AWS,Azure,GCP,OracleCloud,Tencent Cloud,Alibaba Cloud,etc...)</td>
  <td>TypeScript<br>JavaScript<br>Python<br>Go<br>.NET<br>Java<br> YAML</td>
　<td>・複数のクラウド<br>プラットフォーム対応<br>・各クラウドサービス<br>が提供しているwebAPIで<br>操作できる範囲のみ<br>が管理可能</td>
</tr>
<tr>
  <td><a href="https://aws.amazon.com/jp/cloudformation/">AWS Cloud Formation</a></td>
  <td>AWSのリソースのみ</td>
  <td>YAML</td>
  <td></td>
</tr>
<tr>
  <td><a href="https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview">Azure ARMテンプレート</a> 
  </td>
  <td>Azureのリソースのみ</td>
  <td>JSON</td>
  <td></td>
</tr>
<tr>
  <td><a href="https://cloud.google.com/deployment-manager/docs/fundamentals?hl=ja">Deployment Manager</a> 
  </td>
  <td>GCPのリソースのみ</td>
  <td>YAML<br>JINJA2<br>Python</td>
  <td></td>
</tr>
<tr>
  <td><a href="https://www.serverless.com/framework/docs/providers/aws/guide/intro/">Serverless Framework</a> 
  </td>
  <td>・AWS<br>・Azure<br>・GCP<br>・TencentCloud<br>・AlibabaCloud</td>
  <td>YAML</td>
  <td>・複数のクラウドプラットフォーム対応<br>・サーバレスと呼ばれるサービス(Faasなど)のみ対応</td>
</tr>
<tr>
  <td><a href="https://aws.amazon.com/jp/serverless/sam/">SAM</a> 
  </td>
  <td>AWS</td>
  <td>YAML</td>
  <td>・AWSのみ対応<br>・サーバレス<br>と呼ばれるサービス(Faasなど)のみ対応</td>
</tr>
<tr>
  <td><a href="https://docs.ansible.com/ansible/latest/index.html">Ansible</a> 
  </td>
  <td>・サーバー(Linux、Windowsなど)の内部のソフトウェア<br>・クラウドプロバイダー(AWS,Azure,GCP,etc...)の一部リソース</td>
  <td>YAML</td>
  <td>オブジェクトストレージやIaaSなど<br>マネージドサービスも一部管理可能</td>
</tr>
<tr>
  <td><a href="https://docs.chef.io">Chef</a> 
  </td>
  <td>サーバー(Linux、Windowsなど)<br>の内部のソフトウェア</td>
  <td>Ruby-based DSL</td>
  <td></td>
</tr>
<tr>
  <td><a href="https://puppet.com/docs/">Puppet</a> 
  </td>
  <td>サーバー(Linux、Windowsなど)<br>の内部のソフトウェア</td>
  <td>Ruby-based DSL</td>
  <td></td>
</tr>
<tr>
  <td><a href="https://www.packer.io">Packer</a> 
  </td>
  <td>イメージファイル</td>
  <td>JSON<br>HCL</td>
  <td>プラットフォーム<br>に依存しない</td>
</tr>
</table>
laravel 認証機能のリダイレクト先変更

laravelの初期設定では、ログインやユーザ登録後のリダイレクト先は/homeとなっています。
これを変更するには、下記のコントローラーの記述を修正する必要があります。

・修正するコントローラー
RouteServiceProvider.php

・場所
プロジェクト名
-app
 -Providers
  -RouteServiceProvider.php

・修正する場所
24行目
```public const HOME = '/home';
```
↓

```public const HOME = '/';
```
QGroundControlをビルドする

基本的に

https://doc.qt.io/qt-5/android-getting-started.html

通りにビルドすればOKです。Qt初心者だったのでそこから。
Qtはオープンソース版を使っています。
MacOS上での想定です。

# まずは、ソースをクローン。

```console
$ git clone https://github.com/mavlink/qgroundcontrol.git --recursive
```

# Qtのアカウントを持っていない場合、先に、Qtのアカウントを作成

以下のCreateから作成。メールのVerificationが必要。

https://account.qt.io/

# Qtをダウンロード

Mac をダウンロード

http://www.qt.io/download-open-source

# インストール

次へを進めば良い。アカウントは先ほどのを利用。

軽微なはまりどころ。

- QGCは、Qt のバージョンが、5.12.6 しか対応していない（2020/07/12現在）ため、必ずそれを選ぶこと
  - 選択にでない場合、'Archive'のオプションをクリックして、'Filter'すると、出てくる。
- Qt Charts と、Android ARMv7 (to build Android)を忘れないように。

# ビルド、実行

1. Qt Creator で、qgroundcontrol.pro を開く
2. 左下のビルドボタンを押す
3. 緑色の実行ボタンを押す

# Custom build

QGCにはカスタムビルドがあります
https://dev.qgroundcontrol.com/en/custom_build/custom_build.html

以下に書かれているREADMEに沿ってビルドします
https://github.com/mavlink/qgroundcontrol/tree/master/custom-example

```console
$ cp -r custom-example custom
$ cd custom
$ python2 update.py # python 2.x 系でないとエラーが出ます
```

customには、gstreamerが使われているコードがはいっているので、gstreamerを入れます。
1.14.4しかテストしていないらしいので以下を入れます。（試しに、1.16.2を入れたらビルドエラーが出ました）

https://gstreamer.freedesktop.org/data/pkg/osx/1.14.4/gstreamer-1.0-devel-1.14.4-x86_64.pkg
https://gstreamer.freedesktop.org/data/pkg/osx/1.14.4/gstreamer-1.0-1.14.4-x86_64.pkg

README:
https://github.com/mavlink/qgroundcontrol/tree/master/src/VideoReceiver

あとは、Qt Creator を立ち上げ治して、ビルドすればOKです。
[Python]2進数 エイシング2020D

#[エイシング2020D](https://atcoder.jp/contests/aising2020/tasks/aising2020_d)

Xは非常に大きな値になるので、単純にシミュレートすることはできません。
ここで、Xのpopcountは高々Nであることから、Xをpopcountで割った値は必ずN未満となります。
また、Xiを反転させたとき、そのような整数のpopcountは(Xのpopcount±1)に等しいです。
したがって、まず1～Nまでのすべての数について、それらをpopcountで割ったあまりに置き換えて0になるまでの操作回数を求めておき、次に、Xi=1であるような各桁について、(Xのpopcount+1)で割ったあまりの総和と(Xのpopcount-1)で割ったあまりの総和を求めておくと、f(Xi)を、Xiが1であれば、(Xのpopcount-1)で割ったあまりの総和-2^iを(Xのpopcount-1)で割ったあまりを求め、これを(Xのpopcount-1)で割ることで、N未満の数を得ることができ、同様に、Xiが0であれば、(Xのpopcount+1)で割ったあまりの総和+2^iを(Xのpopcount+1)で割ったあまりを求め、これを(Xのpopcount+1)で割ることで、N未満の数を得ることができます。
以上より、各Xiについて、0になるまでに必要な操作回数をO(1)で判定できることが分かりました。

ここで、1～Nまでのすべての数について操作回数を求めるための計算量について2*10^5以下の数のpopcountは高々18、18以下の数のpopcountは高々4、4以下の数のpopcountは高々2、2以下の数のpopcountは高々1であり、最大でも5回の操作で0に到達することが分かります。
したがって、O(NlogN)により、1～Nまでのすべての数について操作回数を求めることができることがいえ、この問題をO(NlogN)で解けることが分かりました。
ただし、Xのpopcountが0または1のケースに注意してください。

```python:サンプルコード
n = int(input())
x = input()
 
# 元のpopcount
original_pop_count = x.count('1')
# 反転して-1count
one_pop_count = original_pop_count - 1
# 反転して+1count
zero_pop_count = original_pop_count + 1
 
# ±1それぞれにおける余り
if one_pop_count == 0:
  one_mod = 0
else:
  one_mod = int(x, 2) % one_pop_count
zero_mod = int(x, 2) % zero_pop_count
 
# f の前計算 
f = [0] * 220000
pop_count = [0] * 220000
for i in range(1, 220000):
    pop_count[i] = pop_count[i//2] + i % 2
    f[i] = f[i % pop_count[i]] + 1
 
# pow2 の前計算
one_pow2 = [1] * 220000
zero_pow2 = [1] * 220000
for i in range(1, 220000):
    if one_pop_count != 0:
        one_pow2[i] = one_pow2[i-1] * 2 % one_pop_count
    zero_pow2[i] = zero_pow2[i-1] * 2 % zero_pop_count
    
# n-1, n-2, ,, 0
for i in range(n-1, -1, -1):
    if x[n-1-i] == '1':
        if one_pop_count != 0:
            nxt = one_mod
            # - 2^i % 2
            nxt -= one_pow2[i]
            nxt %= one_pop_count
            print(f[nxt] + 1)
        else:
            print(0)
    if x[n-1-i] == '0':
        nxt = zero_mod
        nxt += zero_pow2[i]
        # + 2^i % 2
        nxt %= zero_pop_count
        print(f[nxt] + 1)
```
RubymineのSearchEverywhere（Shift2連続）を有効/無効にする方法

今回はSearchEverywhereを無効から有効に切り替えます。

1. `Cmd + Shift + A`で検索バーを表示、
そこで`Registry`と打ち込む

2. `Registry`を選択し、`ide.suppress.double.click.handler`のチェックを外す
3. Registryの修正終了後、Preferences > Keymapから`Search Everywhere`のショートカットキーを外す
4. BetterTouchToolsを使っており、RubymineのシーケンスにShift2連続を登録している場合はその設定を削除する

これでSearch EverywhereがShift2連続で使えるようになりました

参考
https://stackoverflow.com/questions/20542053/how-do-i-disable-the-search-everywhere-shortcut
https://youtrack.jetbrains.com/issue/IDEA-161094
Microsoft Common Data Service 重複チェックのキー設定ではまったこと

PowerAppsで物品管理ツールを作成しているときにCDSの重複チェック（キー設定）ではまったことをメモ書き程度ですが共有します。


そもそもCDSって方は，以下を一読することをお勧めします。
https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/data-platform-intro


##はまりどころ１　フィールド作成時のプライマリーキーはデフォルトでは重複チェックされない
データベースでは一意のデータとして登録したいフィールドがあります。基本的にそれがプライマリーフィールドとなり，重複時はエラーで登録できないと思います。
CDSは初期フィールドを作成するとプライマリーフィールドが設定されます（例えば物品管理であれば管理番号）。通常，重複するプライマリーフィールドの値を登録するとエラーが出るかと思いますが，**デフォルトのCDSでは重複して登録できます！（困ります）**
###理由
プライマリーフィールドはキーではないため，重複チェックはされない。
（エンティティを作成した際自動で作成されるフィールドが一意識別子のキーとなります。）
###対策
エンティティのキー設定画面から自分で作成したフィールドを設定（ここでは管理番号）することで，重複チェックされるキーとなります。

おすすめ参考サイトは以下です。
https://www.d3654.be/cds-entity-key-setting/

##はまりどころ２　正しくキー設定したのに動作テスト時に重複チェックしてくれない
はまりどころ1で設定したキーの動作テストをしたところ，キーで設定した値で重複チェックがされず，重複登録できてしまう！

###理由
キー設定後は適用されるまでしばらく時間がかかる（設定画面でコミットを押したのに・・・）


###対策
しばらく待ってからテストをすると正しく動作します。（私は15分ほど待った後に反映されていました。）

他にもはまったことが増えたら追記します。皆さんもよければコメントで教えてください。
【Laravel】バリデーションの作成

バリデーションを簡単に安全にかけるための方法メモ。

#フォームリクエスト
バリデーション専用のフォルダを作って処理をさせる。
書きコマンドを打ってrequestフォルダとファイルを作成。

```
php artisan make:request StoreContactForm
```
ファイル名は任意。

##Controller
controller内にフォルダとファイルが出来てるはずなので確認。

```Controller/Requests/StoreContactForm.php
public function authorize()
    {
        return true;  //falseからtrueに変更
    }
.
.
.

public function rules()
    {
        return [
            //ここにバリデーションのルールを書く
            'name' => 'required|string|max:20',
            'title' => 'required|string|max:50',
            'email' => 'required|email|unique:users|max:255',
            'gender' => 'required',
            'contact' => 'required|accepted',
        ];
    }
```
ルールは公式参照。
【https://readouble.com/laravel/7.x/ja/validation.html#rule-url】


作成したデータを送る際に表示させたいので、storeメソッドに適応してあげる。

```ContactFormController.php
//バリデーションのファイルを呼び出し
use App\Service\CheckFormData;

//第一引数をRequestからバリデーションクラス名にする
public function store(StoreContactForm $request)
    {
        $contact = new ContactForm;
        $contact->name = $request->input('name');
        $contact->email = $request->input('email');
        $contact->title = $request->input('title');
        $contact->gender = $request->input('gender');
        $contact->contact = $request->input('contact');

        $contact->save();

        return redirect('contacts/index');
    }
```

##View
エラーメッセージを表示します。

```create.blade.php
@if($errors->any())
    <ul>
        @foreach($errors->all() as $error)
            <li class="list-group-item list-group-item-danger">{{$error}}</li>                    @endforeach
    </ul>
@endif
```
$errorsはViewファイルに与えられてる変数らしいです。
こいつを回してあげて該当するもののみ表示します。

#まとめ
バリデーションは最初ややこしい印象があるのですが、大事な部分でもあるので徐々に慣れていきたいです。
Rubyで値オブジェクトの親クラスを作ってみた

ドメイン駆動設計にかぶれて値オブジェクトを作ってみたんですが、結構面倒くさかったんで、親クラスを作ってみました。
（あくまでも個人開発で開発スピードを早めるために作っていますので、製品でそのまま使えるかは保証しません）

# 値オブジェクトとは
https://qiita.com/kichion/items/151c6747f2f1a14305cc
に書いてあるような特徴を持つオブジェクトです。

Rubyで書いてみると↓みたいなオブジェクトになります。この例はユーザの名前を入れる値オブジェクトです。
（正統な定義をするなら`equal`的なものを定義したほうが良いんでしょうが、あまり使わないので今は定義していません。）

```domain/user/name.rb
module Domain::User
  class Name
    attr_reader :first_name, :last_name

    def initialize(first_name, last_name)
      @first_name = first_name
      @last_name = last_name
    end

    def update_first_name(first_name)
      self.new(first_name, @last_name)
    end

    def update_last_name(last_name)
      self.new(@first_name, last_name)
    end

    def fullname
      "#{@last_name} #{@first_name}"
    end
  end
end
```

使うのには便利なんですが、いちいちこのお決まりのフィールドのゲッター、セッターの何行かを書くのが面倒くさいんですよね。
なので、これらを勝手に定義してくれる親クラスを作ってみました。

# 値オブジェクトの親クラス
```domain/base/value_object.rb
module Domain::Base
  class ValueObject
    attr_reader :changed_fields

    FIELDS = []

    class << self
      # 次のようなメソッドを定義 new_date = date.update_month(11)
      def attr_updater(*attrs)
        attrs.map(&:to_sym).each do |defining_attr|

          define_method("update_#{defining_attr}") do |defining_value|
            values = attrs.map { |attribute| attribute == defining_attr ? defining_value : instance_variable_get("@#{attribute}")}
            changed_fields = @changed_fields.include?(defining_attr) ? @changed_fields : @changed_fields + [defining_attr]
            self.class.new(*values, changed_fields: changed_fields)
          end

        end
      end
    end

    # NOTE
    # - 基本的に値オブジェクト側ではFIELDSとアクセサだけ定義させる
    # - initializeは親のこのクラスの物を使わせる。
    # - initializeの独自実装をするのは可能。しかしその場合、値オブジェクト側からこの親クラスのinitializeを使うだけで、値オブジェクト使用者にはこのクラスのinitializeを直接は使わせない
    #   - changed_fieldsなどの変更は内部でのみ行う
    #   - 値オブジェクト自体の初期化引数はできるだけ単純になるようにケア
    def initialize(*field_values, fields: self.class::FIELDS, changed_fields: [])
      define_fields(fields, field_values)
      @changed_fields = changed_fields
    end

    private

    def define_fields(fields, field_values)
      fields.zip(field_values).each do |field, field_value|
        instance_variable_set("@#{field}", field_value)
      end
    end
  end
end
```

これを使うと以下の書き方で、元々のメソッドが提供できます。

```domain/user/name.rb
module Domain::User
  class Name < ::Domain::Base::ValueObject
    FIELDS = %I(first_name last_name)
    attr_reader *FIELDS
    attr_updater*FIELDS

    def fullname
      "#{@last_name} #{@first_name}"
    end
  end
end
```

備考

- メタプログラミングの黒魔術を使いすぎると、追えなくなる（grepでも目視でも）ので、複雑なメソッドは定義していません
- `attr_reader`とかも自動化できるけど、`attr_reader`とかがあると読み手に負荷をかけないので、基本のRubyの書き方ができるところは踏襲しています。
- この書き方だと、`initialize`時にFILEDどおりの順番で引数を入れることを暗黙に示していており、それを明示していないんですがが、自分ではその問題をわかっているので、今の所運用で回避しています。
- `changed_fields`はDB更新時に更新があったフィールドだけ更新したかったので好みで作りました。
- イミュータブルなオブジェクトで作ることは色々メリットがあるような気がしますが、一般ピーポープログラマとしてはまだそんなメリットを享受できず、YAGNIな感じがしています。並行処理とかを行うわけではないので。
Tensorflow・kerasでCNNを構築して画像分類してみる（概要編）

下記の記事で、順伝播型ニューラルネットワークによる手書き画像を扱って予測を行いました。

[Tensorfrowで画像分類など学習してみる（手書き文字認識編１）](https://qiita.com/kazuboy/items/b898b380fca716cf35b4)
[Tensorfrowで画像分類など学習してみる（手書き文字認識編２）](https://qiita.com/kazuboy/items/c762abb6863f27dd0461)
[Tensorfrowで画像分類など学習してみる（手書き文字認識編３）](https://qiita.com/kazuboy/items/0a60e42c70c08f33c1d3)


この記事では畳み込みニューラルネットワークCNN（Convolutional Neural Network）、を使って画像の分類をしてみます。CNNは1980年台に考え方があり、1990年台にLeNetというモデルが考えられました。

##CNNモデルの背景
順伝播型ニューラルネットワークでも画像を取り扱うことはできましたが、処理の中で2次元の行列データを1次元のデータに変換して扱っていましたがこの中で画像の持つ情報が損なわれるということがあり考えられたのがCNNです。

順伝播型ニューラルネットワークの記事では、MNISTの手書き文字セットを扱いましたが、28×28のモノクロ画像でした。この画像を784の一次元の行列に変換して処理しました。具体的には

```python:code
x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784) 

#変換後の構造を確認する。
print('x_train.shape:', x_train.shape)
print('x_test.shape:', x_test.shape)
```
というコードを書いて変換していました。

画像自体は2次元で表現された場合、被写体の縦・横など位置情報も持っているはずですが、1次元にするとそれが失われるということで、2次元で扱うことができればそれらの情報も保持できます（もっと言えばカラー画像であれば色情報もあるので3次元にもなります）

##CNNの構成（概略）
CNNの概要を記載します。C様々途中に活性化関数、最適化手法を組み合わせるなど進化していますが、ここでは大まかな概要をまずはつかみたいと思います。CNNは畳み込み層とプーリング層を重ね、最終的に全結合層と出力層を重ねていく手法です。

![CNN.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659138/416c5f89-332f-84f3-1522-a15102c0ac7b.png)


###畳み込み層
畳み込み層は画像に対してカーネル（フィルタ）を重ね計算し画像の特徴量を得るためのものです。このフィルタを用いて実際の画像から特徴マップを作ります。

![Convolusion.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659138/02e92a60-2f79-81d7-5241-5f30e07da65c.png)

CNNではフィルタの値により特徴マップとして得られる値が異なるので、フィルタの値が重みとなり最適化するパラメーターともなります。


###プーリング層
特徴マップに対して決められた計算を行い小さくする処理です。この処理をダウンサンプリングまたは単にサンプリングといいます。プーリング層での計算は主に2種類があり、最大値をとるMAXプーリングと平均値をとるAvgプーリングがあります。プーリング層では計算のみを行い学習するべきパラメーターはありません。
![pooling.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659138/51ac2466-9331-fe02-fcf6-d0ab2afaca90.png)


###全結合層・出力層
全結合層では畳み込み層とプーリング層で得られた結果の多次元配列を1次元の状態に戻し、最終的に分類ができる形にします。この処理は順伝播型ニューラルネットワークでも最終的に1次元にしsoftmax関数で多クラスに分類した処理と同義のものです。

## まとめ
概要をつかみどんな層が必要かを見てきました。次回以降はそれぞれの層をTensorFlowとkerasを使って実装していきたいと思います。
[Docker Compose] Webアプリの開発環境をDockerで構築した話（PHP、Apache、MySQL）

自社サービスのメンテナをしています。

## 悩み

* PHP、Apache、MySQLのバージョン上げなアカン
* でも、旧バージョンもメンテし続けなアカン
* ローカルPCでの開発環境がゴチャついてきた
* 顧客ごとにカスタマイズされてて、顧客環境ごとにソース自体が微妙に違ってる・・・
* できたらリモートサーバなしで、ローカルPCだけで完結させたい

---

## Webサーバのディレクトリ構造はこんな感じ

```
/var/apps/
|-- abc # 株式会社abcさま用アプリ
|   |-- abc.php
|   |-- abc.png
|   `-- ・・・
|-- def # 株式会社defさま用アプリ
|   |-- def.php
|   |-- def.png
|   `-- ・・・
`-- ghi # 株式会社ghiさま用アプリ
    |-- ghi.php
    |-- ghi.png
    `-- ・・・
```

---

### Dockerでなんとかしたいのですが・・・
* アプリのバージョンで、PHPやMySQLのバージョンが異なる
    * アプリのバージョンごとにそれぞれの環境が必要
* 顧客ごとにDBのインスタンスが異なる
    * MySQLの公式Dockerイメージって、初回起動のときにしかDB初期化スクリプト走らない
    * なので、初回起動以降は、いちいちDBコンテナに入ってDB作ったりテーブル作ったりラジバンダリ
* 開発環境なので、デバッグを容易にできるようにしたい

---

### Docker Composeでなんとかする
* アプリが依存するPHP、Apache、MySQLのバージョンを切り替えられるようにする
* 各アプリが使用するMySQLのDBインスタンスの生成を手軽に行いたい
* Xdebugでデバッグしたい

---

### できあがったものがこちらです
[appdock](https://github.com/atchy/appdock)

くわしくはREADMEをご参照くださいmm

---
プログラミング初学者がVBAを少し触ったので中身をバラバラに分解してみた。

# 1~10までのランダムな数値を被り無しでセルに入力する。

今回はVBAのみを使い処理を行う方法です。
VBとVBAは違うもののようです。
VBを引っ張ってこればRandomクラスを読み込みそれをセルに入力する方法もあるようです。

将来VBAを使うことがあることを信じて備忘録的な


#### 今回はこのコードを分解していきます。

```
Sub メソッド名（）
    Dim 変数1, 変数2 As データ型名
    Dim 変数3(1 To 10) As データ型名
    Randomize

    For 変数1 = 1 To 10

        Do
        変数2 = Int(Rnd() * 10 + 1)
        Loop Until 変数3(変数2) = 0

    Cells(変数1 + 1, 列) = 変数2
    変数3(変数2) = 1
    Next 変数1
End
```

## 解説
```
Sub メソッド名（）
```
メソッド名を定義

    Dim 変数1,  変数2 As データ型名

今回は下の方で変数に数字を格納する為Int型を指定する。指定しないとVariant型になる（Variant型はなんでも入るやつ）

    Dim 変数3(1 To 10) As データ型名
これで、1〜10の数値を格納する変数を作る。
数字の1〜10以外は入れれません。

    Randomize
次回実行時のRnd()のシード値の変更

    For 変数1 = 1 To 10
繰り返しをする処理を指定、
今回は変数1が1〜10になるまで繰り返す。

        Do  (小ループ開始文)

          変数2 = Int(Rnd() * 10 + 1)
Int()は関数で小数点以下を切り捨てるものですFix()を使ってもいいかもしれません。Int()が切り上げFix()で切り捨てと言った感じです。
変数2(1~10と0の内どれかの数値)

        Loop Until 変数3(変数2) = 0
Loop Until でループの終了条件を指定、この時変数3には1〜10の数値がランダムに格納されていく
変数3(2, 4, 3, 1, 7, 5, 6, 10, 8, 9)
次回大ループ実行時は終了条件=0となっている為小ループは実行されない。0が入ってないと終わる。


        Cells(変数1 + 1, 列) = 変数2
Cell()で入力するセルの位置を指定、
変数1の部分は行数の指定で1〜10の値が入るので繰り返しの度+1で１行ずつ下へ入力セルを移動させている処理で、
変数3の中身をセルに代入している。

        変数3(変数2) = 1
処理が終わった部分に1を代入する処理
変数3(1, 1, 1, 1, 7, 5, 6, 10, 8, 9)
↑変数3の中身(4回目まで処理が終わっている例)



    Next 変数1
次の処理は変数1

```
End
```
終わり。
### Tips.
---
データ型 String(文字列) Integer(数値) Date(日付) 等...


※VBAでは変数の宣言を強制することにより 変数名のミスによるエラーをわかるようにするオプションがある。オプションより設定可能


#### For のお決まり事
```
For 変数=初期値 To 最大値
    /繰り返し処理/
Next 変数
```

#### Rnd()
Rnd()：これを実行することで0以上1未満の数値を返す。( 0.0 ~ 0.9 )

Rnd() * 10　：これで、0以上10未満にすることができる。(  0 , 0.1 = 1 , 0.9 = 9 )

Int(Rnd() * 10) + 1　：+1することで、1以上10以下にすることができる。

#### Randomize

マクロを実行するたびSub 変数()~Endまでが実行されるためRndで繰り返しをする前にRandmizeを実行することで前実行した時に使用したシード値（乱数を発生させるための引数またはパラメータのようなもの）と違うものを使うようにするもの。
- [インストラクターのネタ帳(Randomizeステートメントとは？)](https://www.relief.jp/docs/013898.html)
- [Randomize ステートメント (VBA)](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/randomize-statement)