OmniAICreator/Qiita-1.07M huggingface dataset:
rails db:migrateエラーのStandardError: An error has occurred, all later migrations canceled:の解決法

#StandardError: An error has occurred, all later migrations canceled:エラーの解決法について
rails db:migrateしようとした際にでたエラーです。
エラーが発生したのでマイグレーションキャンセルしたよ！というエラーですね。

##ActiveRecord::StatementInvalid: Mysql2::Error: Table 'アプリ名_development.カラム名' doesn't exist: SHOW FULL FIELDS FROM `users`
エラーをみていくとこのような文がありました。
##原因
原因はマイグレーションファイルでした。

```作成期日_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :content
      t.references :user, foreign_key: true
      t.timestamps
    end
  end
end
```
referencesはuser_idという形でDBに反映されるのですが作ろうとしているuser_idはbigint型。
対して外部キーで参照したいusersテーブルのidがinteger型なので、型が合わずエラーになるようです。

なので、integer型にします。

```作成期日_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :content
      t.integer :user_id
      t.timestamps
    end
  end
end
```

これでマイグレーション通りました。

参考：　https://qiita.com/umeneri/items/b46c537661f612f7318b

最後までご覧いただきありがとうございました。
WindowsでのSSDの手動Trim

# Trimとは？
定義上は、TRIMはATAインターフェースのコマンドです。他のインターフェースではコマンドが異なり、オペレーティングシステムによっても名前が変わりますが、通常は同じ動作を「Trim」と呼びます。Trimは消去可能なデータをSSDに伝えます。名前が違っても、Trimはアクティブガベージコレクションとの併用によりSSDをクリーンアップする機能です。

[https://www.crucial.jp/articles/about-ssd/what-is-trim](https://www.crucial.jp/articles/about-ssd/what-is-trim)
[https://www.wdic.org/w/TECH/Trim](https://www.wdic.org/w/TECH/Trim)

## 簡単に言えば
Trimを行えばSSDがデータを書き込むときにそこが書き込めるかを確認する時間が短縮され
書き込みが早く終る＝体感速度が早くなる

あとSSDの寿命が伸びる？

## 手動での実行方法

Windowsに標準でインストールされている「ドライブのデフラグと最適化」を使っても良かったが
いまいち効果を実感できなかった。

GUIとCLIの差しかないと思いますが・・・

Cドライブの場合

```
C:\WINDOWS\system32>defrag c: /L
```

batファイルを作っておけばお手軽に実行できます。
テキストファイルに以下を記載して拡張子を.batに変更でOK

```
echo on/off
defrag c: /L
```


echo on/offは結果を見たければ不要

タスクスケジューラに登録すれば定期実行も可能
自宅環境(主にメモ)

当面の目標は10G対応

OM3の光ファイバーは購入済みなので使いたい！！！


RTX1210の使いみちを考え中
eo光とNURO光で使えれば・・・

![ネットワーク図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546146/5643f6f2-f276-c9d1-1101-dec54ae55ac8.png)
ep2c5t144ボード その2

#概要

ep2c5t144ボード、買ってみた。
pin調査してみた。

#結果


| pin      |       I/O    |
|-----------------:|:-------------------------|
| 3|	D2 LED	Low to Light|
| 7|	D4 LED	Low to Light|
| 9|	D5 LED	Low to Light|
|17|	50MHz clock input|	
|26|	Connected to Vcc 1.2V	|
|27|	Connected to GND	|
|73|	10uF capacitor to ground, 10K resistor to Vcc|
|80|	Connected to GND	|
|81|	Connected to Vcc 1.2V	|
|144|	Pushbutton, Push to ground, no external pullup |


以上。
古いマシーンに ssh 接続できない時の対策

Amazon Linux 2 や、CentOS 8 からは ssh 接続できても、Arch Linux や、Ubuntu 20.04、Alpine Linux から　ssh 接続できないマシーンがありました。

```text
$ ssh aaa@133.110.23.29
Unable to negotiate with 133.110.23.29 port 22: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
```

解決方法　.ssh/config を作成

```text:.ssh/config
HOST 133.110.23.29
KexAlgorithms +diffie-hellman-group1-sha1
Ciphers aes128-cbc
```

接続して OS の様子を見ると

```text
$ uname -a
Linux *** 2.4.20-46.7.legacy #1 Sat Mar 4 15:25:19 EST 2006 i686 unknown
$ cat /etc/redhat-release 
Red Hat Linux release 7.3 (Valhalla)
```
Amazon Linux AMI で、 imaps が Address already in use で起動しない

# 何気なく Amazon Linux に update があったので、 yum update で更新し、リブートした。
コマンドを叩いた後で、 snapshot を取らなかったことに気付いたが、まあ、問題は無かろうと思った。

リブートしたら、予想通り？ dovecot の imaps が起動しなくなった。
maillog を見ると、

```
dovecot: master: Error: service(imap-login): listen(*, 993) failed: Address already in use
```

とある。

はて？

```
netstat -an|fgrep 993
```

でも結果は空。

どういうこと？？？

視察の後、 [portreserve](https://serverfault.com/a/1017158) が悪さをしているという記述を見つける。

> because portreserve only does a bind() to the port, and doesn't do a listen() it won't show up in lsof or netstat.

つまり portreserve は bind だけ使ってそのポートを押えるから、 netstat -an には現れない、と。酷いね。

/etc/portreserve/dovecot を適宜コメント・アウトして解決。

けど何でこんなファイル足したの？

害にしかなってないじゃん？？
grepで検索した行以外を消さずに色付けする方法

## はじめに
今回はLinuxの**`grep`**コマンドで文字列に色を付ける時のテクニックをいくつかご紹介します！
・[検索した文字列に色を付ける](#検索した文字列に色を付ける)
・[検索した行以外を消さずに色を付ける](#検索した行以外を消さずに色を付ける)（全ての行を残して色付けする）
・[配色を変える](#配色を変える)

## 検索した文字列に色を付ける
`grep`コマンドで検索した文字列<font color=red>（今回は「**ABCDEF**」）</font>に色を付けるには、後ろに`--color`を付けます。
出力結果を`|`の右側に渡したい場合は、**`--color=always`**とします。

ハイライトされることで、<font color=green>**検索した文字列の場所が見やすくなります。**</font>
![grep --color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650537/257e2b61-25f2-9502-89d1-fb047a3ec192.png)


## 検索した行以外を消さずに色を付ける
`grep --color`は便利ですが、**`grep`で引っかかった行以外が消えてしまう**のが不便に感じる場面も多々あります。
（例えば<font color=green>**目的の文字列がデータ内のどこにあるかを知りたい**</font>ときなど）

そんな時には**`egrep --color "$|検索したい文字列"`**という書き方で解決します。

`grep -E --color "$|検索したい文字列"`や、`$`をなくして
`grep -E --color "|検索したい文字列"`としてもOKです。

`|`を使うときには`--color=always`とするのを忘れずに。

![grep --colo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650537/d605505e-371e-c8a5-9dec-d7e65636ddfc.png)

書き方に関していくつか補足をします。
>・grepの`""`の中で`|`を使う場合は、`egrep`か`grep -E`にする必要があります。`grep`のままだとうまく動いてくれません（`\|`とすれば動く）。<br>
・理屈としては最初の`$|`で全ての行が選択されています。それによって**全ての行が出力される**わけです。また色付けは本当はすべての行で行われていますが、`$|`では**選択される文字が何もない**ので、結果として**<font color=red>`|検索したい文字列`だけが色付けされた状態</font>で出力されます。**

<font color=Silver>（参照したサイトを載せたかったのですが、再度見つけることができませんでした・・・申し訳ないです🙇‍♂️）</font>

## 配色を変える
`grep --color`で色を付ける時に、<font color=red>**赤色**</font><font color=green>**以外の色も使いたい**</font>と思う場面もあると思います。

その場合には**`GREP_COLOR='カラーコード' grep --color "検索したい文字列"`**という書き方が有効です。

カラーコードを設定することで検索結果を<font color=green>**好きな文字色に変更**</font>できます。
使用できるカラーコードを下に載せました！

![grep --colo3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650537/0c05266e-44ec-e810-369f-d6ae96e75c8d.png)


|色|カラーコード|||
|:----|:----|:----|:----|
Black|       0;30|     Dark Gray   |  1;30
Blue |       0;34|     Light Blue   | 1;34
Green |      0;32|     Light Green   |1;32
Cyan   |     0;36|     Light Cyan |   1;36
Red     |    0;31|     <font color=red>**Light Red**   |  <font color=red>**1;31**
Purple   |   0;35|     Light Purple | 1;35
Brown     |  0;33|     Yellow        |1;33
Light Gray | 0;37|     White         |1;37

引用：[Bash Prompt HOWTO: ANSI エスケープシーケンス: 色とカーソル操作](http://archive.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html)

この章を書く上で、以下のサイトにお世話になりました。
>・[grepの色を変える  |  コマンドの達人](https://life-is-command.com/grep-color/)
・[grepで指定オプションを自動付加してくれる環境変数 &quot;GREP_OPTIONS&quot; - 元RX-7乗りの適当な日々](https://www.na3.jp/entry/20120129/p1) (：カラーコード一覧へのリンク)

## おまけ
本稿では紹介しませんが、`GREP_OPTIONS`というのを使うことで、例えば<font color=green>**`grep`と打っただけで`grep --color`をしてくれる**</font>といった設定もできるらしいです。
リンクを載せますので、興味ある方はぜひご覧ください。
>・[grepで指定オプションを自動付加してくれる環境変数 &quot;GREP_OPTIONS&quot; - 元RX-7乗りの適当な日々](https://www.na3.jp/entry/20120129/p1)
・[grepコマンドに色をつける - 作業ノート](http://te2u.hatenablog.jp/entry/2013/10/18/222733)

また、`grep --color`は内部的には文字列を変換するので（色を表す情報が文字列の前につく）、`grep --color=always`とすると後続の検索や置換処理がうまくいかなくなる可能性がある点には注意が必要です。
>・[grepコマンドの--color=alwaysオプションを使うべきではない](https://qiita.com/soshiM/items/456b89ad968c068cbb90)

以上が本稿の内容となります。
ご覧いただきありがとうございました！🙇‍♂️
Pocket C.H.I.P初期設定メモ

##Pocket C.H.I.Pの初期設定用メモ

###レポジトリの修正

対象ファイル `/etc/apt/sources.list`

修正前
`deb http://opensource.nextthing.co/chip/debian/repo jessie main`
`deb http://opensource.nextthing.co/chip/debian/pocketchip jessie main`

修正後
`deb http://chip.jfpossibilities.com/chip/debian/repo jessie main`
`deb http://chip.jfpossibilities.com/chip/debian/pocketchip jessie main`

対象ファイル `/etc/apt/preferences`

修正前
`Package: *`
`Pin: origin opensource.nextthing.co`
`Pin-Priority: 1050`

修正後
`Package: *`
`Pin: origin chip.jfpossibilities.com`
`Pin-Priority: 1050`

###タッチ画面の調整

キャリブレーション
`sudo apt-get install xinput-calibrator`
`sudo /usr/bin/xinput_calibrator`

対象ファイル　`/usr/share/X11/xrog.conf.d/99-calibration.conf`

修正前
`Option "Calibration" "3965 112 3776 227"`

修正後
`Option "Calibration" "9999 999 9999 999"`
※上記の値は環境によって変わります。

###PICO-8バージョンアップ
`wget www.lexaloffle.com/dl/chip/pico-8_0.2.0i_chip.zip`
`sudo unzip pico-8_0.2.0i_chip.zip -d /usr/lib`

おまけ
`/usr/bin/pico8/`起動設定

##関連リンク
[CHIP COMMUNITY](http://www.chip-community.org/index.php/Main_Page)
[lexaloffle.com](http://lexaloffle.com)
初心者によるプログラミング学習ログ 341日目

#100日チャレンジの341日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
341日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>341日目　2.5h<br>・ポートフォリオ作成<br>・スライドショー追加<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1270808890431508483?ref_src=twsrc%5Etfw">June 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
衛星画像から、緯度経度を指定してその地点のピクセル値を取得する方法

#背景
衛星画像からニューラルネットワーク回帰を使用して、クロロフィル値を求める研究をしています。
そのためにまずは、データの取得・前処理として、衛星画像データから緯度経度を指定してその地点のピクセル値を取得する方法について書いていきたいと思います。
その前に衛星画像とはなんぞや↓
[衛星データの基本](https://sorabatake.jp/279/)

#使用する衛星画像データ
Landsat8の画像を使用します。
AWSでオープンデータとして公開されいます。
[AWS Landsatデータ](https://docs.opendata.aws/landsat-pds/readme.html)
AWSで公開されているlandsatの画像データは、pathとrowなどを指定して位置から検索できます。
ちなみに、今回は琵琶湖のデータを使用するので、path 110 row 35のデータを探して取得しました。
上記のページに、取得可能なシーンの全リストがあるので、それをpathとrowでソートして取得しました。

pathとrowを確認する方法はこちら↓
[path/row coverter](https://landsat.usgs.gov/landsat_acq)



#使用するライブラリ
**rasterio**と**pyproj**を使用します。
**rasterio**は、ラスターデータを扱うためのライブラリです。
[rasterio](https://rasterio.readthedocs.io/en/latest/intro.html)
**pyproj**は、座標系を変換するライブラリです。
[pyproj](https://pypi.org/project/pyproj/)
Landsatのデータは、Geotifファイル形式になっており、座標のデータがタグとして埋め込まれているのですが、UTM座標を使用しているため、緯度経度からUTM座標系に変換する必要があります。

`import rasterio as rio
import pyproj`
↑事前にpipなどのでインストールしてください。

#rasterioでGeotifの読み込み
`B5 = rio.open('ファイルのパス')`

#座標系の変換
`utm = pyproj.Proj(B5.crs)
lonlat = pyproj.Proj(init='epsg:4326')
lat,lon = (35.445,136.0638888889)
east,north = pyproj.transform(lonlat,utm,lon,lat)`

緯度経度が、UTMの座標系に変換されたことを確認します。
>east,north
>(596554.9414823324, 3922913.584464462)

#座標からその地点の画像のrow,columnを取得
データはarray型になっていて、indexメソッドで座標に対応するrowとcolumnが取得できます。
`row, col = B5.index(east,north)`
>print(f'row,col=({row},{col})')
>row,col=(6086,5625)

また、arrayのデータのピクセル値にアクセスするためには下記のコードが必要です。
`B5read = B5.read(1)`
この1は、衛星画像のバンドのインデックスですが、今回はバンド5一つなので、1を指定。

#ピクセル値を取得
`B5read[row,col]`
>21530

#まとめ
以上ですが、これで簡単に緯度経度から指定した地点のピクセル値が求められます。
しかしこのピクセル値は、DN値といって、太陽の光の強さや角度などの影響を受けた値となっており、クロロフィル値をアウトプットとしたニューラルネットワークの入力に使用するにはTOAという反射率に変換しようと思っています。ほんとは大気補正とかして純粋なSR(Surface Reflectance）を求めたいところですが、難しいので今回はあきらめて、次回はTOAを求めるやり方をご紹介したいと思います。
**衛星画像の処理レベルについてはこちら↓**
[図解!衛星データの前処理とは](https://sorabatake.jp/9192/)

最後までお読みいただきありがとうございます！
【2020年6月版】ruby on rails on AWS

# 前置き

散々トライした結果EC2上でRDS(mysql)を使って接続ができたので備忘録を。
年月を書いたのは少しでも情報が古いとうまくいかないことが多かったからです。
コマンドだけ列挙しますが、それぞれが何を意味しているのかよく分かっていないのもあります。
どなたかのお役に立てれば幸いです。

## 前提
 - VPC内にEC2(Amazon Linux2 x86)とRDS(mysql)がある どちらも無料枠
 - セキュリティグループのインバウンドルールは以下の通り
    - SSH TCP 22 MyIP 
    - MYSQL/Aurora TCP 3306 このグループ内
    - カスタムTCP TCP 3000 0.0.0.0/0
 - ErasticIPはEC2に割り当ててある(この記事では123.123.123.123とする)

## コマンド
```
sudo yum -y update
sudo yum -y install git
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
sudo shutdown -r now
```

なぜか不明ですがここで再起動をするとうまくいきました。

```
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
sudo yum -y install gcc gcc-c++ make openssl openssl-devel readline-devel mysql mysql-devel nodejs yarn libmysqld-dev
rbenv install 2.7.1
rbenv global 2.7.1
gem update --system
gem install --no-document rails
gem install bundler
gem install mysql2 -- --with-mysql-config=/usr/bin/mysql_config
gem install sassc -v '2.4.0'
rbenv rehash
rails new hoge -d mysql
cd hoge
vim config/database.yml
```

ここで以下のように修正する。

```
development:
  <<: *default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: 「RDSのユーザー名」
  password: 「RDSのパスワード」
  host: 「RDSのエンドポイント」
  database: 「RDSのDB名」
  port: 3306
```

以下コマンドの続き

```
bundle install
rails g scaffold Memo title:string body:text
rails db:migrate
rails server -b 「EC2のプライベートIP(ip a とコマンドを打つと出てくる)」 -d
```

この状態で、手元のssh接続元PCのブラウザで 123.123.123.123:3000 を開く

# 思ったこと(未検証)

 - 無料枠のEC2のせいなのか分からないが、最初から入っていないモジュールがたくさんある
 - railsにはnode.jsやyarnが必要らしい
 - デフォルトでインストールされたdbサーバは消す必要があるのではないか
MakeCode for micro:bit が Internet Explorer(IE)で使えない場合の逃げ道

# はじめに

 2020年6月、MakeCode for micro:bit の IEサポートが終了します。ただ、日本の学校は未だに  Internet Explorer しか使えない環境が多いのが現状です。（Microsoftも文科省も使うのをやめようと言っているのにも関わらず…）

# 対策メモ

 https://makecode.microbit.org/v2

でアクセスすれば大丈夫です。ただし、この方法のサポートも提供が2年間なので2022年6月までしか使えません。2年以内に日本のすべての学校で、GIGAスクール対応によりChromeもしくは最新のEdge（中身はChromeのバージョン）が使えるようになっている事を祈ります。

なお、v2時代に作ったMakeCodeの共有URLについても/v2/を付ければOKです。
例：https://makecode.microbit.org/v2/_F3q7Aw85m2wa

# 補足

Windows10ならば[MakeCodeアプリ](http://aka.ms/microbitapp
)という選択肢もあります。
ヒアドキュメント用一時ファイルを作成できません: デバイスに空き領域がありません

# ヒアドキュメント用一時ファイルを作成できません: デバイスに空き領域がありません
AWSインスタンスで上記のようなエラーが出て、
tabキーの入力補完が使えなかったり、visudoが使えなかったりはまったのでメモ。

原因
不要なファイルが多い時やデバイス容量に空きがないときに生じる
解決
インスタンスの再起動したら治った。

追記
これでも無理な場合は
ELASTIC BLOCK STOREで割り当てを上げる　8GB→20GBなど
[理論で説明？]主成分の分散が共分散行列の固有値って [続き]

主成分分析は[前回の記事](https://qiita.com/nizu708/items/467dff05b0fa15b584da)にもあるように次の線形結合

```math
Y = a_1X_1 +a_2X_2,\ \boldsymbol{a}=(a_1,a_2)',\ 
\boldsymbol{X}=(X_1,X_2)'
```
の分散を最大化するものを第1主成分と定義した。
つまり、

```math
Var(Y) = a_1^2\sigma_1^2 + 2a_1a_2\sigma_{12} + a_2^2\sigma_2^2
= \boldsymbol{a}'\Sigma \boldsymbol{a}
```
を最大にする係数 $\boldsymbol{a}$を求めてやればいい。
しかし、これを最大にすることはできない。いくらでも大きくできるから。そこで1つの制約条件として、

```math
\boldsymbol{a}'\boldsymbol{a} = a_1^2 + a_2^2 =1
```
を設ける（主成分は軸を決めたいだけだから方向さえわかればいいし）。
この制約条件のもとで $Var(Y)$を最大化するという**最適化問題**を解けばいいということになる。制約付き最適化問題は**Lagrangeの未定乗数法**という方法を使えば解けるのでこの解は数学的に導くことができる。
（どっかでLagrangeの記事も書こうかな）

基本的には制約条件に基づいて最大化したい式に関する連立方程式を解けばよいということになる。
制約式を $g(\boldsymbol{a})=c$、最大化したい関数を $f(\boldsymbol{a})$として、Lagrange乗数を $\lambda$とすると、

```math
\frac{\partial f}{\partial \boldsymbol{a}}-\lambda \frac{\partial g}{\partial \boldsymbol{a}}=\boldsymbol{0}
```
が成り立つというのがLagrangeである。ここにベクトルの微分の記号は各要素で偏微分したものを並べる（微分したものを並べてベクトルにするっていう意味）ということを表す。
実際のやり方としては

```math
\begin{align*}
\phi(\boldsymbol{a})&=f(\boldsymbol{a}) - \lambda \{g(\boldsymbol{a})-c\} \\
&= \boldsymbol{a}'\Sigma \boldsymbol{a} - \lambda
(\boldsymbol{a}'\boldsymbol{a}-1)
\end{align*}
```
として、

```math
\frac{\partial \phi(\boldsymbol{a})}{\partial \boldsymbol{a}}
=\boldsymbol{0}
```
を解けばいい。
これを計算してみると（やってみて。最初は成分で偏微分してまたベクトルと行列の形にまとめ直すって感じで。慣れてくるとベクトルや行列のまま微分できるようになるよ）、

```math
\Sigma \boldsymbol{a} -\lambda \boldsymbol{a}=\boldsymbol{0}
\Leftrightarrow 
(\Sigma - \lambda I)\boldsymbol{a}=\boldsymbol{0}
```
を満たす解が第1主成分というわけさ。
この解の1つは $\boldsymbol{a}=\boldsymbol{0}$という自明な解である（$(\Sigma - \lambda I)$が正則なら）。が、これは $\boldsymbol{a}'\boldsymbol{a}=1$を満たさない。
自明でない解を持つためには係数行列の行列式が0である必要がある（厳密には必要十分）。つまり、

```math
|\Sigma - \lambda I|=0
```
を満たす $\lambda$でなければならない。これって何？
そう、固有方程式なのよね。だから $\lambda$は $\Sigma$の固有値であって、それに対応する固有ベクトルが $\boldsymbol{a}$となるわけよ。まぁこれを最大固有値とするってのはそんなに難しくない。
使う性質としては$\Sigma$が実対称行列で半正定値であることを使えば固有値も正なのでとか使えば説明できるはず（これは固有値が正であるってこと説明するために使う感じ？気にしない人は不要かも）。
（線形代数って偉いよなぁ）
最大固有値の主張だけなら、主成分の分散式と$(\Sigma - \lambda I)\boldsymbol{a}=\boldsymbol{0}$式を展開したときに得られる2本の式が一致することを言えばよくて、そうすればそもそもの目的が分散最大化なのだから最大固有値を$\lambda$とすればいいよねって感じ。

第2主成分は？制約条件増えるけど？
これはLagrange乗数をもう一つ用意 ($\mu$とか？)してやって、さっきの 関数$\phi$の後ろに制約条件の$\mu$倍をつければ同じように求められる。
（これって意外と微積の教科書に書いてないんだよね。なんでだろ。）
AtCoderでRuby学習14【第三回アルゴリズム実技検定 スプリンクラー】ハッシュ作成、キー・値の追加

## はじめに
Rubyおよびアルゴリズムの学習の一環として競技プログラミングに参加しています。
ここでは、学習の中で学んだことをアウトプットしています。

今回はハッシュについて。
この記事執筆のきっかけは、第三回アルゴリズム実技検定、第五問「[スプリンクラー](https://atcoder.jp/contests/past202005-open/tasks/past202005_e)」。

この問題、ハッシュを用いるとスムーズに解答出来るような問題だったのですが、
ハッシュについての理解が浅かった僕は検定中にこの問題に解答出来ず…

という訳で今回は、

①この問題にハッシュを使って解答する
②解答をもとにハッシュの使い方を考えてみる

このような流れで、自分なりにまとめてみたいと思います。

## 問題
1,2,3,...,N と番号が付いたN個の頂点と、1,2,3,...,M の番号が付いた M 本の無向辺からなる無向グラフが与えられます。
辺 i は頂点 ui と vi を双方向につないでいます。

それぞれの頂点には色を塗ることが可能で、はじめ頂点 i は色 ci で塗られています。
(この問題において、色は 1 以上 10**5 以下の整数で表されます)。

それぞれの頂点にはスプリンクラーが設置されています。 
頂点 i にあるスプリンクラーを起動すると、
頂点 i に隣接する全ての頂点の色がスプリンクラー起動時点の頂点 i の色で塗り替えられます。

以下の形式で与えられる Q 個のクエリ s1,s2,…,sQ を順番に処理してください。
- 頂点 x の現在の色を出力する。その後、頂点 x にあるスプリンクラーを起動する。1 x という形式で与えられる。
- 頂点 x の現在の色を出力する。その後、頂点 x の色を y で上書きする。2 x y という形式で与えられる。


**制約**
- 与えられる入力は全て整数
- 1≤N,Q≤200
- 0≤M≤N(N−1)/2
- 1≤ui,vi≤N
- 1≤ci≤10**5
- i は下記のいずれかの形式の文字列
    - '1 x'(1≤x≤N)
    - '2 x y' (1≤x≤N,1≤y≤10**5)
- 与えられるグラフに多重辺や自己ループは存在しない

入力は以下の形で与えられる。

```ruby
N M Q
u1 v1
⋮
uM vM
c1 c2 ⋯ cN
s1
⋮
sQ

入力例
3 2 3
1 2
2 3
5 10 15
1 2
2 1 20
1 1
```

```ruby
出力例
10
10
20
```
問題のイメージは以下のような感じです。

![Array.new(3, Array.new(3, 0)) (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517040/d309d943-a3f2-d466-9afd-040fa1f4b718.jpeg)


## 解答
今回、他の方の解答を参考にして解答を作らせて頂きました。

```ruby
N, M, Q = gets.split(" ").map(&:to_i)

H = Hash.new{|hash, key| hash[key] = []}　#①空のハッシュ作成

M.times do
  u, v = gets.split(" ").map(&:to_i) 
  H[u].push(v) #②ハッシュへの追加
  H[v].push(u) #②ハッシュへの追加
end

C = gets.split(" ").map(&:to_i)
C.insert(0, nil)

Q.times do 
  x,y,z = gets.split(" ").map(&:to_i)
  puts C[y]
  if x == 1
    H[y].each{|i| C[i]=C[y] }
  else
    C[y] = z
  end
end
```

この解答について、
ハッシュの作成とハッシュへのキーと値の追加について、
次回の解答で使うため、イメージを掴めるようにまとめてみます。

### ①空のハッシュ作成

上記の解答では、Hashクラスのnewメソッドにブロック {} を与える形で空のハッシュを準備しています。

```ruby
H = Hash.new{|hash, key| hash[key] = []}
```
ハッシュにキーと値を追加する度に、ブロックでの評価が行われ、オブジェクトが生成されます。
上記のコードでは、空の配列を値のデフォルト値としています。
これは、今回解答する問題が、ひとつのキーに対して複数の値が存在する可能性がある問題のためです。
（キーにはひとつの頂点、値にはその頂点に隣接する（辺でつながっている）頂点が入る）

### ②ハッシュへの追加

標準入力から受け取ったオブジェクトをキーと値としてハッシュに追加しています。
今回の解答では、値はデフォルト値として設定された配列に要素として追加します。

```ruby
u, v = gets.split(" ").map(&:to_i) 
H[u].push(v) # u をキー、 v を値として
#配列への追加なので「<<」の記号を使ってもOKです。
H[u] << v
```
ここまでのイメージを自分なりにまとめてみました。

![Array.new(3, Array.new(3, 0)) (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517040/57932db0-ee4e-4afd-1055-9db1e56b6988.jpeg)

ちょっと散らかっちゃってますが、ようやくイメージが掴めてきた気がします。

ハッシュを使いたい時は、
①ブロックでキーと値の関係性を設定する。
②キーをハッシュに追加する度、①に従って値が用意される。
③値への追加や変更を行う場合は、デフォルト値の形に合わせて行う。

ひとまず今回の問題については、このような形で攻略出来ることが分かりました。


## 最後に
以上、ハッシュの作成やキー・値の追加について自分なりにまとめてみました。
ハッシュをどんどん使っていって、自分のものにしていきたいです。

リファレンスなどを読みながらまとめたつもりですが、
もし間違いなどございましたら、ご指摘いただけると嬉しいです。
べき乗のmod

#大きい数同士のべき乗には、pow(a,b,z)を使う

#####自分用のメモです。一回みたことあったのに忘れてた＆自分で実装できなくて時間とかした。これを使うと、a**b % z を秒でしてくれる。今度どういう仕組みで動いてるのか調べてみることにします。

再帰で書こうとしたら、再帰の上限回数(自分は3000)こえたらしくて上手く処理できなかった。なーんでだろう？

ちなみに、上限回数は、
import sys
print(sys.getrecursionlimit())

で調べられる。
C# の null条件演算子 null合体演算子の使用例メモ

null なんちゃら演算子の使い方がいつも迷うので、自分用に超簡単メモφ(..)
（オブジェクトや変数の型の明示とか省略）
# null条件演算子【 ?. 】

```csharp
var name = person?.name;
```
`person` が `null` の場合は `name` は `null`。
`person` が `null` でない場合のみ `person.name` を返す。
これは下記のコードと等価。

```csharp
var name = "";
if (person == null)
  name = null;
else
  name = person.name;
```

# null合体演算子【 ?? 】

```csharp
var name = personName ?? "personName is null";
```

`personName` が `null` の場合でも `name` に 何か （`"personName is null"`） 代入したい。
`personName` が `null` でない場合は、`name` に `personName` がそのまま代入される。
これは下記のコードと等価。

```csharp
var name = "";
if (personName == null)
  name = "personName is null";
else
  name = personName;
```

# null条件演算子 と null合体演算子 の合わせ技

とあるオブジェクトのメンバ変数を取得したいけど、もしそのオブジェクトが null だった場合に既定値をぶち込む、的な用途に使うといい感じっぽい。

```csharp
var name = person?.name ?? "person is null";
```
（`person` が `null` の時、`person?.name` は `null` なので `??` の右側が評価される）
これは下記のコードと等価

```csharp
var name = "";
if (person == null)
  name = "person is null";
else
  name = person.name;
```

※ 2020/06/12 追記
コメントにてご指摘頂きましたので追記します。
上記コードで `person` は `null` ではないが `person.name` が `null` の場合も `person is null` が返りますね。
できるだけシンプルに解釈できるようにサラッと書いてしまったので不正確でした。
等価コードは下記のような感じでしょうか。

```csharp
var name = "";
if (person != null && person.name != null)
  name = person.name;
else
  name = "person or person.name is null";
```

# 参考にさせていただい記事
いつも有難うございます。
- [ufcpp.net - null の取り扱い][link1]
- [Microsoft Docs - ?? および ?? 演算子 (C# リファレンス)][link2]

[link1]:https://ufcpp.net/study/csharp/rm_nullusage.html#null-coalesce
[link2]:https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator
【Flutter】Flutter × RIVE でアニメーション対応

## 完成版はこちら
Shakeボタンで乱数生成機能にアニメーションをつけてみました。
[https://github.com/Tetsukick/enGolf](https://github.com/Tetsukick/enGolf)
[App Store はこちら](https://apps.apple.com/jp/app/engolf/id1507668448?l=en)
[Google Play Store はこちら](https://play.google.com/store/apps/details?id=com.tetsukick.engolf)

<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/2a3fb30f-fb14-0439-635d-3af527ffaaac.gif">

## RIVEとは
[Rive 社（旧 2Dimensions）](https://rive.app/explore/popular/trending/all)が開発しているブラウザーベースのベクター 2D アニメーション作成ツールで、デザイナーがデザインアセットを使って直接アプリやゲーム用のアニメーションを作ることを目的としています。2018 年 12 月に公開され、基本機能は無償で使えます。（ファイルを非公開にしたいときは有料プラン）

[RIVEデータはこちら](https://rive.app/a/tetsukick/files/flare/golf-ball-rotate)

## RIVEでのアニメーション作成

まずはRIVEでアカウントを作成してください。

次に以下の画像のように右上の`New File`を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/2d560608-361c-75e4-19d7-3d3d6fd301bf.png)

画面左下のimportより画像をインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/e65ae0d4-fa3a-0d61-41a1-03610c6b7dd9.png)

アニメーションタブを開いて、画面下の指定の時間で画像の大きさを変えたり、位置を変えたりしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/81a96149-57bd-3a43-d798-f851c2620bc9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/5184d9bc-0e03-e595-e7ec-c2bbb931da29.png)

作成したアニメーションに名前をつけてください。後ほどソースコード内で使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/6c1ac113-715e-1e33-3aff-7a9952e0d6ea.png)

ファイルのエクスポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/399d7dfc-2a13-2856-244c-b58bcd7194bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/35810d74-54c4-cfd5-9031-be8415925979.png)

## ソースコードに追加

パッケージのインストール
[公式はこちら](https://pub.dev/packages/flare_flutter)

```
dependencies:
 flutter:
   sdk: flutter
 flare_flutter: ^2.0.3
```

先程、エクスポートしたファイルをassets配下に配置。（配置場所はどこでも）

僕の場合は以下のようなWidgetを生成するメソッドに記載しています。
※animationの引数にRIVE上で命名したアニメーションの名前をつけてください。

```dart
Widget _createAnimationGolfBallView({int num, double height, double width}) {
    return Container(
      height: height,
      width: width,
      child: Stack(
        children: <Widget>[
          FlareActor(
            'assets/golf_ball_rotate.flr',
            animation: 'start',
            alignment: Alignment.center,
            controller: golfBallAnimationController,
            fit: BoxFit.fill,
          ),
          Center(
            child: Text(
              num.toString(),
              style: TextStyle(fontSize: height / 2),
            ),
          ),
        ],
      ),
    );
  }
```

アニメーションの再生

```dart
//コントローラを宣言
final FlareControls golfBallAnimationController = FlareControls();

...

//以下をボタンタップ時に追記
golfBallAnimationController.play('start');
```

## 参考サイト
[Rive（旧 Flare） でつくる Flutter アニメーション](https://note.com/kay_ya/n/n5832954bd5a6)
[メモ]Intellijでimportされているgoのモジュールを認識させる

以下のように認識されてないgoのモジュールの箇所にカーソルを当てて、Unresolved referenceを修正する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121811/ae7caf49-4a4d-79b5-bb64-56fd933fd1b2.png)
パッケージの使い方

# プログラミングの勉強日記
2020年6月11日　Progate Lv.85
JavaScript Ⅴ

##パッケージとは
　JavaScriptの中では他の人が通った便利なプログラムがパッケージという形で公開されている。このパッケージは自分のプログラムの中に組み込んで使うことができる。
　今回紹介するパッケージはコンソール出力の文字に色を付けることができるchalk、コンソールに値を入力できるreadline-syncのパッケージを紹介する。

##パッケージのインポート
　パッケージを自分のプログラムで使用するためにはインポートが必要である。
`import 定数名 from "パッケージ名";`でインポートすることができる。<font color=blue>ファイル名ではなく、パッケージ名を指定する。</font>

##chalkパッケージの使い方
　

```javascript:chalkを使って文字の色を変える
import chalk from "chalk";
console.log(chalk.yellow("Hello World")); //文字色を黄色に
console.log(chalk.bgCyan("Hello World")); //背景の色をシアンに
```

##readline-syncパッケージの使い方
　readline-syncを使うとコンソールの値の入力とその入力された値をプログラムで使うことができる。また、入力された値は定数や変数に代入できる。`questionint`を用いると整数の入力を求めることができる。
　質問文が出力されると、いったん処理が止まり入力を待つ。

```javascript:readline-syn
import readlineSync from "readline-sync";
readlineSync.question("名前：");

//入力された値を代入する
const name = readlineSync.question("名前：");
const age = readlineSync.questionint("年齢："); //整数の入力を求める
```
【自分用備忘録】win10 1909 SIMが使えないときのAPN追加方法

https://suguruohishi.hatenablog.com/entry/2018/07/30/125526
に書いてあることを自分用スクリプトとして作成。

Powershellの文字列取得忘れたので表記している内容をコピペする運用でカバー実装。


# 内容
デスクトップにProfile.xmlファイルを作成、それをプロファイルとしてインストール。

最初のボタンをYesを押したらAPN情報などは今後入力はGUI上でできるようにそのうちする。

以下コピペでProilemake.ps1などで保存、Powershellで実行すればインストールまで行われるはず。
動かなかったらスマソ...



```Profilemake.ps1
Add-Type -Assembly System.Windows.Forms

$msgBoxInput = [System.Windows.Forms.MessageBox]::Show("SIMは挿入されていますか?","SIM挿入確認","YesNo","Question")

switch ($msgBoxInput) {

    'Yes' {
        　　netsh mbn show interfaces
       $interface = Read-Host "名前或いはNameの横にあるデバイス名を入力してください(例:携帯電話)"
       $IMEI = Read-Host "デバイス ID或いはDevice Idを入力してください"
       
       netsh mbn show readyinfo interface = $interface
       
　　　　$SIMICC = Read-Host "SIM ICC　IDを入力してください"
       $Provider = Read-Host "AU,DOCOMO,SOFTBANKを入力してください"
　　　　$Profile = Read-Host "プロファイル名を入力してください"
       $APN = Read-Host "APNを入力してください"
       $Username = Read-Host "ユーザー名を入力してください"
       $Passwd = Read-Host "パスワードを入力してください"
       $auth = Read-Host "認証方式を入力してください"

$xml = @"
<?xml version="1.0"?>
<MBNProfileExt xmlns="http://www.microsoft.com/networking/WWAN/profile/v4"
       <Name>{VR-SIM-Profile}</Name>
       <Description>$Profile</Description>
       <IsDefault>true</IsDefault>
       <ProfileCreationType>UserProvisioned</ProfileCreationType>
           <SubscriberID>$IMEI</SubscriberID>
           <SimIccID>$SIMICC</SimIccID>
           <HomeProviderName>$Provider</HomeProviderName>
           <ConnectionMode>auto</ConnectionMode>
           <Context>
               <AccessString>$APN</AccessString>
               <UserLogonCred>
                   <UserName>$Username</UserName>
                   <Password>$Passwd</Password>
               </UserLogonCred>
               <Compression>DISABLE</Compression>
               <AuthProtocol>$auth</AuthProtocol>
           </Context>
           <ProfileConditionedOn>
               <IMSI>$IMEI</IMSI>
           </ProfileConditionedOn>
   </MBNProfileExt>
"@

$desktop = [Environment]::GetFolderPath("Desktop")

$xml | out-File $desktop\Profile.xml -Encoding utf8

netsh mbn add profile interface=$interface name=$desktop\Profile.xml



 [System.Windows.Forms.MessageBox]::Show("プロファイルを読み込みができた場合再起動して反映してください")  

   
         }
 
    'No' {
 
        [System.Windows.Forms.MessageBox]::Show("PCをシャットダウンをしてSIMを挿入してください。","結果","OK","Exclamation")
 
         }
}

```


netsh mbn add profile interface=$interface name=$desktop\Profile.xmlのあとに

文字を書いたのに反映されない...

#  [System.Windows.Forms.MessageBox]::Show("プロファイルを読み込みができた場合再起動して反映してください")  
と書いたので補完してください。



時間あるときに直す予定。


取り急ぎ自分用記事。
JuliaのCurveFitを使ってカーブフィッティング

## この記事は
[Juliaでカーブフィッティング](https://qiita.com/kaggle_master-arai-san/items/2f679c6597381a304f7b)の三角関数をフィッティングする内容を[CurveFit](https://juliahub.com/docs/CurveFit/yfYeb/0.3.2/)パッケージで実施しました．

## 実施環境
- macOS 10.14.6
- julia 1.4.1

## データを作る
フィッティングされる方の曲線を作ります．今回は三角関数に誤差項が乗っているデータを扱います．

```julia
using Plots
using CurveFit

X = 0.01:0.01:1.0
Y = @. 0.5 + 0.4 * sin(2pi*X) + 0.05randn()
```

`@.`は定義した数式をベクトルの全ての要素に適用するシンタックスです．

関数定義は非常に簡単にできます．また、`2pi`のように数字を変数の前につけた場合は`2*pi`と解釈されるので可読性が高くなります（さすがに`2piX`はエラーになりました）．randやsinなどの数学関数が組み込みなのが便利です．

このデータを見てみます．

```julia
gr()
scatter(X, Y)
```

![DataScatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33547/52c0ea12-b313-92c1-e829-8d55355a65a9.png)

## サンプル

フィッティングに使用するサンプルを採取します．今回は等間隔に10点とります．

```julia
X0 = X[1:10:91]
Y0 = Y[1:10:91]
```

JuliaのインデックスはMatlabと同様に1から始まります．他の言語に慣れていると気持ち悪く感じるかもしれません．

## フィッティング
CurveFitにはいくつかのフィッティングモデルがあるのですが，今回は多項式モデルのPolyを使用します．

```julia
fit1 = curve_fit(Poly, X0, Y0, 1)
Y1 = fit1.(X)
```

非常に簡単です．`curve_fit`の第1引数にモデルの`Poly`を指定し，第2, 3引数にフィッティングに使用するサンプルを指定します．第4引数は多項式の最大次数です．ここでは1次式でのフィッティングをしています．
第2行はフィッティングしたモデルを使って，近似線の値を計算しています．それではプロットしてみましょう．

```julia
plot(X, Y, seriestype = :scatter, label="data")
plot!(X, Y1, label="Poly deg1")
```

2行目の`plot`に`!`がついているのは，1行目のプロットに重ねて描画するためです（引数を変更する関数呼び出しを破壊的メソッドと呼ぶらしい）．もし`!`をつけないで2行目を`plot`と書いた場合，1行目のプロット内容はリフレッシュされてしまい，2行目のプロット内容しか描画されません．

![fitPolyDeg1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33547/c8536979-77ea-9edf-41e4-1d3f8ebd56b3.png)

1次近似では無理がありますが，頑張ってますね．

## 3次近似、6次近似、9次近似
次数を増やしてみましょう．

```julia
fit3 = curve_fit(Poly, X0, Y0, 3)
Y3 = fit3.(X)

plot(X, Y, seriestype = :scatter, label="data")
plot!(X, Y3, label="Poly deg3")
```

![fitPolyDeg3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33547/b1434b2f-0dc0-675b-ebaf-416092749b82.png)

3次近似だとこんな感じ．いい感じですね．
次は6次近似を試してみます．

```julia
fit6 = curve_fit(Poly, X0, Y0, 6)
Y6 = fit6.(X)

plot(X, Y, seriestype = :scatter, label="data")
plot!(X, Y6, label="Poly deg6")
```

![fitPolyDeg6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33547/a0d2e6fe-fe5f-6809-a406-87fc216c6636.png)

ややオーバーフィッティングし始めましたね．
さらに次数を増やし9次にしてみます．

```julia
fit9 = curve_fit(Poly, X0, Y0, 9)
Y9 = fit9.(X)

plot(X, Y, seriestype = :scatter, label="data")
plot!(X, Y9, label="Poly deg9")
```

![fitPolyDeg9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33547/076695a1-5150-da77-be78-3631db2e4002.png)

9次近似では見事なまでにオーバーフィッティングしてあらぬ方向に行っています．

以上，Juliaの`CurveFit`を使ったカーブフィッティングを紹介しました．`CurveFit`を使用すると，非常に簡単にフィッティングができて便利ですね．
参考にした[Juliaでカーブフィッティング](https://qiita.com/kaggle_master-arai-san/items/2f679c6597381a304f7b)では10次近似をしているですが，`curve_fit(Poly, X0, Y0, 10)`はエラーとなってしまい，フィッティングできませんでした．`CurveFit`ではモデル式の変数がサンプル数より多い場合にはエラーを返す実装になっているようです．
LPICレベル１の学習メモ 4

#シェルに関して
学習初めて最初から環境変数やシェル変数やらでよくわからない

##シェルのオプション
##set
-oで有効 +0で無効になる（直感的に行くと逆のほうがわかりやすかった）
###オプション
* allexport 作成変更した変数を自動でエクスポートする
* emacs
キーバインド変えるやつ
* ignoreeof 
Ctrl+Dでログアウトしないようにできる
* noclobber 
リダイレクトによる上書き禁止(>|を使うと上書きできるらしい)
* vi
キーバインド変えるやつ 

##エイリアス
###alias
コマンドに別名をつけて呼び出せるようにする
###unalias
エイリアス解除

##関数の定義
###function
function 関数名() {コマンド;}
一連のコマンドを登録すれば関数名で呼び出すことができる

###declare -f 関数名
定義された関数を表示する
###unset 
関数の削除
[Slack]自作したBotのメッセージを削除する

## 自作したBotのメッセー手順
Slackで間違えて投稿した自作したBotのメッセージを削除したい場合の忘備録。
自分宛のチャンネルならメッセージの設定から自分で消せるけど、それ以外のチャンネルに投稿した場合は消せない。

1. ここにアクセスする -> [chat.delete method | Slack](https://api.slack.com/methods/chat.delete/test)
2. それぞれトークン、チャンネル、タイムスタンプを入れる
3. [Test Method]ボタンをクリック
4. 下部に表示されるjsonで ` "ok": ture,` が表示されれば成功

<img width="667" alt="スクリーンショット 2020-06-11 0.32.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/040eaddb-3311-0cd4-f93e-459e42fdb5be.png">

## 項目の確認方法
#### **トークン**の確認
[Slack APIのTokenの取得・場所（Legacy tokens） - Qiita](https://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)

#### チャンネルID、タイムスタンプの確認
消したいメッセージの設定アイコン[︙] > リンクをコピー
すると以下のようなURLがコピーされる。
https://xxxx.slack.com/archives/XXXXXXXXX/p1590745858006800

右から二番目の英数字[XXXXXXXXX]が**チャンネルID**
右から一番目の数字[1590745858.006800]が**タイムスタンプ**(pを消して６桁目に**ピリオド**をつける)
Cross-Varidation（交差検証法）によるモデル評価指標について

Cross-Varidation（以下、CVと書く）ではデータを次のように2分割する。

- Training data （訓練データ）
- Test data （テストデータ）

訓練データでは解析を行い、モデルの構築など解析を行う。
テストデータでは訓練データによる解析の検証を行う。
というように役割を分けることで現在あるデータのみから妥当性の裏付けを行うことができるのが特徴である。適用範囲も広く、いろんな場面で使われるが、今回はモデル評価基準として使う場合を紹介する。（余裕があればコード例も。）

設定はアウトカムを $y$、説明変数を $\boldsymbol{x}$として、サンプルサイズは $n$であるする。（手順では回帰を意識していますが他でも使える）
つまり、データは $y_1,y_2,\ldots ,y_n$, $\boldsymbol{x}_1, \boldsymbol{x}_2, \ldots ,\boldsymbol{x}_n$の計 $n$セットが得られているってこと。

#### Leave-One-Out CV (LOOCV)の場合
無理やり訳せば「1個抜き交差検証法」かしら。
手順としては以下のようにすればよい。

1. 大きさ $n$の観測データから1セットのデータ ($y_i, \boldsymbol{x}_i$)($i=1,2,\ldots ,n$のいずれか)を除き、それをテストデータとする。それ以外のデータを訓練データとする。
2. 訓練データを用いてモデルを作成し、その結果得られた回帰係数 $\boldsymbol{\beta}$の推定値を $\boldsymbol{\beta}^{(i)}$とする。この推定値を用いて予測したアウトカムを $\widehat{y}^{(i)}$とする。（実測値は $y_i$）
3. この手順を$i=1,2,\ldots ,n$で繰り返し行う。（だから $n$回やね。）
4. 3.の結果 $n$個の $\widehat{y}^{(i)}$が得られる。
5. 評価基準として以下のような基準をモデル評価基準で使えばよい。
    - 平均二乗誤差（Mean Squared Error, MSE）
$$
MSE_{CV} = \frac{1}{n}\sum_{i=1}^{n}(y_i -\widehat{y}^{(i)})^2
$$
    - 二乗平均平方根誤差（Root Mean Squared Error, RMSE）
$$
RMSE_{CV}= \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i -\widehat{y}^{(i)})^2}
$$
    - 平均絶対誤差（Mean Absolute Error, MAE）
$$
MAE_{CV} = \frac{1}{n}\sum_{i=1}^{n}|y_i -\widehat{y}^{(i)}|
$$

これらの指標（のどれか）を使えばよいが、誤差の大きさを測る指標なのだから、これらの値は小さいほどよいモデルとなることもわかるね。もちろんMSEで比較するならMSE以外と比較したらダメよ。
線形回帰などのように説明変数の選び方によってモデルが変わるような場合はそれぞれのモデルで上記のモデル評価基準を計算してこの値が最も小さくなるモデルを最良のモデルと判断すればよい。

#### K-fold CVの場合
これはLOOCVの拡張（LOOCVの方が拡張？）で、さっきは1個抜きでやってた部分を一気に複数個（グループで）抜いてやろうとするだけ（その分繰り返し回数が減る）。$K$分割交差検証法とか言ったりもする。
グループで抜くのを繰り返すので説明の仕方としては、データを同じくらいの大きさになるように分割する（グループ数を$K$個とする）。式で書けばデータ行列を$X$としたときに、$\\{X_1,X_2,\ldots ,X_K\\}$のように分割（分割は集合論の分割の意味で使ってます。）し、厳密にイコールは無理だが、$|X_1|=|X_2|=\cdots =|X_K|$に近い形になるようにする。（ここに書いてある絶対値みたいな記号は絶対値ではなくて集合に対して使うときは集合の要素数(濃度)という意味になります。`n(集合)`とか書いたりもします。高校生のときはこっちだったかな。）だから大体 $n/K$個くらいずつに分ける感じかな。
注意点としては、この分割の仕方はランダムにしなきゃダメってこと（最初に分けたらその後はグループ変えないけど）。だから、これはやる度にグループに属するデータが異なるから結果も若干異なることがあるという特徴（弱点？）がある。
そしたらあとはこの各グループを1つのサンプルとみなしてやればあとの手順は LOOCVと同じようにできるよね。だから$K$回繰り返さなきゃダメだね。

（[主成分の記事の続き](https://qiita.com/nizu708/items/e24d13ec99683e5dd650)を待ってくれている方々、それはまたの機会に。と思ってたら[書けた。](https://qiita.com/nizu708/items/e24d13ec99683e5dd650)）
【ドットインストール】git入門講座で詰まった点と解決方法【 #19 はじめての共同作業】・【#20 共有リポジトリにpushしてみよう】

##はじめに
ドットインストール「git入門講座」（#19 はじめての共同作業・#20 共有リポジトリにpushしてみよう）で、ローカルに共有リポジトリを作成する際に、
動画のやり方に従っても上手くできなかった。
詰まった点と、解決方法についてメモ。

##上手くいかなかった点

```
git remote add origin (repos location)
```

でリモートリポジトリを設定使用とすると、リモートリポジトリを認識できないエラーが発生。

##実装方法

共有リポジトリを先に作り、そこからクローンする形でAさん、Bさんの作業リポジトリを作る！！

・ファイル構成

```
├── ourweb.git
└──  myweb
   ├── forA
   │   └── index.html
   └── forB
      └── index.html
   
```

①ローカルに共有リポジトリを作成

```
mkdir ourweb.git
```

共有リポジトリには(〜.git)という名前をつけるのが通例

ourweb.gitに移動した状態で、

```
git init --bare --shared
```
「--bare」をつけることで、共有リポジトリであることを宣言する
↓
このファイルの中では、基本的にファイルのコミットなどはしない設定になる。
管理ファイルのみが管理されるようになる。


②共有リポジトリをクローンしてAさんのリポジトリを作る

```
git clone ./myweb/forA    (共有リポジトリから、Aさんのリポジトリまでのパス)
```

これで、Aさんの作業リポジトリの作成が行える。
「.git」がAさんのリモートリポジトリとなる。

※「warning: you appear to have cloned an empty repository」
という警告が出るが、中身が空でも、空のリポジトリのままクローンが作成できるので問題ない。

③共有リポジトリをクローンしてBさんのリポジトリを作る

```
git clone ./myweb/forB       (共有リポジトリから、Aさんのリポジトリまでのパス)
```

これで、Bさんの作業リポジトリの作成が行える。
「.git」がBさんのリモートリポジトリとなる。

以降、動画の通り、
Aさんのローカルリポジトリに「index.html」を作成。
リモートリポジトリにpush

Bさんはリモートリポジトリより「index.html」をpullし、
共有リポジトリの使い方を学んでいく

##参考
Gitでリモートのリポジトリをローカルに作成する
https://qiita.com/masatomix/items/19f4604c939567929ee8
ConohaVPSを契約したらやること

###user作成/パスワード設定
useradd xxx
passwd xxx

###sudersに追加
vi /etc/sudoers
%xxx	ALL=(ALL)	NOPASSWD: ALL

###公開鍵認証設定

###パスワードログインオフ
```
vi /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no 
```
```
systemctl restart sshd
```

###
セキュリティグループのマイIPを自動更新してみた（ただしバッチファイルで）


セキュリティグループのインバウンドルールのソースに「マイIP」を指定できることは有名ですが、このマイIPってグローバルIPが変わるたびに手動で設定しなおさないといけないんですよね。これの更新を自動化できないものか、と考えていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/b99f10d4-9e3c-64a9-37d5-066acac9c9f6.png)

ググると`http://checkip.amazonaws.com/`にGETリクエストを投げるとグローバルIPが取得できるので、そのIPアドレスをインバウンドルールのソースに設定する（というスクリプトを作る）。というのが定石のようでしたが、なんかこのURLで得られるIPアドレスと、マネージメントコンソール上で表示されるマイIPが異なっており、`checkip.amazonaws.com`は使えませんでした。実際、`checkip.amazonaws.com`から取得したIPをセキュリティグループのインバウンドルールに追加してみましたが接続が弾かれましたよ。

そこで、API Gateway経由でLambda関数にGETリクエストを投げて、Lambda関数がリクエストコンテキストのソースIPの値を返すようなWeb APIを実装し、このAPIに向かってGETリクエストを投げることにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/e65ad8f8-4670-1430-ad8d-5602174d2754.png)

このAPIから返されたIPアドレスは、セキュリティグループで表示されるマイIPと同じアドレスになっていました…が、たまたま一致しただけかもしれません。

それはともかく、その時に実装したバッチファイルを載せておきます。

* 僕が使っている実際のバッチでは`http://checkip.amazonaws.com/`の部分が、自作のWeb APIのURLになっています。
* `curl`コマンドを使用しているため、Windows 10限定です。
* `SG_ID_SSH`に、マイIPを更新したいセキュリティグループIDを代入します。
* セキュリティグループ（インバウンド）の22番ポートのエントリをDelete & Insertするという単純な作りなので、利用の際はご注意下さい。

```bat:マイIP自動更新バッチ
@echo off

set "SG_ID_SSH=sg-xxxxxxxxxxxxxxxxx"

for /f "usebackq" %%a in (`curl --silent http://checkip.amazonaws.com/`) do set MYIP_NEW=%%a
echo What is my IP address ? - '%MYIP_NEW%'

call :UpdateSecurityGroup %SG_ID_SSH% 22 %MYIP_NEW%

pause
goto :EOF

:UpdateSecurityGroup
setlocal
  set "SG_ID=%~1"
  set "PORT=%~2"
  set "MYIP_NEW=%~3"
  echo Security group id: %SG_ID%

  set "CMD_DESC_SG=aws ec2 describe-security-groups --group-id %SG_ID% --output text --query "SecurityGroups[*].IpPermissions[?FromPort==`%PORT%`].IpRanges[0].[CidrIp][0]""

  for /f "usebackq" %%a in (`%CMD_DESC_SG%`) do set MYIP_OLD=%%a

  if not "%MYIP_OLD%"=="" (
    aws ec2 revoke-security-group-ingress --group-id %SG_ID% --protocol tcp --port %PORT% --cidr %MYIP_OLD%
    echo '%MYIP_OLD%' has been revoked successfully.
  )

  aws ec2 authorize-security-group-ingress --group-id %SG_ID% --protocol tcp --port %PORT% --cidr %MYIP_NEW%/32
  echo '%MYIP_NEW%/32' has been authorized successfully.

endlocal
  exit /b
```

```:実行結果
What is my IP address ? - 'xxx.xxx.xx.xxx'
Security group id: sg-xxxxxxxxxxxxxxxxx
'zzz.zzz.zz.zzz/32' has been revoked successfully.
'xxx.xxx.xx.xxx/32' has been authorized successfully.
続行するには何かキーを押してください . . .
```

`aws ec2`のクエリの書き方は難しいですね。PowerShellっぽい印象を受けました。

参考までに、`checkip.amazonaws.com`の再発明に使ったLambda関数の実装を載せておきます。

```python:Lambda関数（python3.8）
import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'text/html; charset=utf-8'
        },
        'body': event['requestContext']['identity']['sourceIp']
    }
```

ところで、なんでバッチファイルで実装したのかって？マゾだからですかね。
Elastic Beanstalk  で Amazon Linux AMI とAmazon Linux 2 の違い


## フック

### Amazon Linux AMI
[カスタムプラットフォームフック - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/custom-platform-hooks.html)

```
/opt/elasticbeanstalk/hooks/ 
```

### Amazon Linux 2

[Elastic Beanstalk Linux プラットフォームの拡張 - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/platforms-linux-extend.html#awsui-expandable-section-1-trigger)

```
ソースバンドルの .platform/hooks/
```

## 無視するファイル

### Amazon Linux AMI

`.gitattributes` を使う。

```:.gitattributes
.gitattributes export-ignore
.gitignore export-ignore
```

### Amazon Linux 2

`.ebignore` を使う。　[EB CLI の設定 - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html#eb-cli3-ebignore)

```:.ebignore
.gitattributes
.gitignore
```

## 環境変数

### Amazon Linux AMI

`/opt/elasticbeanstalk/support/envvars`

### Amazon Linux 2

`/opt/elasticbeanstalk/deployment/env`


```
export $(sudo cat /opt/elasticbeanstalk/deployment/env) 
```
初心者がSwiftに触れてみた

# 自己紹介　
まず初めに自己紹介をします。
私は東京都立大学に通う大学3年です。（専攻は法律）
エンジニアになることを目標に日々勉強を重ねています。
プログラミング歴は３ヶ月ほどで、その間、主にWeb制作の勉強をしていました。
いくつかサイトを作ってみたものの、Web制作がつまらなかったので
モバイルアプリの開発をはじめようと思い、Swiftの勉強を始めることに至りました。

#Swift学習に際して
先日MacBookProが届いたので、早速Swiftの勉強に入ることにしました。
（コロナの特別給付金でMacを買いました。安倍首相ありがとう。大学生にとってはなかなかな出費。。）

これまでの勉強は、Progateで基礎を勉強してから実際に開発してみる
という流れでやってきたのですが、
基礎を勉強しているときに、”今勉強していることは実際に開発するときにどのように使うのだろう”
と疑問に感じることが多く、個人的にこの勉強方法は効率的ではないと感じたため
Swiftの学習においては、
**まずアプリを作ってみて開発の流れを掴み、そのイメージを持って基礎学習に臨む**
という流れで勉強してみることにしました。

#今回やったこと
上記の通り、まずはアプリを作ってみて実際に開発の流れを掴むことが目標なので
YouTubeで簡単なアプリ制作の流れを紹介している動画がないか探してみたところ、
IORIさんの「BMI計算アプリを作ってみよう」という動画があったため、この動画を参考にしながらアプリを作ってみました。（参照動画→第一弾https://youtu.be/iti5drd4ecs
　　　　　　　　　　　　　　　　　　　　第二弾https://youtu.be/UjRq2Kaf0es)

#制作過程
動画は、まず簡単なXCodeの使い方から説明が始まり、その後実装していくという流れで進みました。
そのため、まず序盤で初心者が苦戦しがちな開発環境周りの初歩的な知識を得ることができました。
（基礎を学んで、さあいざ実践！てときにVSCodeの環境構築に苦戦し、ゲキ萎えした経験があるため、今後の学習に弾みをつけることができると思いました）
その後の実装においても、動画の通りに手を動かし、このようなアプリが作れました。
<img width="200" alt="Simulator Screen Shot - iPhone 8 - 2020-06-10 at 23.47.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651240/c2ca4ee3-b999-a46e-5fee-7697047a03e0.png">

<img width="200" alt="Simulator Screen Shot - iPhone 8 - 2020-06-11 at 00.08.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651240/bd9fdf82-17c4-de22-fbd9-afafcf621b24.png">

<img width="1440" alt="スクリーンショット 2020-06-10 23.47.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651240/1864f86b-8265-f3cf-9882-4194fe630907.png">

#作ってみた感想
今回の学習を通して印象的だったのは
Swiftによるアプリ制作過程は、**ゴリゴリにコーディングという感じではない**ということです。
もちろん、簡単なアプリであったため、コードの量が少ないことは明らかですし、勉強を進めていく過程で今後この感想が覆ることはあるかもしれませんが
*labelやbuttonをドラッグ＆ドロップでひっぱってきて置く*
という作業がとても斬新でした。
そのため、**”プログラミング初心者にとってとっつきやすく、制作が楽しい”**というものがSwiftに対する私個人の初感です。
この初感が得られたのも、基礎学習を始める前に実際にアプリを作ってみたからであり、
これによって今後の学習にもより一層の精を出すことができそうです。

初心者の拙い文章でしたが、最後までみていただきありがとうございます。
現場からは以上です。
LPICレベル１の学習メモ　３

101の復習の続き

###free
メモリの利用状況　空き状況を確認する

###uname
システムのOSとか調べるときに使う

###watch
コマンドを一定時間ごとに実行できる
-t コマンドの実行結果だけ表示する
-n 秒数指定

###tmux
ウィンドウの作業状態を保ったままセッションを切る。デタッチを行える。
アタッチすれば切る前の状態から始められる

##パーティション関係
###gdisk
パーティションを作成するコマンド最大で128まで作れる。
###parted
パーティション操作コマンド
check 番号
ファイルシステムの簡単なチェックを行う
###df
ファイルシステムの空き容量を確認
###du
ファイルやディレクトリが占めている容量を確認

###fsck
ファイルシステムのチェック
-a 自動的に行う
-r 対話的に行う
-A /etc/fstabにあるファイルシステムすべてに行う
【プログラミング初心者】Swift練習問題~再帰処理~

#再帰処理
##再帰処理とは
再帰関数、再帰呼び出しとも言われます。

再帰処理とは関数の処理の中で、自分自身をさらに呼び出す処理のことを言います。
以下のような状態です。

```swift
func recursiveFunction(number: Int) -> Int {
    ...
    return recursiveFunction(number: number - 1)
}
```
`recursiveFunction`の中でさらに`recursiveFunction`が呼び出されています。
この結果がどうなるかというと、呼び出された`recursiveFunction`がまたさらに`recursiveFunction`呼び出し、さらに....

というように無限に自分自身を呼び出すような構造になっています。

これでは処理がここで止まってしまい、プログラムが先に進まないので終了条件を与えます。

以下の例題で解説します。

##例題
再帰処理を使って階乗の計算結果を返す関数を作成してください。
※負の数が指定された場合は0を返すようにしてください。

```swift
func factorial(number: Int) -> Int {
    ...
}
let result = factorial(number: 5)
print(resut)
```
```:実行結果
120
```

##回答例
```swift
func factorial(number: Int) -> Int {
    if number < 0 {
        return 0
    }
    
    if number == 0 {
        return 1
    }
    
    return number * factorial(number: number - 1)
}
```
##解説
`if number < 0`は負の数の場合の処理で、どちらかというとエラー処理なので再帰とはあまり関係ありません。

```swift
if number == 0 {
    return 1
}
```
こちらが終了条件になります。

```swift
return number * factorial(number: number - 1)
```
ここで自分自身を再度呼び出していますが、引数には`number - 1`と1引いた値を与えています。

最初に`factorial(number: 5)`という呼び出しをしたとします。
するとこの部分は

```swift
return 5 * factorial(number: 4)
```
となります。
`factorial(number: 4)`の部分は

```swift
return 4 * factorial(number: 3)
```
となります。
つまり`factorial(number: 5)`は

```swift
return 5 * 4 * factorial(number: 3)
```
という結果を返すことになります。
`factorial(number: 3)`も同様なので、どんどん引数が減算されていき0となります。

引数が0となったタイミングで以下の処理に入り1が`return`されループが止まります。

```swift
if number == 0 {
    return 1
}
```
結果、`factorial(number: 5)`の呼び出しは`return 5 * 4 * 3 * 2 * 1 * 1`となり階乗計算した結果が返るというわけです。

再帰処理はループ処理の１つだと思ってもらえればいいです。
ちなみに再帰で書けるものは`while`でも書けるので最終的には読みやすい方を採用してください。

#練習問題
##練習問題１

```
漸化式：a[n+1] = a[n] + 5
初項：a[0] = 0
```
上記の等差数列の第N項を求める関数を再帰処理で実装してください。
※N < 0の場合はnilを返してください。

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/b31f128f949232c220bf#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%EF%BC%91)

##練習問題２
累乗計算を行う関数を再帰処理で実装してください。

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/b31f128f949232c220bf#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%EF%BC%92)

##練習問題３
フィボナッチ数列の第N項の値を求める関数を再帰処理で実装してください。

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/b31f128f949232c220bf#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%EF%BC%93)

#最後に
別の問題は以下に掲載しています。
また本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載も以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/
【プログラミング初心者】Swift練習問題~再帰処理~回答例

#練習問題
##練習問題１
###回答例
```swift
func getArithmeticSequence(index: Int) -> Int? {
    // エラー
    guard index >= 0 else {
        return nil
    }
    
    if index == 0 {
        return 0
    }
    
    // アンラップ
    guard let preValue = getArithmeticSequence(index: index - 1) else {
        return nil
    }
    
    return preValue + 5
}
```

###解説
```swift
guard index >= 0 else {
    return nil
}
```
エラー処理です。
a[-1]という値は存在しないのでnilを返します。

```swift
if index == 0 {
    return 0
}
```
ここが終了条件になります。
初項である`a[0]： 0`を値として返します。

```swift
guard let preValue = getArithmeticSequence(index: index - 1) else {
    return nil
}
```
ここで再帰呼び出しをします。
戻り値がオプショナル型であるためアンラップしています。
値がnilだった場合`return nil`となりますが、`index`が負の数以外nilとはならないので呼び出されません。

```swift
return preValue + 5
```
`a[n] = a[n-1]+5`を求めます。
`preValue`は第N-1項の値であるので第N項の値は`preValue + 5`で求まります。

##練習問題２
###回答例
```swift
func power(base: Double, exponential: Int) -> Double {
    if exponential == 0 {
        return 1.0
    }
    
    if exponential > 0 {
        return base * power(base: base, exponential: exponential - 1)
    } else {
        return power(base: base, exponential: exponential + 1) / base
    }
}
```
###解説
累乗は指数が正の場合掛け算、負の場合割り算、0の場合は１となります。
これを漸化式で表すと以下になります。

```:累乗の漸化式
a[n] = r × a[n-1] (n > 0)
a[n] = 1/r ×　a[n+1] (n < 0)
a[0] = 1
```
まず終了条件となる`n = 0`の場合の処理を書きます。

```swift
if exponential == 0 {
    return 1.0
}
```
指数の値の正負で計算方法が変わるため場合分けし、漸化式の通りに処理します。

```swift:正の場合
return base * power(base: base, exponential: exponential - 1)
```
```swift:負の場合
return power(base: base, exponential: exponential + 1) / base
```

最終的にどちらも指数が０となり終了条件を満たし処理が完了します。

##練習問題３
###回答例
```swift
func getRecursiveFibonacci(index: Int) -> Int? {
    guard index >= 0 else {
        return nil
    }
    
    if index == 0 {
        return 0
    } else if index == 1 {
        return 1
    } else {
        guard
            let pre1Value = getRecursiveFibonacci(index: index - 1),
            let pre2Value = getRecursiveFibonacci(index: index - 2) else {
                return nil
        }
        return pre1Value + pre2Value
    }
}
```
###解説
実装の仕方はこれまでと同じです。

```:フィボナッチ数列の漸化式
a[n] = a[n-1] + a[n-2]
a[0] = 0
a[1] = 1
```
負の数はフィボナッチ数列にはないのでnilを返します。

```swift
guard index >= 0 else {
    return nil
}
```
フィボナッチ数列の場合初期値が第１項と第０項で必要になるため終了条件がそれぞれ必要となります。

```swift
if index == 0 {
    return 0
} else if index == 1 {
    return 1
}
```
これは`a[2]`を求めるときを考えればわかります。
`a[2] = a[1] + a[0]`です。
もし`a[1]`が定義されていなければ、ここも再帰で求めようとして`a[1] = a[0] + a[-1]`を計算しようとします。
ですが`a[-1]`は定義できないため計算することができません。
これを防ぐために終了条件として第１項と第０項を定義しています。

あとは漸化式に当てはめて計算します。

```swift
guard
    let pre1Value = getRecursiveFibonacci(index: index - 1),
    let pre2Value = getRecursiveFibonacci(index: index - 2) else {
        return nil
    }
return pre1Value + pre2Value
```

#最後に
再帰のコツは終了条件と１つ前の処理との関係を明確にすることです。
今回はわかりやすいため漸化式として前後関係が明確な数列を扱いましたが、再帰は数列だけではありません。
別途数列以外の問題も投稿していきます。
以上。
LPICレベル１の学習メモ　２

101の復習の続き

##よくわからなくなるviの使い方
###入力モード
i　カーソルの前に入力
a　カーソルの後に入力
I　行の最初の文字の前に移動
A　行の最後に移動
o 　下に空白行
O　上に空白行

###カーソル操作
　　　　ｋ
　　　  　↑
ｈ　←　　　　→　ｌ
　　　  　↓
　　　　ｊ

nG ファイルのn行目
:n ファイルのn行目