OmniAICreator/Qiita-1.07M huggingface dataset:
【Excel関数】指定範囲で空白でない最初のセル位置を取得したい

# やりたいこと
次のような表があった場合に、各行で値が入っている最も左のセルがどこなのかを知りたい。
これをExcelのワークシート関数（VBAを使わずに）だけで実現したい。
![img_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565211/c9d35268-9c75-d226-421b-b7708cf8ef09.png)



# どのようにして取得するのか
### 実行環境
* Excel のバージョン
    * 確認環境：Office365
    * ただし、INDEX関数とMATCH関数が使えれば、他のバージョンでも利用可能なはず  

### 方針
INDEX関数が、第一引数に配列を指定できることを利用します。
（下記の1のパターン）

```MEMO:INDEX関数の引数
1. INDEX(配列, 行番号, [列番号])
2. INDEX(参照, 行番号, [列番号], [領域番号])
```


### 数式の推移と解説
F列の数式を入れることで、各行の最も左にある値の入ったセルの列番号（G列）を取得することができます。
![img_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565211/18c160e7-6594-90d3-fab7-beaf5ec66275.png)


表の4行目を例として解説します。

1. `= MATCH(0,INDEX(0/(A4:E4<>""),),0)`
  INDEXの第一引数に `0/(A4:E4<>"")` を指定。ここに注目です。

2. `= MATCH(0,INDEX(0/({FALSE,FALSE,TRUE,TRUE,TRUE}),),0)`
  `(A4:E4<>"")` は、A4~E4セルが空欄かどうかの判定結果が配列で格納されます。

3. `= MATCH(0,INDEX({#DIV/0!,#DIV/0!,0,0,0}),),0)`
  Excel で論理値を数値計算する場合には、`TRUE = 1`、`FALSE = 0` として扱われます。
  その仕様を利用して、各要素を論理値で除算することにより、`FALSE`なら`#DIV/0!`（0割りによるエラー）、`TRUE`なら`0` になります。

4. `= MATCH(0,{#DIV/0!,#DIV/0!,0,0,0},0)`
  MATCH関数の第一引数（検査値）の`0` が第二引数（検査範囲）のどこにあるか探します。

5. `= 3`
  このときMATCH関数の仕様により、最初に見つかった要素番号が返却されます。つまり、3つ目の要素に初めて`0`があるので`3`が返却されます。


#### 数式中の`0`の必要性
MATCHで引っ掛けられればよいので、別に`0`でなくてもよいです。
なので、
`= MATCH(0,INDEX(0/(A4:E4<>""),),0)`
のMATCHの第一引数と、INDEXの第一引数の分子が一致していればよいです。
`= MATCH(999,INDEX(999/(A4:E4<>""),),0)`
でもOK。


#### 行じゃなくて列でとりたい！！
そんな場合には、
上記では行内で検索する場合の解説をしましたが、列内で検索したい場合にはINDEXの第一引数の分母にしている範囲を縦に指定すればよいです。
例：`= MATCH(0,INDEX(0/(A2:A6<>""),),0)`


## 別解　※追記※
`= MATCH(TRUE,INDEX(A4:E4<>"",),0)`　もしくは　
`= MATCH(FALSE,INDEX(ISBLANK(A4:E4),),0)`
という解き方もありますよとコメントで教えていただきました。ありがとうございます。

こちらの解き方も上記同様に数式の推移をみてみます。

1. `= MATCH(TRUE,INDEX(A4:E4<>"",),0)`

2. `= MATCH(TRUE,INDEX({FALSE,FALSE,TRUE,TRUE,TRUE},),0)`
　`(A4:E4<>"")` は、A4~E4セルが空欄かどうかの判定結果が配列で格納されます。

3. `= MATCH(TRUE,{FALSE,FALSE,TRUE,TRUE,TRUE},0)`
　MATCH関数の第一引数（検査値）のTRUE が第二引数（検査範囲）のどこにあるか探します。

4. `= 3`
  MATCH関数の仕様により、最初に見つかった要素番号が返却されます。つまり、3つ目の要素に初めてTRUEがあるので`3`が返却されます。

こちらのほうがシンプルだし、各要素での除算がない分、計算量も削減できますね。


## 実務で使う場合には
指定範囲内に値が入ったセルが一つもない場合、`#N/A`エラーとなってしまうので、IFERROR関数などで包むのがよいです。
例：`= IFERROR(MATCH(0,INDEX(0/(A4:E4<>""),),0),"")`
例：`= IFERROR(MATCH(TRUE,INDEX(A4:E4<>"",),0),"")`


# さいごに
上記のようにして、指定範囲で空白でない最初のセルの位置を取得することができました。
これで取得できるのは、あくまで相対位置です。
行や列の位置がわかれば、あとは INDEX関数で指定するなり、OFFSET関数でズラすなりすればセルの値も取得できます。
煮るなり焼くなり好き放題してください。
TUNモジュールによるDockerのロードエラーとlinuxカーネル

こちらは[ITRC Advent Calendar 2020](https://adventar.org/calendars/5535)の4日目の記事です。
前の記事: [@chaya2z](https://twitter.com/chaya2z)さんの[eBPF入門する](https://chayanika.netlify.app/blog/eBPF-beginners)
次の記事: 私の[NetworkManagerで802.1xプロトコルを使用したwifiのホットスポットに機器を繋げたい](https://qiita.com/blue_key/items/943b654d668216fd3b39)
## エラー文

failed to create endpoint ```[コンテナ名]``` on network bridge: failed to add the host (```[linuxの仮想インターフェイス名]```) <=> sandbox (```[dockerの仮想インターフェイス名]```) pair interfaces: operation not supported

## 環境

Arch Linux

## 原因

カーネルアップデート後に正常に情報を受け取れなかった。

## 解決方法

再起動する

## 詳しくやる

今回のエラーで私はdockerがlinuxのカーネルで動いていると実感できたので、もっと詳しく原因を探ってみたいと思った。

### 詳細な原因

archlinuxではカーネルをアップデートすると```/usr/lib/modules/[カーネルのバージョン]```にあるディレクトリが古いバージョンが削除されアップデートしたバージョンが入れ替わる。
dockerはここにあるモジュールを使っているのでディレクトリ名が変わり呼び出せなくなるのが原因。
今回必要としているモジュールはTUNモジュールでこれはネットワーク層をシミュレートし、IPパケットなどを操作できるものであり、今回はホスト(linux)とコンテナ(docker)間でvethによるL2のトンネルを張るために必要。

以上のことから

- TUNモジュールのロードが出来ていなく、ホスト(linux)とコンテナ(docker)間でネットワークを張れていない。
- 理由は```/usr/lib/modules/[カーネルのバージョン]```がカーネルアップデート前後でディレクトリ名が異なるから。
- 解決方法はカーネルを再読込みしてモジュールをロード出来るようにする
- よって、再起動する必要がある

### どうしても再起動したくない場合

個人的に再起動して解決するとなんか負けた感があったので悪あがきとしての解決方法。
```kexec```を使用する。```kexec```は現在動作中のカーネルから他のカーネルをロードして起動でき、手動で更新することもsystemdを使用して更新することも出来る。詳細は[こちら](https://wiki.archlinux.jp/index.php/Kexec)。

## 感想

とても恥ずかしい話なのですが前々からdockerはlinuxのカーネルを使って動いているという大雑把の理解しかしておらず、実感が湧かずに何となく使っていました。
それもその通りで書いて字の如く「実」際に「感」じてやっと動作していることを認識出来ました...
今回は再起動すれば直るエラーでしたが仕組みを知るのにとっつきやすそうだったので挑戦してみました。linuxカーネルの方ばかりになりdockerとの関係性を得られるようなエラーではありませんでしたが興味を持つきっかけになったので今度も関係性を探っていきたいです。

## 参考

- [Docker: failed to add the pair interfaces (operation not supported) Serverfault](https://serverfault.com/questions/738773/docker-failed-to-add-the-pair-interfaces-operation-not-supported)
- [TUN/TAP Wiki](https://ja.wikipedia.org/wiki/TUN/TAP)
- [Kexec ArchWiki](https://wiki.archlinux.jp/index.php/Kexec)

## 失敗

私の知識不足で起きた失敗例を戒めのために記述しておく。

### modprobeでモジュールをリロードする

そもそも古いカーネルバージョンのディレクトリが削除されて入れ替わっているので存在しないとエラーが出る。

- ```modprobe```: カーネルモジュールをロードするコマンド
- ```depmod```: モジュールの依存関係リストを更新するコマンド
- ```lsmod```: ロード済みのカーネルモジュールを表示するコマンド

1. ```lsmod```で現在のモジュールを確認する
2. ```modprobe```を使うために```depmod```でモジュールの依存関係リストであるmodules.depファイルを更新する
3. ```modprobe```でモジュールを更新する
4. ```lsmod```でモジュールが更新された事を確認する
railsで画像をファイルに配置して、表示させ、装飾させる方法

#はじめに
　アプリケーションのUIを整えるために画像を使った。配置する場所や装飾の方法を記録しておく。

##画像の表示
###配置
`app/assets/images`に配置した。

###表示させる
　表示は、HTMLに

```erb:html.erb
<%= image_tag "ファイル名.png", class:"chat-image" %>
```

###サイズの変更
　サイズの変更はCSSに`width`と`height`で装飾する。

```css
.chat-image {
  width: 50px;
  opacity: 0.5;
}
```

`opacity`によって透明度を変えることもできる。
COVID-19の感染者数をProphetで予測 更新

#概要
[2週間前](https://qiita.com/Ihmon/items/7a52bd076a3e77b0d443)にProphetで予測した感染者数を最新のデータで再度予測した
差分だけを記載する

- 実施: 2020年12月04日
- パケージ：Prophet

##Prophetで感染者数予測
2週間前のProphet予測では12月上旬は3000人を超えていたが、いまは幸い2500人くらいとなっている
この先30日の国内感染者数予測は下図となった
傾向は前回の予測同様、12月中旬に向けていったん減少するが、その後増加するらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/a1985be7-8a7a-4f86-ed19-9c337705692d.png)
試しに60日先まで予測すると下図となった
12月にいったん減少するが第一波、二波の後にあった小康状態が今回はなく、1月はずっと増加する予測
現実味を帯びた嫌な波形になったように感じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/08d19266-f8bc-1e61-8f01-e83a1e71ddcd.png)

今回は国内感染の陽性率も予測させてみた
データ更新以外のコードは前回の続き

```python
df_ratio = pd.DataFrame()
df_ratio['ds'] = pd.to_datetime(df_dom['DS'])
df_ratio['y'] = df_dom['pos_def'] / df_dom['test_def'] * 100   # 国内陽性率

m = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True)
m.fit(df_ratio[95:])     # 5月までの生データが暴れていたので前半をオミット
future = m.make_future_dataframe(periods=30, freq='D', include_history=True)
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
fig = m.plot(forecast, figsize=(20, 10))
ax = add_changepoints_to_plot(fig.gca(), m, forecast)
ax = fig.gca()
ax.set_title("Positive / Tested", size=16)
ax.set_xlabel("date", size=16)
ax.set_ylabel("Ratio (%)", size=16)
ax.tick_params(axis="x", labelsize=14)
ax.tick_params(axis="y", labelsize=14)
```
微増といったところか…
PCR検査は感染者数増加に追い付いていると考えられる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/3d24f3e3-3e6e-acdf-703b-173c2aae6304.png)

なお、空港検査でのPositive判定予測は下図となった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/01adc4a4-bf97-d4ad-cfac-b48fbd2ea8fe.png)
IntelliJ IDEA 2020.3 にしたら Gradle から呼び出していた Spring Boot のカスタム bootRun で起動したJavaアプリケーションがデバッグできなくなった

先日 IntelliJ IDEA 2020.3 がリリースされたので、何も考えずにアップグレードして使用していた。

開発中のプロジェクトはSpring BootでWebFluxを利用しているJavaプロジェクトだったが、
意図しない挙動をしている部分があったのでブレークポイントを仕掛けてデバッグを開始した。

しかし、不具合と思われる箇所が呼び出しされるはずのAPIを何度呼び出してもブレークポイントにヒットしない。

最初はAPI自体が呼び出しされていないのかと思ったが、呼び出しされた時だけに出力されるログは出力されている。

どうやら一部のGradleタスクから実行されたJavaプロセスがデバッグでプロセスは起動するが、
デバッガーがプロセスにアタッチされていない様だった。

Gradleの`JavaExec`などのタスクを直接実行するタスクだとデバッガーがアタッチされるが、
別のGradleタスクからJavaプロセスを呼び出すタスクを呼び出しした時にデバッガーがアタッチされない様だった。

今回ブレークポイントがヒットしなかったのは`bootRunDev`というカスタムタスクだった。
このタスクは`org.springframework.boot`プラグインの`bootRun`タスクに渡すJVMオプションを変数に追加して、
`finalizedby`経由で`bootRun`タスクを開始するというものだった。

問題は`bootRunDev`タスクから起動したJavaアプリケーションは先日までデバッグできていたこと、
そしてJunit Jupiterのテストをデバッグ実行した時はブレークポイントで停止するということだった。

IntelliJ IDEAのバージョンアップでGradle経由でJavaプロセスのデバッグ自体が出来なくなったわけではなさそうだった。

何時間が設定をいじった後で、デバッグ構成のGradleテンプレートを確認すると「Debug all tasks on the execution graph」という項目を発見した。

該当の設定にチェックを入れて`bootRunDev`タスクを実行するとブレークポイントがヒットするようになった。

![no-titile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603173/319a5c26-acba-baa1-e87a-c02aa6f50cfc.png)


IntelliJ IDEA 2020.3 依然と設定が変わったのか不明だが、
とにかく該当の設定変更でデバッグは出来るようになった。

欠点はこの設定を有効化すると、Gradleタスク中に実行されるすべてのコードでブレークポイントが反応するようになる。

例えば`build`タスクの際に実行されるJunitテストコードに加えて、
テストコードから呼び出しされるライブラリやJDKのコードに仕掛けたブレークポイントもすべて反応するようになる。

とはいえ、開発中にデバッガーが動作しないという状況には代えられない。
プリザンターと思いは不滅なライセンス

##趣旨
本記事は Pleasanter Advent calendar 5日目向けに、プリザンターのライセンス形態について紹介します。
プリザンターはAGPLで公開されていて、再配布の際、ライセンスが伝搬します。ユーザは自分の使っているソフトウエアがどんなものであるのか知れるべき、といったOSSの思いが子から孫へと紡がれます。
そんなプリザンターも採用するAGPLと、もう一つの提供形態である商用ライセンスについて記載します。
とくにプリザンターの商用ライセンスについて、購入しなければ手に入らないこともあり、その内容を知る機会は多くないので、適用範囲や利用法も紹介します。
Pleasanterを利用した開発などで、ライセンス形態が気になっていたり、項目数が足りなくて拡張したいなとおもっていたり、そんな方にお勧めです。

## Pleasanter のライセンス (AGPL と商用ライセンスの デュアルライセンス)
Pleasanter (プリザンター) は、OSSとして提供され、ソースコードが公開されています。
[git: Implem.Pleasanter](https://github.com/Implem/Implem.Pleasanter)
ここで公開されているPleasanter のライセンスは Git に上がっている LISENCE ファイルの通り GNU AFFERO GENERAL PUBLIC LICENSE になっています。
AGPL/GPLはいわずもがなソフトウエアの再配布において伝搬性があります。[参考：日本OSS推進フォーラム- ライセンスの伝搬性] (http://ossforum.jp/node/798)

そしてもう一つ、Plesanterは商用ライセンスとしても提供されています。
[Enterprise Editionとは](https://implem.co.jp/enterprise-edition/#info)
この商用ライセンスのPleasanter を手に入れる方法はたった一つ。
年間サポートサービスを利用すると、商用ライセンスが提供されることになっています。

AGPLのライセンス内容はGitで公開されていますので読めばわかりますが、商用ライセンスの利用許諾は、どこにも見当たりません。
通常、年間サポートサービスを契約しないと見る機会がなく、内容を知ることもめったにありません。
そこで次章でその概要を紹介します。

## ソフトウエア使用許諾契約書
商用ライセンスは「ソフトウェア使用許諾契約書」によって提供されています。
(2020年12月5日現在) 利用範囲はOSS版より狭められていて、

- 使用者はランセンス1つにつき、1台のコンピューターにインストールできる。
- 第三者に利用させてはいけない。 
- 年間サポートプレミアムプラン契約なら、関係会社まで利用可能

となっています。
誰もかれもに使わせても良いわけでは無くなっていますね。
(※別途個別契約がある場合には本許諾に優先するとの条項もあるので、個別に条件が変わるケースもあるようです。さすが商用。ビジネス万歳。)

また禁止事項として

 - 二次的著作物を創作すること
 - 複製物を第三者に対して頒布

などもダメと定められていますのでOSS版のように再配布も許可されていません。
この制限はOSSとして紡がれないプリザンターは一代限りということであります。



## Pleasanter と 項目数
利用範囲を狭められるだけなら、利用価値ないのでは？ といった疑問もあります。
AGPLの伝搬性を避けるということのほかにあるメリットはなんでしょう。

商用ライセンスはEnterprise Edition という名で提供されていますが、このEnterprise Edition 適用の特典として 「項目数の増加」が詠われています。

どういうことか。

Pleasanterで標準で利用可能なデータ項目数は1テーブル当たり156個です。
もうちょっと説明すると、Pleasanter で利用できる データ項目の種類は下記の6種類です。 これがそれぞれA~Zの26個までリザーブされていて、 1テーブルあたり利用できるデータ項目は6x24=156個となっています。

- 分類
- チェック
- 日付時間
- 添付ファイル
- 説明（テキストや画像貼り付け）
- 数値

(詳しくは [Enterprise Editionとは](https://implem.co.jp/enterprise-edition/#info)）

通常、156項目も使えれば事足りてしまいますが、そこはデータ管理を要する業務アプリ。どうしても項目が足りなくなることもあります。
そんな時、Enterprise Edition であれば、項目数を1テーブル900項目まで増やせる特典が提供されます。

## Pleasanter の Enterprise Edition の適用方法
Pleasanter のEnterprise Editonは前述のとおり、年間サポートサービスを契約するということで提供されるのですが、どのように提供され、どのようにプリザンターは商用ライセンス扱いになるのでしょうか。

サポート契約後、Enterprise Edition のライセンスファイルが提供され、それを組み込むことによって商用ライセンスのプリザンターとして動作することになります。
その違いはプリザンターのバージョン情報表示にて確認できます。
OSS版は下記のようにライセンス表示がなされますが、このライセンス表記が「商用ライセンス」と表示されるとともに、ライセンス先のユーザー名が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546566/3f4a42bc-ff90-d587-1990-ad3835952126.png)

ライセンスファイルを組み込む時に、テーブルを拡張する設定ファイルに、必要な項目増加数をセットすることによって既存の156項目から、さらに必要なデータ項目を最大900項目まで増やすことができるようになります。


##あとがき(駄文)
こんにちは。
いまは営業をやっていますがその昔はエンジニアだったこともあるんですよ。
Qiita に記事を書く上で、技術的な 記事を書こうと思うものの、コードはめっきり触っていないので、なにか技術に役立つことを、と思い、私でも知り得る情報で、かつ 参考になるものは何か、なんて考えて書きました。
この記事を書いている12月4日は鬼滅の刃23巻の発売日。 思いがつながれるという意味ではOSSも近しいものがあるかもしれません。
【合格体験記】AWS認定ソリューションアーキテクト–アソシエイト(SAA-C02)

# 本記事の概要

AWS認定ソリューションアーキテクト–アソシエイト(SAA-C02) を受験し取得したので勉強方法を備忘録として投稿します。
AWS-SAAを受けようと思っている方や、現在勉強している方がこの記事を参考の一つにしていただけたら幸いです。

# 使用した教材

Udemy
・[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得] (<https://www.udemy.com/course/aws-and-infra/>)
・[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）] (<https://www.udemy.com/course/aws-associate/>)
・[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）] (<https://www.udemy.com/course/aws-knan/>)

WHIZLABS
・[AWS Certified Solutions Architect Associate] (<https://www.whizlabs.com/aws-solutions-architect-associate/>)

AWS Black Belt
・[AWSサービス別資料] (<https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/>)

# 勉強の流れ　その１

最初はAWSとはなんぞや？状態でしたので
**「AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得」** を実施。

本当にゼロからでもハンズオンを通して一般的な`VPC`+`EC2`+`ELB`+`RDS`+`Route53`+`S3`+`CloudFront`+`CloudWatch`+`IAM`を学ぶことができるので初学者にはとてもオススメ。（というか、今回使用した教材はすべてオススメします。）

# 勉強の流れ　その２

その１の教材を終えたらAWSの基本的なサービスはおさえている状態になったので、次は
**これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版)** を実施。

こちらの教材はより試験対策的な内容です。
といっても、以前の教材では扱われなかったサービスを学ぶことができます。
かぶる部分が多々ありますので、私は適宜飛ばしながら学習しました。

こちらはかなりボリュームが多く、人によってはモチベーションを保つことが難しいかもしれません。
ちなみに私は着手してから終えるまで約1か月はかかりました。**スケジューリングって大事。**

# 勉強の流れ　その３

この後はひたすら問題演習です。
**【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）** で問題に慣れましょう。

こちらの教材は6回分の問題が含まれていますが、初回は3～5割程度の得点率でした。
3週ほど回し、8割くらいとれるようになったのでもういいかな？と思いましたが、
`「AWS-SAAは問題演習で解いた問題はほとんど本番では出ない」`
という情報がネットに沢山転がっていたので不安になり、
**AWS Certified Solutions Architect Associate (WHIZLABSのコース)** を追加で実施。

こちらはすべて英語の教材となります。
これを機に英語を克服するのもアリかも？Google翻訳にかけてしまうのも全然アリ。
ただ、私が試した限りはちょっと問題の意図を汲み取り辛いかなと思いました。

WHIZLABSのコースではセクション毎にまとめられている問題があるので、
最後の総復習のような形で利用しました。
ちなみに得点率は5割～7割ほどで、試験直前の1週間でやっていたのですが
**「これ本番大丈夫か...?」** というメンタルになりました。

# 試験結果

受験日：2020年11月29日
スコア：722
合格ライン：720
結果：pass

[証明バッヂ](https://www.credly.com/badges/c14a41f1-4909-48a4-965e-e9a0bb5aaa98/public_url)

**うーん、ギリギリ！ｗ**
正直言って、自信をもって解答できた問題よりも
**「たぶんこっちかな～」** というノリでしか選べない問題のほうが多かったです。

# 受験後の感想

ネットの情報通り教材で出てくる問題と本番の問題はほとんど一致しませんでした。
この試験では、体系的にAWSのサービスを理解する必要があるということですね。
単純に問題演習を通した暗記では突破できないので私のようなタイプには難しい試験でした。

でも、試験としては確実にその方針のほうが良いですよね。
今後も`AWS認定SysOpsアドミニストレーター–アソシエイト`と
`AWS認定デベロッパー–アソシエイト`の三冠目指して頑張ります！

この記事を開いていただき、また、
ここまで読んでいただきありがとうございました。
Progateをやり終えたあと何をすればいいのか考えてみた。

Progateとかで勉強したけど、次何していいかわからないという人向けに書いてみます。

１.techpit(アプリ開発などの手順が有料ですが学べます。）
２.Udemy（有料ですがセール期間にお得にアプリ開発などの動画教材で学べます。）
３.ドットインストール（一部有料でアプリ開発などが学べます。）

上記のサイトで勉強するといいかもしれません。

上記のサイトでアプリ開発の流れを掴んだら、上記のアプリのカスタマイズをしてみてはいかがでしょうか？

ポートフォリオなどの作成に役に立つと思います。

最近は質の高いポートフォリオを作成される方が多いので、これだけでは不十分かもしれませんが。

上記で物足りない場合は、１からオリジナルのアプリを作ってみてはいかがでしょうか。

あくまでも私が考えただけなので、責任は取れませんが、参考になれば幸いです。

最後まで読んでくださりありがとうございました。
【Swift】Enter押したときとキーボード領域以外をタッチしたときにキーボードを閉じる

# どういうことか

たとえばiPhoneでユーザー名入力フォームとかをタッチすると『入力モード』になってキーボードが出てくる。で、タイトルにある行動をしたらキーボードを閉じたい。

## はじめに

ViewControllerクラスでUITextFieldに対して『**デレゲート**』の呪文を使い、我らがアップルのこしらえてくれたメソッドを使えるようにしておく必要がある。

```swift
class ViewController: UIViewController,UITextFieldDelegate {
  // 中略
}
```

## 閉じる

定型文として使っていいと思う。

```swift
  // タッチでキーボードを閉じる
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
  }
  
  // リターンキーを押したときにキーボードを閉じる
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
  }
```
GItHub Pagesから他サイトへのリダイレクト設定をページ毎に行う (jekyll-redirect-from使用)

## 論よりコード

GitHub PagesのRootに指定されているフォルダ内に `jekyll-redirect-from` を使うと宣言した `_config.yml` を配置し、リダイレクトしたいHTMLファイルの中身にリダイレクト先を `redirect_to` で指定すれば実現できます。

サンプルをこちらに置いておきました。 : https://github.com/ma2shita/example-for-jekyll-redirect-from
※注意: catch all的な方法は未調査です。

```console:_config.ymlの作成と配置
$ cd YOUR_GITHUB_REPO/ROOT_OF_GITHUB_PAGES/
$ cat << _EOT_ > _config.yml
plugins:
  - jekyll-redirect-from
_EOT_
$ git add . && git commit -m "Add jekyll-redirect-from" && git push
```

`https://GITHUB_PAGES/YOUR_GITHUB_REPO/foo/bar.html` を `https://example.jp/dest.html` にリダイレクトする設定はHTMLファイルに書きます。

```console:HTMLファイルにリダイレクト先を書く
$ cd YOUR_GITHUB_REPO/ROOT_OF_GITHUB_PAGES/
$ cat << _EOT_ > foo/bar.html
---
redirect_to: "https://example.jp/dest.html"
---
_EOT_
$ git add . && git commit -m "Redirect" && git push
```

以上です。

## GitHub PagesではMETAタグによるHTTP 200リダイレクト

GItHub Pagesから他サイトへのリダイレクトは [jekyll-redirect-from](https://github.com/jekyll/jekyll-redirect-from) が利用できます。
ただしリダイレクト手法はHTTP 200リダイレクト、いわゆるMETAタグによるHTMLリダイレクトです。

GitHubの公式には書いてありませんが、GitHub Pagesは `.htaccess` といったHTTP 3xxによるサーバサイドリダイレクトをサポートしていないようです。[GitHub Pagesで使えるプラグイン一覧](https://pages.github.com/versions/)にjekyll-redirect-fromが入っているのはそういった背景だと考えられます。

### HTMLファイル内の書式

HTMLファイルではありますが、以下の書式となります。

```HTML
---
redirect_to: "https://example.jp/dest.html"
---
```


### リダイレクト設定済みで出力されるHTMLの例

```html
<!DOCTYPE html>
<html lang="en-US">
  <meta charset="utf-8">
  <title>Redirecting&hellip;</title>
  <link rel="canonical" href="https://example.jp/dest.html">
  <script>location="https://example.jp/dest.html"</script>
  <meta http-equiv="refresh" content="0; url=https://example.jp/dest.html">
  <meta name="robots" content="noindex">
  <h1>Redirecting&hellip;</h1>
  <a href="https://example.jp/dest.html">Click here if you are not redirected.</a>
</html>
```

### SEOへの懸念

HTTP 3xxリダイレクトでないと心配になるのがSEOですが、結論としては大丈夫そうです。

> W3C では、このタグを使用しないよう推奨しています。Google では、サーバーサイドの 301 リダイレクトを使用することをおすすめしています。
https://support.google.com/webmasters/answer/79812?hl=ja

以上のようには書かれていますが、サポートはされているので「しょうがないなぁ...」というお気持ちなんだと推測できます。

ただ、**検証結果を見つけられなかった**ので、過度な期待は禁物です。また、できる限りGitHub Pagesのコンテンツへリンクしている部分をリダイレクト先に書き換える事をおすすめします。

## ディレクトリインデックスにも設定可能

`https://GITHUB_PAGES/YOUR_REPO/foo/` と、ディレクトリインデックスを `https://example.jp/foo/` にリダイレクトしたい場合は `index.html` を対象にします。

```console

$ cd YOUR_GITHUB_REPO/ROOT_OF_GITHUB_PAGES/
$ cat << _EOT_ > foo/index.html
---
redirect_to: "https://example.jp/foo/"
---
_EOT_
$ git add . && git commit -m "Redirect" && git push
```

## あとがき

catch all的な方法は未調査ですが、だいたいこういう時って除外したいとか書き換えルールが微妙に異なることがあるので、１つ１つ丁寧にやった方が良かったりします。

SEOのところでも書きましたが、なるべく早くリンク元の修正をしていきたいですね。

EoT
「なんかDB遅いな。調べておいて～」って振られた時に見ること

# ALHアドベントカレンダー５日目
ALH株式会社のアドベントカレンダー、５日目です！
https://qiita.com/advent-calendar/2020/alhinc

弊社では去年もアドベントカレンダーを実施していて、自分は「GASを好きなエディタでコーディング」という題で記事を書きました。
地味〜にLGTMが伸びていてニーズはどこに転がってるかわからんな〜、って実感してます。
https://qiita.com/wol/items/c8633f706c96fc4daaab

# 書くこと
エンジニアとして働き始めて丸3年が経ちました。
業務の中で「なんかDB遅いな〜。調べておいて」みたいな雑なフリをされた中で学んだ、基本的なDBチューニングについてザックリとした観点を紹介しようと思います。
基本的にはSQL中心です。

## 前提として
パフォーマンスが出ないのは本当にDBが原因でしょうか？
アプリケーションにおけるパフォーマンス低下の要因は多岐に渡ります。
回線、アプリケーションサーバ、DBサーバ、アプリケーションロジック、フロントのレンダリング速度。ぱっと思いついただけでもこれだけあるので、自分の認識していない部分も含めて本当に多くの要因が考えられると思います。
まずはボトルネックの特定のために適切な手段で計測を行い、ボトルネックを特定しましょう。
（お医者さんが検査もせずいきなり手術するようなもんですね）

# 本題

## すごい頑張ってる
欲しいデータをSQLでまとめて取ろうとした結果、結合と抽出を際限なく行う超大型クエリが生み出されていることがあります。
#### なぜ遅い？
JOIN自体は便利で素晴らしいものなのですが、JOINするテーブルが巨大だと往々にして処理が遅くなります。複数テーブルのJOINとなると、巨大なテーブルが混ざる可能性も高まりリスク↑。性能試験がおざなりだと、運用始まってレコード増えてきたら…という時限爆弾。
SQLという観点からは外れますが、適切に正規化してテーブルをコンパクトにしたり、アプリケーション側に結合処理を任せてみると良いかもしれません。

## ナンニデモ=インデックス
DBパフォーマンスを語る上で外せないインデックスのお話。
使わないインデックスほど足を引っ張るものはありません。
#### なぜ遅い？
インデックスが増えると、特にINSERT/UPDATE/DELETEのパフォーマンスに影響を及ぼします(オーバーヘッド)。1件1件の処理速度をみれば大した問題ではないかもしれませんが、バッチ処理の場合は話が別。1ミリ秒でも早いに越したことは無いので大量のインデックスを見つけたら警戒しましょう。

## 男気インデックス
あまりの潔さにインデックスがほとんど張られていない状態。やむにやまれない事情でこうしているイメージ。
#### なぜ遅い？
そもそもインデックスが無いとどうなのかと言うと、見出しが無いということ。見出しがないと1ページ目からパラパラめくって探すのでそりゃ遅いよって感じですね。インデックスを貼るとオーバーヘッドが発生すると言いましたが、オーバーヘッドよりインデックスを貼ることによる恩恵の方が大きいのかどうかを考慮してインデックスを設定しましょう。
例えばカーディナリティが低い(候補値が少ない)カラムに対してインデックスを張っても、データを絞り込み切れないので効果が非常に薄いということになります。こういう場合はインデックスは張らない方が良い可能性もあります。

## インデックスを有効活用していない
SQLを実行した結果、インデックスが効いていないパターン
#### なぜ効かない？
- LIKEを使った中間/後方一致  
インデックスは見出しなので前方一致でないと機能しない
- WHEREの左辺に関数や、計算式を設定している  
これはインデックスを張る時に関数を指定してやれば解消することもあります
- 暗黙の型変換  
intのカラムに対して抽出条件に文字列を指定するとRDBMSが型変換を行ってクエリ実行してくれるのですが、この変換が行われるとインデックスを使用しません
- 否定の使用

まだあったと思うのですが、とりあえずこの辺りはインデックス効かないので別の方法で書けないかどうか検討してみましょう。

## 社内の他システムからDBの設定値を流用
結構あるんですが、社内の他サービスの設定をそのまま流用しているパターン。
#### なぜ遅い？
具体的にこの数値！みたいなのは出せませんが、システムによってテーブル構成は違うわ、レコード数も違うわ、DBリソースは異なるわ、発行するクエリも別物だわなので、他のシステムのDB設定はあくまで参考に留めておくべきと考えています。
設定値変更→テストを細かく回して最適な設定を少しづつ探るのがなんだかんだ近道だと思います。
まぁそれが難しいんですよね:sweat_smile:


# 終わりに
なんだかとっ散らかってしまいましたが、まずはこの辺りを確認するようにしています。
あとは実行計画取ったり、スロークエリを調べたりですね。（どちらかというとこっちを先に確認すべき！）
コネクションの問題もあったりで、DB沼の底はとても深そうです。
正直、DBに関しては浅瀬でチャプチャプしているレベルなのでこれを機にしっかりと腰を据えて向き合ってみようと思います。

### 余談
色々偉そうに書きましたが、自分はここにあるアンチパターンのほとんどを体験済みです。
やはり人は痛みを伴うことで学ぶ生き物・・・
SQL Server ライセンスキーの更新／エディション アップグレード

#はじめに
この記事は、[Azure SQL & Synapse Analytics Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-sqldb-and-synapse) の 12 日目の記事です。

SQL Serverでは、バージョンのアップグレード **(例: SQL Server 2017 から SQL Server 2019 へのアップグレード)** だけではなく、エディションのアップグレード **(例: SQL Server 2019 Evaluation Edition から SQL Server 2019 Enterprise Edition など)** についてもサポートされています。
エディションのアップグレードは、**評価版 (Evaluation Edition)** から **製品版 (SQL Server Standard Edition、Enterprise Edition など)** にエディションを変更したい場合、上位エディションの機能を使用したい場合などに検討することになることが多いかと思いますが、同一エディションのアップグレード **(例: SQL Server Standard Edition -> SQL Server Standard Edition)** も実施することが可能です。
例えば、A サーバーの SQL Server Standard Edition に、B サーバーで使用する予定であったプロダクト キーを誤って適用してしまった場合、**同一エディションのアップグレードを実施することで、プロダクト キーを入れ替えることが可能**になります。
今回は、**エディション アップグレード**の方法について紹介しようと思います。


#目次
[1. エディションのアップグレードの制限事項について](#1-エディションのアップグレードの制限事項について)
[2. エディションのアップグレード手順](#2-エディションのアップグレード手順)
[3. 参考情報](#3-参考情報)

#1. エディションのアップグレードの制限事項について


**SQL Server AlwaysOn フェールオーバー クラスター インスタンス (FCI) 環境**の場合、以下のパターンのエディションの変更は制限されている点に注意が必要です。

**・SQL Server Enterprise -> SQL Server Developer, Standard, Evaluation への変更**
**・SQL Server Developer -> SQL Server Standard, Evaluation への変更**
**・SQL Server Standard -> SQL Server Evaluation への変更**
**・SQL Server Evaluation -> SQL Server Standard への変更**

#2. エディションのアップグレード手順
**1) SQL Server のインストールメディアを挿入します。**
※ インストール メディアのファイルがローカルドライブに保存している場合は、インストール メディアを挿入する必要はありません。

**2)  SQL Server インストール センターを起動します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/389499ff-9efa-51cf-fbfb-6e4ddbbff844.png)

**3)  「メンテナンス」-「エディションのアップグレード」を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/95a8838e-0afc-78c9-b056-aaec652c7503.png)

**4)  「プロダクト キーを入力する」を選択し、「プロダクト キー」を入力後、「次へ」を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/a5648fba-cafb-8224-b647-0e5b978c20ce.png)

**5)  「ライセンス条項と次に同意します」にチェックし、「次へ」を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/f2c6412e-6877-0ccc-a7cc-5e33eb619535.png)

**6)  「SQL Server の インスタンスを指定してください」欄でエディションのアップグレード対象の SQL Server インスタンスを選択し、「次へ」を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/418f8d77-f2ac-58fd-9979-3e9d1320824f.png)

**7)  「アップグレード」を選択し、アップグレード処理を実行し、正常に完了することを確認します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/80b8a499-4297-751d-26e1-6c8bb89c2591.png)

**[補足]**
上記手順は、SQL Server 2019 に対するエディションのアップグレード手順になりますが、**他のバージョン (SQL Server 2012, 2014, 2016, 2017)** でも同様の手順でエディションのアップグレードを実施することが可能です。

#3. 参考情報
・[サポートされているバージョンとエディションのアップグレード (SQL Server 2019)](https://docs.microsoft.com/ja-jp/sql/database-engine/install-windows/supported-version-and-edition-upgrades-version-15?view=sql-server-ver15#sssqlv15-md-edition-upgrade)
GitHubの基本コマンドをまとめてみた(リモート編)

# 最初に
プログラミングの勉強を始めて3ヶ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、表現が誤解されるような言葉があったら教えて下さい^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。


#GitHubの基本コマンドをまとめてみた(リモート編)
### `git remote add origin GitHubの対象リポジトリURL`
**ローカルリポジトリとリモートリポジトリを結びつけるコマンド**
これをしないと今後変更履歴をリモートリポジトリ(GitHub)に反映させることが出来ないので超重要！！
sshキーを登録してあるならばSSHを選んで出てきたURLの方が良いと思います。
私だけかもですがHTTPSの方だと毎回user名とpasswordをpush時に要求されたのでちょっと手間かもしれないです。(他に原因があったのかもしれないですが,,,今の私にはわからなかったです^^;)

#####``git remote -v``
を使うと結びつけてあるリモートリポジトリのURLが出てきますのでスペルミスないか？チェックしておくと良いと思いますよ^^

#####``git remote set-url origin リモートリポジトリURL``
これは結びつけを変更する時に使えるみたいです！
スペルミスで間違えて紐付けていたり、リモートリポジトリを変更したい時(あまりないと思いますが…)


### ``git push origin ブランチ名``
[ローカル編](https://qiita.com/yutas-8/items/94b0910dffbf7813a003)
こっちで紹介した``git add``→``git commit``をしたものをリモートリポジトリに反映させるコマンドになります！
pushがうまく出来ているとGitHubの対象リポジトリのブランチに変更履歴が反映れているはずです！

>ブランチとは？
特に複数人で作業をする時に便利なものになるのですが、
履歴の流れを分岐して残すことが出来て違うブランチの影響を受けないので同時進行で複数人が作業することが出来ます。
個人で行うときも機能別、レイアウト別、バグ別などなどで分けるとどこをどのようにして追加したのか？変更したのか？がわかりやすくて良いと思います。
私は個人で開発している時もちゃんと動いている状態に+α何を追加したときなどにブランチを新たに用意して行っています。こうすることで万が一追加がうまく動作しなくても正式な方は何の影響も受けないので全てにエラーが起きてパニクることはないので安心していじりまくれるので勉強にはとてもいいです！
ブランチはとても便利なので何度か実際に操作して見るとすぐに良さに気付けると思います！私もネットの説明見てもピンとは来なかったですが実際に動かしてその偉大さに気づきました！


###`git branch ブランチ名`
新規のブランチを作成することが出来ます！
`git branch`だけにすると現在作成されているブランチが一覧で表示されます！
*ここではただ作成しただけなので注意！

###`git checkout ブランチ名`
ブランチに移動することが出来る！

###`git checkout -b ブランチ名`
`git branch ブランチ名` + `git checkout ブランチ名`を同時に行ってくれる
新規ブランチを作成して作成したブランチに直ちに移動するってことです


###`git pull origin ブランチ名`

`git fetch origin ブランチ名 ` + `git merge origin/ブランチ名`
この2つをまとめて行うのもです！

fetchの方はリモートリポジトリにあるものを自分のPC上にコピーをする(ローカルリポジトリのは影響なし)
mergeの方はfetchでコピーしたもの(=リモートリポジトリ)をローカルリポジトリに反映させる


>この出番は複数人で開発をしている時に他の人が行った変更履歴を自分の方にも反映させたい時
や
ブランチを複数個作って作業をしている時に別のブランチで行った変更を反映させる時
この2点私は主に使っていますね。


###`git clone リポジトリURL`
リモートリポジトリにあるものをローカルリポジトリにダウンロード(コピー)をするのに使います！

私はこんな場面で使いました！
- チームで開発をする時に初期設定を1人が行いそれが終わったら他のメンバーはcloneした。同じ内容の初期設定までであればこのやり方が便利でした。
- 一人で行っている時ですが、変なことをしてしまいどうにもできなくなった時にローカルリポジトリを全て消してcloneしました！(個人的にはバックアップをとっているイメージでどうにもならなくなったらこれをしましたが他にも良い方法があったので以降やってません^^;)


#最後に
おそらくリモートで使う関係のものをと思って書きました！
「GitHubは友達^^」を合言葉に使いこなして見てください！
H2データベース接続のためのapplication.propertiesの設定例を見る

Spring Bootにおける設定ファイル[^1]であるapplication.propertiesについて、H2データベースに接続する際の設定[^2]を例として見ていく[^3]。
ここでは、1行ずつ設定を追記していく形式をとる。

### 1. データベースのJDBC URLを記述する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
```

`jdbc:h2:mem:<データベース名>`により、インメモリデータベース[^4]としている。接続が切れた際にデータを保持するため`DB_CLOSE_DALAY=-1`を、終了時にデータベースを閉じることを無効にするため`DB_CLOSE_EXIT=FALSE`を追加する。

### 2. JDBCドライバのクラス名を記述する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
```

H2データベースにおけるJDBCドライバのクラス名は`org.h2.Driver`。PostgreSQLであれば`org.postgresql.Driver`。

### 3. データベースへのログインユーザ名、ログインパスワードを記述する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name = org.h2.Driver
spring.datasouece.username=sa
spring.datasource.password=
```

### 4. SQL文の文字エンコーディングを指定する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name = org.h2.Driver
spring.datasouece.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8
```

### 5. コンソールの有効設定を記述する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name = org.h2.Driver
spring.datasouece.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
```

H2コンソールを有効にしたい場合、`true`を設定する。

### 6. データベースの初期化を行うかの設定を記述する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name = org.h2.Driver
spring.datasouece.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
spring.datasource.initialization-mode=always
```

`always`で初期化を行う。その他、`embedded`, `never`が指定可能。以前のSpring Bootのバージョンでは、`spring.datasource.initialize=true`であった。

### 7. DDLおよびDMLのリソース参照を設定する。

```application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name = org.h2.Driver
spring.datasouece.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
```

指定ファイル前に`classpath:`を付ける。`schema.sql`にDDLを、`data.sql`にDMLを定義する[^5]。

[^1]: アプリケーションにハードコーディングしたくない値を記述するファイル。プロパティファイルとも呼ばれる（拡張子`.properties`がついていている）。

[^2]: データベースへの接続情報は環境に依存するため、設定ファイルに記述する候補となる。

[^3]: 中身をよく見ずなんとなく書いて進めようとしている自分に気づいたため。

[^4]: データおよびその変更を永続化する必要がない場合に用いられる。

[^5]: DDL(Data Definition Language)は定義する方なので、`CREATE`/`DROP`/`ALTER`など。DML(Data Manipulation Language)は操作する方なので、`SELECT`/`INSERT`/`UPDATE`/`DELETE`など。
GitのタイムアウトPermission denied (publickey)

こちらの記事を参考にして進めた

>https://qiita.com/tetsu-upstr/items/e72147250701cf30ee72

```$ pbcopy &lt; ~/.ssh/id_rsa.pub```が使えなかった
だから画面上にはid_rsa.pubは表示することが出来ない（出来なかった）

最後だけ↓のコードを使った
```
cat id_rsa.pub | clip
```
これでid_rsa.pubがコピーされるのでgithubの設定ページでコピペして完了した
【Python】 同じ名前のクラスがあってもエラーにならない

# この記事の要約


- Python内で同じ名前のクラスがあってもエラーなく実行できる
- C++だと同じ名前のクラスがあればコンパイル時にエラーになる
- 特に大した情報を載せている記事ではない（重要）
- このエラー解決に丸1日費やした自分への戒め



# Python内で同じ名前のクラスを作って実行してみる

```class.py
import os
import sys

class CLS:
    def __init__(self):
        self.value = 1
    def print_value(self):
        print('value =', self.value)

class CLS:
    def __init__(self):
        self.value = 2
    def print_value(self):
        print('value =', self.value)

def main():
    cls = CLS()
    cls.print_value()

if __name__ == "__main__":
    main()
```

CLSという同じ名前のクラスを宣言しています．最初のCLSではvalueの値を1にし，次のCLSではvalueの値を2としています．これを実行すると

```
value = 2
```

2が表示されます．つまり，後から宣言されたCLSに置き換えられたことになります．


# C++内で同じ名前のクラスを作ってコンパイルしてみる

同様のことをC++でも行ってみます．

``` class.cpp
#include <iostream>

class CLS {
private:
    int value_;
public:
    CLS(void): value_(1) {}
    void printValue(void) { printf("value = %d\n", value_); }
};

class CLS {
private:
    int value_;
public:
    CLS(void): value_(2) {}
    void printValue(void) { printf("value = %d\n", value_); }
};

int main(int argc, char **argv) {
    CLS cls;
    cls.printValue();
    return 0;
}
```

コンパイルしてみます．

```
$ g++ -o class class.cpp
error: redefinition of ‘class CLS’
```

コンパイル時にエラーとなります．C/C++に慣れている人であれば当たり前の挙動ですね．当然ですが，それぞれのクラスを異なるnamespace内で宣言すれば，同じ名前のクラスを宣言することはできますし，使い分けることもできます．



# なぜこの記事を書いたか

Keras（Tensorflowバックエンド）を使ってLSTMを実装しようとしました．LSTMを実装するクラスの名前を何にしようか迷った時に，安易に「class LSTM」と名付けてしまいました．当然，Kerasの中にもLSTMというクラスが宣言されています．その結果，Keras内で宣言されているLSTMが，自分が実装したLSTMで上書きされました．つまり，

``` LSTM.py
class LSTM:
    def __init__(self):
        # do something
        x = LSTM(32, activation='relu')(x)
```

みたいなコードを書いてしまい，これを実行して

```
TypeError: __init__() got an unexpected keyword argument 'activation'
```

というエラーが出てきたわけです．「LSTMにactivationがないなんておかしい」と思うわけですが，KerasのLSTMは自分で実装したLSTMというクラスに上書きされているので当然です（しかし気づかない...）．

そして，「エラーが出たらググる」が基本ですのでググると，KerasとTensorflowのバージョンの問題で「got an unexpected keyword argument」というエラーが出るという記事を見つけました（これもまた運が悪い...）．そうなると，「これはバージョンの問題か！」と思って意気揚々とバージョン合わせを行うわけですが，一向にエラーが解決しません．

様々なバージョンを試し結局解決できず，今日は帰ろうかと思い最後にプログラムを眺めている時に，「LSTMって名前被ってるじゃん」と気づきました．そして名前を直したらあっけなく動きました．私はC++をメインに扱っているので，「同じ名前ならエラー出せよ！」と思いましたが，良くも悪くもこれがPythonなのですね．

今日（2020年12月4日）1日をこのエラー解決に全て費やした自分の愚かさを反省する意味も込めて，久しぶりの記事投稿です．同じエラーに苦しむ方の手助けになれば幸いです（そんなやついるか怪しいですが...）．
Slackで褒める文化を作った話 


## はじめに

チーム・ビルディングを進めていく上で必ず出てくるものとして、心理的安全性という単語があります。心理的安全性が高い状態とは、対人関係でのリスクをとっても安心できる共通の状態のことです。 具体的に書けば、チームの中で抵抗を感じずに自ら発言したり行動できる、ということになります。
この記事では、心理的安全性を高める手段の一つとして、褒めるという文化を作るということについてまとめました。

- 書いてあること: 褒める文化の作り方、褒めるメリット
- 書いていないこと: SlackBotの詳細な作り方

## きっかけについて

私が食べログのエンジニアとして所属するよりも、もっと以前の話になります。
チームメンバー（新入社員の方や、アサインされてまだ日が浅い方）との1on1を行っていく中で、以下のような問題が現れました。

- 人に何かを聞きにくいと感じてしまう
- 認められていないのではないかと感じてしまう

このままでは心理的安全性は低い状態のままとなりそうです。 原因を考えてみましょう。

### 人に何かを聞きにくいと感じてしまう

コミュニケーションツールとしてSlackを利用していましたが、あまり気軽に聞ける場ではなくなっていました。履歴を遡ると、レビューの依頼と、それに対するありがとうございます、の繰り返しだけになっています。確かにここでいきなり人にメンションするのはやり辛いかもしれません。

また、チャンネルでのオープンな場での会話もほとんどありませんでした。プロジェクトごとのチャンネルはレビューの依頼や何かの報告のみの場として使われている状態です。 ではSlackはどのように利用されているのか実態についてヒアリングを進めていった結果、クローズドな1on1のチャットはある程度利用されているようでした。

### 認められていないのではないかと感じてしまう

1on1を何度か繰り返していくと、個々のメンバー間での技術レベルに差があり、それをネガティブな感情で受け止めてしまっていることがわかりました。またSlackでも定型文的なやり取りしか行われておらず、ネガティブな感情のみが溜まりやすい状態になっていることが根本的な原因となってしまっていそうです。

## Slackで褒める文化を作ろう

いくつかの打ち合わせを通して方針を決定しました。上手く運用できていなかったSlackを活用し、ネガティブな感情を取り払うため、褒める文化を作るというものです。

- Slack上でオープンな場の会話を増やし、発言しやすい雰囲気を作ること
- 褒めることでポジティブな感情を作っていくこと

上記の二つを狙いとして、SlackBotを作ることにしました。 早速、褒めてくれるSlackBotを作ることにします。

※SlackBotを使うことになった理由
単純にメンションで褒めても良かったのですが、それでは一部のメンバーしか褒めないだろうということを考慮してSlackBotを利用することが決まりました。機能として提供されている方が使いやすいだろう、と判断してのことです。

## 褒めるSlackBotを作った

すんすんと作りました。 こんな感じの使用感です。

### SlackBotに登録
![スクリーンショット 2020-12-07 21.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378347/b1be9c89-5638-2d7a-f8a0-ec93add0100d.png)


### 褒める
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378347/efe1d588-f9b9-46a5-9447-e157a99302e2.png)

褒めたい人のID（SlackBotに登録した半角英数字）を指定して++し、褒めたいことを入力します。これで1褒めになります。自分を褒めることもできます。
褒めることに成功するとSlackBotが褒められた回数の合計と、今回褒められた内容を通知してくれます。

### 見れる
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378347/88425a3b-a576-0044-f7c4-94743e82034d.png)

## SlackBotの狙いは達成できた？

実際に運用を開始してみたところ、徐々にSlackBotが面白がって使われるようになりました。些細なことでも褒めてみたり、業務上で依頼ごとや何かやり取りが発生した際にも褒めてみたり、と使ってもらえました。Slackを通して褒める文化ができた瞬間ですね。

褒めるというポジティブな感情は心理的にも良い影響を与えてくれます。実際にSlackBotが運用されてから少し経った頃には、オープンなチャンネルで質問が飛ばされるようになりました！

また、コードレビューにも良い影響は現れました。レビューイ、レビュアー、どちらの立場でもより良いものにするための意見が出るようになりました。指摘をされること、そして指摘をすることを恐れないようになっていったのです。

広がりは緩やかでしたが、当初定めていた二つの狙いは達成できました。

### その他、よかった影響

- メンバーがSlackBotの開発を自ら進んでしてくれた

SlackBotは様々なことを便利にしてくれます。褒める機能の他に、様々な機能が追加されていきました。アプリのデプロイをBotがしてくれたり、ランダムにレビュアーを決めてくれたり、お昼ご飯を決めてくれたり。この開発を進めていく中でも褒めは発生し、モチベーションにも良い影響を与えていたようです。1on1でも聞いてみたところ好評でした！

- Slack上だけではなく会議などでの発言も増えた

褒める文化を根付かせるため、Slack上だけではなく対面でも細かなところを拾って褒めるようにしていました。その結果、顔が見えないオンラインのコミュニケーション上だけではなく、対面での会話の場でも、自発的に意見を述べてくれるようになりました。

## まとめ

褒めるだけで上記のような良い影響が現れました。
私の場合はSlackBotを利用しましたが、褒める文化をどう作るか、そこに大きなハードルは決してありません。些細なことでも拾ってみれば明日からでも、むしろ今からでも出来ることです。積極的に褒めてみましょう。

明日は@redpineさんの「新卒からリモートワークやって感じたメリットデメリット」です。お楽しみに！
【2021/01/31迄：更新予定】就労移行支援事業所選びのポイント

（※2020/12/31：来年1月末までの宿題にしたいと思います、大変すみません）

###※前置き
今回のエントリで一旦、当カレンダーへの私個人からの記事追加を中断したいと思います。
（理由は『完全初参加で、25日分の十分な情報量を備えた有用な記事を毎日投稿する』事があまりにもハードルが高かった為）
この度は力不足の身でありながら無謀な課題に挑み、結果として拙い記事を一旦投稿する事態となってしまった旨につきまして、閲覧いただいた皆様に重ねてお詫び致します。誠に申し訳ございません。（後日、改めて反省の念を述べさせて頂きたいと思います）

これまでに投稿した記事に関しましては、~~AdventCalender最終日の12/25~~　→12/31までの間に、出来る限り購読に耐えうる内容にまでブラッシュアップを行い更新を続けていきたいと思います。


##就労移行支援事業所を選ぶ際に注目したいポイント

・貸与される/借用できるPCの性能（IT・プログラミング学習に適した性能を保持しているか）
・利用できるソフトウェア、サブスクリプションの内容と範囲
・PC周辺機器（デザイン用のペンタブレットやマウス・モニター等）の充実度合い
・事業所の通信環境（光回線の有無と上下通信速度の実効値/Wifi環境）
・事業所の運営方針と行事の内容（レクリエーションや社会人マナー講習など、ITスキル修得にあまり寄与しない行事や研修が少ない方がよい）
・開所から閉所までの一日の時間帯（利用可能な時間帯）
・各種参考書類の充実度合い（および書籍の内容が最新の技術情報に近いかどうか：出版年が新しいか）
・指導員のITスキル/知識と指導への熱意
・LMS（eラーニングサイト/システム）のコンテンツ・教材の充実度合い
・資格取得や学習についての補助の有無
・利用者の傾向
・就労支援（就職活動）の補佐レベル・支援の度合い
・食事（昼食）の費用負担の有無（※適切な栄養バランスの取れた食事が格安で摂れるのはメリットが大きい）
・通所の交通費負担の有無
・他の就労支援事業または障害者雇用事業（民間または各市町村・県などの自治体）との連携が取れているか
・生活指導員の傾向
・事業所内の雰囲気
・休憩に必要なスペース（ソファー等の備品も含む）の有無
・利用開始の手続を行うための計画相談支援団体・支援員との連携
・ハローワーク・各求人事業者との連携が取れているか

##就労移行支援事業所を選ぶ際に注意したい点

・「有名である/ネームバリューがある大手の事業所だから」といっても、利用する個人に最適であるとは限らない
・あまりにも福祉の色が強い（「無理をしなくていい」という空気）が強い事業所では、自身の成長が難しくなる恐れがある
・職場実習に参加する際は、実習先で自分の希望する学びが得られるかをよく確認することが大事
・基本的に「自学自習」が原則なので、学習に必要な機材・教材（書籍/動画教材/サブスクリプション）は自分で準備することを心がける
・他の障害者雇用事業を行う企業とのコネクションや連携が強すぎると、かえって自由な就労の選択が難しいかもしれない
RSpecの導入と単体テストコード実行の手順

## Gemfileをインストール

```ruby:Gemfile
group :development, :test do
   # Call 'byebug' anywhere in the code to stop execution and get a debugger console
   gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
   gem 'rspec-rails', '~> 4.0.0'
 end
```

## bundle install実行

```ruby:ターミナル
bundle install
```

## RSpecの設定を行う
```ruby:ターミナル
rails g rspec:install
```
実行すると、以下のようにディレクトリやファイルが生成されます。

```ruby:ターミナル
create  .rspec
 create  spec
 create  spec/spec_helper.rb
 create  spec/rails_helper.rb
```

##.rspecに以下を追加
.rspecというファイルをテキストエディタで開き、以下のように記述します。この記述は、テストコードの結果をターミナル上で可視化するための記述です。

```ruby:.rspec
--require spec_helper
--format documentation
```

これでRSpecの設定は完了。

##テストコードを各ファイルの生成

```ruby:ターミナル
% rails g rspec:model user
```

```ruby:spec/models/user_spec.rb
require 'rails_helper'
 RSpec.describe User, type: :model do
   describe 'ユーザー新規登録' do
     it "nicknameが空だと登録できない" do
     end
     it "emailが空では登録できない" do
     end
   end
 end
```

##テストコード実行
```ruby:ターミナル
bundle exec rspec spec/models/hoge_spec.rb 
```

以下のようにテストコードの結果が緑（エディタの設定によって色は異なります。）になっていればテスト終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730703/e9e206ee-dfec-77df-03e6-3af163d60a92.png)
スマホ実機/iphoneで、標準セレクトボックスでの選択時に文字が表示されない問題への対処

## 標準のセレクトボックス（selectタグ）のoption内の文字が表示されないのはなぜか
例えば、以下のようなコードでiphone実機で確認した際に実態はあるものの、文字が表示されない問題が発生しました。

![2823315C-43DC-4F26-A32B-F8357A6B02E8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489992/fee8f48d-9f3d-cb1c-ff9d-96cf82559960.jpeg)


pugでvue.jsでの記載を例にしていきます。

```html

select(v-model="hoge")
  option(v-for="n of 5" :key="n" :value="n - 1" :label="`${n - 1}名`")
```

PCでは表示されるようだが、以下コードのようにoption内にもラベルにしたい文字が記載されてないと表示されない模様です。

```html
<otion></option>
```

### HTML NG例

```html
<select>
  <option value="hoge" label="ほげ"></option>
</select>
```

### HTML OK例

```html
<select>
  <option value="hoge" label="ほげ">ほげ</option>
</select>
```

### 対処方法
ズバリ、option内にも忘れずにラベルにしたい文言を出力しましょう。

option(...省略...) **{{`${n - 1}名`}}**

サンプルコード

```pug
select(v-model="hoge")
  option(v-for="n of 5" :key="n" :value="n - 1" :label="`${n - 1}名`") {{`${n - 1}名`}}
```

![E55663AD-B757-491C-B3DD-9FFDCA7C5551.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489992/6b5eea4b-0987-2a89-d1a9-ed64640b8846.jpeg)

表示されました！
めでたしめでたし。
AWSのARMチップが激速だった^^;

早くも今日二個目の投稿となりました。
Hiro_Matsunoです。
AWSアドベンドカレンダー4日目の投稿です。
[PHPer&HTML5が好きな自分がなぜC#に惚れたのか](https://qiita.com/hiro_matsuno2/items/28bb553d2cac22f5d27b?fbclid=IwAR161efQtRFtCsOXha-P2chqYRv32kHYqSnUUxHyc1B9-w-WsutCqIU1ETE "PHPer&HTML5が好きな自分がなぜC#に惚れたのか")を書いてました。
こちらの方も読んでやってください。

いま巷で大騒ぎのApple初のARMアーキテクチャチップM1が大騒ぎになってますが。
こっちも負けてはいません。
AWSで初めてARM64でWebサーバを組んだときの顛末記です。
#ARMアーキテクチャーを使ってるのはAppleだけじゃないぞ。
本当はこれを声を大にして言いたかったです。
3年前から実はAWSはARMアーキテクチャーのチップを使っているので有名です。
実は二の足を踏んでいて今回M1騒ぎに乗じて使ってみることにしたのが実の真相です。
本当はもっと前から使ってみたかったんですけどｗ。
#今回使ってみてどう思ったのか
今回本当に使ってみてわかったんですが。
正直M1なんて目じゃないです。
とにかく激速でじつはWebサーバ作るのにじつはIntelだと約2時間いるんですが。
なんと４５分ぐらいでほぼ動く状態にまで持ってくことができました。
これは実際に先週の金曜日の出来事です。
そこまで移行の時間がなかったんです😭。
本当に日々忙しく働いていましたので。
実はPHPerとして１１月から復帰したので勉強に勤しんでました^^;。
#Intelと比べてどう思ったのか
Intel激遅っていうのが真相です。
ARMって実はカーエレクトロニクスでは当たり前で実は前職ではARM系Linuxの大御所とお仕事ができたこともありARMのLinuxってどうなのかなと思っていました。(ドイツの某B社の男性Linuxビルダーはみんな大御所だった。喧嘩ふっかけそうになったこともありました。拙い英語で異変を伝えるのに一苦労させられました^^;。翻訳ソフトは良いのを使いましょうねw。)
予測を遥かに超えた速さにびっくりしています。
処理の速さもさながらやはり色んな要素で使っていけるいいものだなと思いました。
特に一番時間のかかる作業ほどIntelより速さが際立ってました。
だけどもうハード系Linuxはこりましたがサーバ系だったら喜んで頑張ってビルドしますよ( ͡° ͜ʖ ͡°)。
こんなに速いんだったらもっと早く使っておくんだったと反省させられましたよ。
マジで。
#最近MacMiniをAWSは導入したんだけど
これ思いましたがすごいと思ってます。
MacMiniをサーバにできるなんて幸せな人っているんですかね。
どんな人かあってみたい。
実際のこと言うとMacMiniが使えるようになるってことはiOS開発が実は実機いらずになるんですね。
俺は好きで二台持ちしていますが（MacBookAir2013LateとMacBookAir2018Late）。
Windows機だけしか持ってない人にはすごい朗報だと思います。
諦めなくても良くなるってことはいいことです。
どうやらそのうちM1MacMiniの導入も検討されてるようです。
実際に先行してAWSで触ってみてから購入に走れるようになるのでいい方向になったと思います。

さぁそんなところで言っておきたいのは二の足踏んでるんじゃなくARMアーキテクチャをEC2で使っちゃいましょう。

明日は[clouddaisuki](https://qiita.com/clouddaisuki "clouddaisuki")です。
どんな事書いてくれるんでしょう。
期待してますね。
920MHz帯のLDCとFHの比較

## はじめに

この記事では、2020年10月30日の電波法の改正で導入されたLDCとFHを、限られた周波数帯にどれだけ収容できるか[^3]という観点から**机上で比較**してみます。
法改正の解説については、こちらの記事["「920MHz帯の壁」崩壊の音"](https://qiita.com/tanupoo/private/18803245cb6130095729)を参考にして下さい。

## LDCの最大収容台数

はじめにLDCの場合について考えます。

LDCの送信時間に関する制約の一部を下記に示します。

- 連続送信は4秒以下に抑える。
- 送信したら50ミリ秒休止する。[^1]
- 1台について1時間あたりの送信時間の総和を36秒以下に抑える。

1時間あたり送信時間の総和を36秒以下に抑えるので、送信する機会は9回（36秒/時間 / 4秒）あります。

実装としてもっともありがちなのは、400秒（3600秒 / 9回）毎に4秒以内で通信する使い方です。これまで何秒送信したかを記憶する必要がないので実装が簡単です。受信側がフレームを受け取った事を返す確認応答がないシステムならばさらに簡単になります。

あるいは1時間に1回、50ミリ秒の休止時間を挟みながらバースト的に送信時間の合計を36秒に抑えて通信する使い方が考えられます。

いずれにしても、1時間あたりの送信時間を36秒以下に抑えるので、机上では100台（3600秒 / 36秒/台）収容できると言えます。[^2]

## FHの最大収容台数

次にFHの場合を考えます。FHの送信時間に関する制約の一部を下記に示します。

- 連続送信は400ミリ秒以下に抑える。
- 1つのチャネルでは次に送信するまで4秒休止する。[^1]
- チャネルを切り替えて送信する場合、休止は必要ない。
- 1つのチャネルあたり1時間に送信する時間の総和を36秒以下に抑える。
- 1つの機器で1時間あたり送信する時間の総和を720秒以下に抑える。

今回の法改正で導入されたFHを使えばチャネルを切り替えさえすれば休止時間を挟まずに送信を開始できます。

1台の機器で11チャネル使って送信することを考えます。そして、400ミリ秒送信して次のチャネルに切り替えてすぐに送信を開始します。すると、11チャネルを順番に切り替えて送信すると4.4秒後に1周りします。1周すると最初のチャネルではちょうど4秒間休止したことになります。

1つのチャネルあたり1時間に送信する時間の総和を36秒以下に抑えるので、400ミリ秒間連続送信し4秒休止を繰り返すと1チャネルあたり90回（36秒/時間 / 0.4秒）送信できます。

11チャネルを使い4.4秒間の送信を90回繰り返すと396秒（4.4秒 x 90回/時間）かかります。つまり1台では1時間あたり396秒間連続送信できます。
![FHで396秒間連続送信するイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68303/ad2bdfcf-345c-99a4-fbf1-e022e1751e61.png)

11チャネルを切り替えるので、完全に同期すれば369秒間に11台収容することができます。
すると、このルールに従った機器は1時間あたり机上では100台（11台 x 3600秒 / 396秒）まで収容することができると言えます。[^2]
![FHで11台が時刻同期し連続送信するイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68303/5da47baa-6919-ced1-7816-5bc6961bf1ea.png)

## LDCとFHの比較

11チャネルを使って送信するシステムで比較します。

LDCは1時間あたり100台収容できるので、11チャネル使うならば1100台収容できます。上で述べたようにFHは100台となり収容効率が1/10以下になります。

1台あたりの連続送信時間は、LDCの36秒に対して、FHは396秒となり11倍になります。

20チャンネル以上使うシステムでは、FHは720秒送信できるのでLDCの20倍になります。

LDCの実装と比べると、FHは扱う時間の粒度がより小さくなり高価になります。また、通信する機器同士が時刻を同期させるためのプロトコルが必要になり、システムが複雑になります。

## まとめ

920MHz帯は、RFタグやスマートメータなど比較的少ない情報を定期的に送信するような利用が主に想定されています。

その中でも比較的情報量が多いユースケースでは、FHを使うと効果的に通信する事ができると言えます。

見方を変えると、LDCと比較してFHは少ない機器で帯域を専有してしまうので、他のシステムへの影響が大きいと言えるのではないでしょうか？　

ただし、あくまでも机上の話です。実際は現地で確かめることをお奨めします。

[^3]: より現実的な収容数に関しては[ALOHAnet](https://ja.wikipedia.org/wiki/ALOHAnet)などを参考にして下さい。
[^1]: 休止しなくてもよい条件もありますが、本記事では関係ないので省略しました。こちらを参照して下さい。
[^2]: 各デバイスがランダムに送信する場合は干渉するのでここまでうまく収容できません。
Big Surアップデート後に特定のコマンドがkillされる


本当にしょうもない記事なのですが自分は1時間かかってしまっているので記録します。
同じ問題に直面した人の助けになれば幸いです。

## 環境
iMac 2017
Mac OS 11.01
素人zsh環境

# 起こった問題
OSX HighSierraからのアップデート後、zshの補完が上手くいかないことに疑問を覚えました。
brewのアップデートをしていないなと思いupgrade, updateどちらを試すもエラーが出ました。
![スクリーンショット 2020-12-04 21.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417786/8da16fac-9188-001d-eab8-42b8e24dc315.png)
pipコマンドやbrew、dockerなどの特定のコマンドが瞬時に強制終了されてしまう・・・
（python、vim、自作コマンドなんかは動く）
brewが悪そうだとアタリをつけてGit must be ...で検索をかけると以下の解決方法が載っていました。


```
$ sudo rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install  
```
コマンドラインツールのバージョンが古い説、とのことです。
指示に従った後、一旦ターミナルを再起動させるも解決せず...
常に実行しているプロセスがあるためためらっていた本体の再起動をしました。

・・・
−＞**解決しました**

### 解決法
再起動しないといけないです。なんでもそうですよね。

正直申しますとなぜ解決したのかがわかっていません。Xcodeのバージョンなのか、それとも他のところで詰まっていて再起動が解決したのか、両方なのか...
後学のためにご教授くださると大変嬉しく思います。
unsignedBigIntegerについて調べてみた

unsignedBigIntegerは外部キーのデータ型によく使うやつ。

忘れやすいのでメモっておきます。

unsignedBigIntegerは「符号なしBIGINTカラム」

```
・符号なし・・・正の数のみ
・BIGINTカラム・・・格納サイズは8バイト（-9223372036854775808から9223372036854775807）
・8バイト・・・64ビット（1バイトは8ビット）
・64ビット・・・2の64乗（1ビットは2進数の1桁。つまり、0か1の2種類。なので、64ビットで2×64種類の数値が表せるということ。）
・2の64乗・・・18446744073709551616
```

ということで、つまりは
unsignedBigIntegerは「0~18446744073709551615」までの値を格納できるデータ型のことで、言い換えると「符号なしBIGINTカラム」
flutter_blocを使ってみる その4 - なぜEquatableを使うのか

# `flutter_bloc`のEventとStateはなぜ`Equatable`を使うのか
## `Equatable`を使っている例
**`Equatable`は同じプロパティを持つインスタンスを同一として扱うオブジェクト**です。
`flutter_bloc`を用いるサンプルではStateとEventが`Equatable`を継承することが多いです。
[こちらのsample](https://medium.com/flutter-community/flutter-todos-tutorial-with-flutter-bloc-d9dd833f9df3)でも以下のように`Equatable`を使っています。

```dart
abstract class TodosEvent extends Equatable {
  TodosEvent([List props = const []]) : super(props);
}
```

```dart
abstract class TodosState extends Equatable {
  TodosState([List props = const []]) : super(props);
}
```

## `Equatable`を使う理由
### Stateで`Equatable`を使う理由
`flutter_bloc`では異なるStateが通知された場合にのみUIをリビルドします。なので内容が同じであるStateを同一視したいので`Equatable`を使います。
`Equatable`を使わない場合、同じであるはずのStateを受け取った場合にも`hashCode`が違うので異なるStateと認識されて無駄なリビルドがされてしまいます。


### Eventで`Equatable`を使う理由
例えばBLoCの`transformEvents`をオーバーライドしてdebounceさせる等、同じEventとして認識させたいことがあります。その際に`Equatable`を用います。そのような扱いをしない場合にも`Equatable`を用いる例が多く見られますが、これは慣習的なものなのかもしれません。

**StateでもEventでも、同じプロパティを持つインスタンスを同一視したい場合に`Equatable`を使います。**


# `Equatable`の説明
`Equatable`について少し詳しく説明します。
[`equatable`パッケージ](equatable)は同じプロパティを持つインスタンスを同一視させる`Equatable`オブジェクトを提供します。

下に記す`Person` Classにて、次の演算はtrueになります。

```dart
print(Person(name: "Bob", age: 24) == Person(name: "Bob", age: 24));  // true
```

```dart
class Person extends Equatable {
  final String name;
  final int age;

  Person({
    @required this.name,
    @required this.age
  });

  @override
  List<Object> get props => [name, age];
}
```

これを`Equatable`を使わずに書くと以下のようになります。
`==`と`hashCode`を上書きするコードを追加しています。
`hashCode`でXORを使う理由は[こちらの記事](https://stackoverflow.com/questions/2334218/why-are-xor-often-used-in-java-hashcode-but-another-bitwise-operators-are-used)を参照してください。

```dart
class Person {
  final String name;
  final int age;

  Person({
    @required this.name,
    @required this.age,
  });

  @override
  bool operator ==(Object o) {
    if (identical(this, o)) return true;

    return o is Person && o.name == name && o.age == age;
  }

  @override
  int get hashCode => name.hashCode ^ age.hashCode;
}
```
DockerでRailsの環境構築をする

初心者がDockerでRailsの環境構築をしたのでメモとして残します。

#Dockerのインストール
Dockerの公式ホームページからget startedをクリックしてDocker Desktopをクリックしダウンロードします。

Dockerの公式ホームページ https://www.docker.com/

ダウンロード後インストールが完了したらターミナルで
docker run hello-worldと打ちます。
以下のように表示されたらインストール成功です。

```ターミナル:ターミナル
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

#ファイル設定
新規ディレクトリを作成しそこに以下の４つのファイルをコピーします。
https://github.com/sekine617/Rails-file

#新しいRailsプロジェクトのファイル作成
ターミナルで以下のコマンドを打ちます。

```:ターミナル
docker-compose run web rails new . --force --database=mysql
```
docker-compose run webはDockerのwebサービスコンテナで右のコマンドを実行するためのものです。
rails new .で新しいRailsプロジェクトのファイル作成し、
--forceは既存のファイルの上書き、
--database=mysqlはデータベースにMySQLを使用するコマンドです。

Gemのインストールや新規作成されたファイルをDockerに取り込むために以下のコマンドを打ちます。

```:ターミナル
docker-compose build
```
#ファイル設定２
作成したファイルの/config/database.ymlを編集します。

```:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: ********
  host: *****
```
17~18行目にあるpasswordとhostを/docker-compose.ymlのpasswordとhostの値と一致させます。

/Gemfileも編集します。
gem 'mysql2', '>= 0.3.18', '<= 8.0.22'
の部分の'<= 8.0.22'を自身のMySQLのバージョンに合わせてください。

```:/Gemfile
source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
# Use mysql as the database for Active Record
gem 'mysql2', '>= 0.3.18', '<= 8.0.22'
# Use Puma as the app server
gem 'puma', '~> 3.0'
```
#コンテナの起動
以下のコマンドで現在のディレクトリでコンテナの起動します。

```:ターミナル
docker-compose up -d
```
起動の確認を次のコマンドで行います。

```:ターミナル
docker-compose ps
```

以下のように表示されれば正しく起動されています。

```:ターミナル
   Name                  Command               State           Ports         
-----------------------------------------------------------------------------
rails_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp   
rails_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp
```

#データベースの作成
以下のコマンドでデータベースの作成します。

```:ターミナル
docker-compose run web bundle exec rake db:create
```

rake db:createでデータベースが作成されていない場合新規に作成されます。
これでRailsサーバーにアクセスできます。

#サーバーへアクセス
ブラウザのURLからlocalhost:3000と入力します。
![スクリーンショット 2020-12-04 21.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888053/bcebd8da-95f7-92d5-276a-fa9b49f2b432.png)

Yay!You're on Rails!
と表示されればうまくアクセスできています。
npmについてまとめ

#npmとは

**Node Package Manager**の略

Node.jsの**パッケージ管理システム**である。

2010年に**Isaac Z. Schlueter**氏によって開発された。

#パッケージ管理システムとは

> パッケージ管理システム（パッケージかんりシステム）は、オペレーティングシステム (OS) というひとつの環境で、各種のソフトウェアの導入と削除、そしてソフトウェア同士やライブラリとの依存関係を管理するシステムである。

要は世界の凄い人たちが作って公開しているモジュールをパッケージとして管理し、検索、閲覧、及びダウンロードして使えるよ〜というシステムです。

また、使用したいパッケージの依存パッケージ、そのバージョンまで自動で管理してくれます。

#npmを使わないとどうなる？

例えば**[express](https://www.npmjs.com/package/express)**というパッケージを使用したいとします。
**express**は30ものパッケージと依存関係にあります。
![スクリーンショット 2020-12-04 21.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/b3315d30-3873-ee4c-bba6-dc6e14906801.png)

この場合**express**の他にこの30ものパッケージを別途手動でダウンロードしなければ**express**は動きません。
更にはこれらのパッケージもまたそれぞれ依存先を持っており、更にそのまた依存先のそのまた依存先の・・・・

・・とにかく全てのパッケージをダウンロードする必要があり、しかもバージョンの整合性もとらなければなりません。


そんな面倒なことも、npmが全て自動でやってくれる訳ですね（感謝）

# package.json
**package.json**というJSONファイルにはそのパッケージ（プロジェクト）の情報が記述されています。
依存パッケージやそのバージョンもここで管理されています。

#まとめ
npmについてざっと調べたことを書きました。
何気なく使っていたnpmのありがたみを知ることができました。