OmniAICreator/Qiita-1.07M huggingface dataset:
型を引数に取る関数形式マクロを使ってみる

型を引数に取る関数形式マクロ(macro-like function)を使ってみる
==================


C言語の`#define`でびっくりしたことがあったので紹介する．
(びっくりしたのは何年も前だが)

良くサンプルコードで以下のようなコードを見かける．

```c
#define max(a,b) ((a) > (b) ? (a) : (b))
```

これは`int`だろうが`double`だろうが大きい方を返すので，柔軟性が高い云々紹介されている．
この関数形式マクロの是非は置いておいて．
実はこの関数形式マクロ，型の名前を引数に取っているかのように動作させることができるのだ．

何の意味もない例を挙げるとこんな感じ。


```
#define as(type, a) ((type)a)

int b = as(int, 6.0);
```

ではこれを使って何ができるというのか．


閑話
==============

CからC++やpythonなど、比較的新しめの言語を触ってCに戻ると、配列操作がクソ面倒臭いことに気が付く。

最初から固定長で対応できるのであればよいが、拡張性を高めたいという欲望に負け、mallocとfreeが撒き散らされたコードができる．
リッチな環境であれば、多少のfreeのし忘れも長期間起動させるようなものでなければ，
OSがいい感じにしてくれる場合もあるそうだが、やはり気になるものだ。
最近はvalgrindを覚えてfree忘れを確かめるようにしている。

しかしながら、ソケット通信をするとメモリ開放し忘れとvalgrindに怒られるが，こっちのコードには問題はない．
いつになれば修正されるのだろうか。

まあ，そういうことでCでもどんな型でも対応できる柔軟な可変長配列が欲しくなる．



何がすごいのか
==================

閑話で例に挙げた通り，C言語でVectorっぽいものを作ろうとすると，以下の二つの方法がまず思い付くであろう。

1. `void*`を使う
2. マクロで型ごとにコードを自動生成する

1の手法は以下のようにしてできなくはないが，

```c
typedef struct{
	size_t size;
	size_t elem_size; /* sizeof(int) などが入る */
	void*  ptr;
} Vector;
```


でもこれで要素にアクセスしようとすると，

```c
void* vec_elem(Vector* v, size_t i){
	return ((char*)v->ptr)[i*v->elem_size];
}

int a = (int*)vec_elem(v, 3);
```

まあ手動キャストの連発．
そもそも`void*`に入れた時点で，型が消し飛ぶ．
したがって，コンパイラーが型チェックできなくなってしまう．
なので，安全性を取るのであれば2を使うのが一つの手だ．

こちらの場合型の名前を使って型毎に別のコードを生成するため，間で`void*`を使いでもしない限り，
コンパイラーが正しく型の整合性をチェックできるようになる．

これはマクロが頑張ってくれるというよりも，そういう風に上手く書き変えられるようにしたという認識である．

今回はどう実装するのかについては触れないが，型を引数に取るかのように見える関数形式マクロがどういう風に使えるのかについてだけ説明する．

よくある例は以下のものだ．

```c
#define Define_Vector(type) \
	typedef struct{ \
		size_t size; \
		type* ptr;\
	} Vector_##type;

Define_Vector(int)
```

実際にはこれだけではなく，使用する全ての関数を書かないといけない．
こんなイメージ．

```c
#define Define_Vector(type) \
...
void Vector_Push_##type( Vector_##type* v, type* a ){ \
	v->ptr[v->size++] = *a; \
} \
...
```

それでこんな感じに使う．

```
Define_Vector(int)

Vector_int* v;

...

int a = 3;
Vector_Push_int(v, &a );

```

ここまではよくあるので面白くもない．
でもここで以下のようなマクロを定義してやると

```
#define Vector_Push(type, v, a) Vector_Push_##type(v, a)
```

こんな感じに使える．

```
int a = 3;
Vector_Push(int, v, &a );
```

このコードではキャストをしていないので，型情報が上書きされない．
だからコンパイラが型チェックできる．
しかも型を引数に取っているかのように見え，適切な関数を自動で選択してくれる(厳密には型に応じた関数名に勝手に書き変えてくれる)コードに見える．
***すごい!見易い!***(と私は思います)


欠点としては

1. よけいな関数形式マクロを一つ用意しないといけない．
2. 毎回型を指定して関数形式マクロを呼び出さないといけない．

などがある．
型指定が必要な分C++のVectorより少しは劣るが，`auto`ばっかりで何が何だか分からないまま使うよりはましと言えなくもない．


注意
========

上に挙げたコードは全てイメージを喚起するためのもので，やばいコードばかりです．
穴ぼこだらけです．
決してそのまま使ってはいけません!
Raspberry Pi 4をOTGモードにしてsshする方法 for mac

## はじめに
OTGとはOn-The-Goの略であり、wifiに繋げずにmacなどのPCに直接Raspberry Pi(以下Pi)をUSB接続することによってsshを可能にするモードです。
この方法であれば、モニター・マウス・キーボードがなくてもPiにsshができます！
もちろん4だけでなく３やzeroなどでも手順は一緒です。

ちなみにPiを最もかんたんにwifi接続する方法としては、microSD直下に `wpa_supplicant.conf` を作ることだと思うのですが、**Pi4に限ってはどうやらwifiの挙動が安定していないらしく、何度やり直しても接続できずにハマりました**😭なので、ひと手間かかりますがこの記事の方法でwifi接続しました。

## 1. OSイメージを書き込まれていて、一度もpiに差し込んだことのないmicroSDを用意する

- [拙作](https://qiita.com/aykusu/items/4ba88ec3a96595954cc3)をご覧ください
- 上記のSDカードをmacに差し込む

## 2. sshを使用可能にする

- `$ cd /Volumes/boot` コマンドでmicroSDカードの直下に移動する
- `$ touch ssh` で空のsshファイルを作る

## 3. config.txtの編集
- 上記と同じディレクトリにある `config.txt` をviなどで開き、ファイル末尾に `dtoverlay=dwc2` の一行を追加する

## 4. cmdline.txtの編集
- 上記と同じディレクトリにある `cmdline.txt` をviなどで開き、`modules-load=dwc2,g_ether` という文字列を `rootwait` の直後に追加する

## 5. macに接続する
- ejectしてSDカードをmacから取り出し、microSDをPiに差し込む
- そのPiをUSB-C to USBコードでmacに繋げる
- 差し込んでしばらくすると「ネットワーク環境設定」に `RNDIS/Ethernet Gadget` というものが出てくる
- `RNDIS/Ethernet Gadget`が接続中になったら、macのコンソールから `$ ssh pi@raspberrypi.local` コマンド
- パスワードを聞かれたらデフォルトは`raspberry`になっている
- ssh完了🎉

## 6. wifiに接続する
- ここまでの状態だと、sshはできているがraspberry自体はネットに繋がっていません
- なのでssh後に`$ sudo raspi-config`コマンドでPiの設定画面(GUI)を開く
- `2 Network Options` > `Wi-fi` から繋ぎたいwifiのSSIDやらpassやらを設定
- `$ ping yahoo.co.jp` なんかでwifiに繋がっていることを確認
- 上記が成功したらmacにPiを繋げずともwifi経由でsshできるようになっています🎉

## 参考
- [Setting up Pi Zero OTG](https://gist.github.com/gbaman/975e2db164b3ca2b51ae11e45e8fd40a)
- [Setting WiFi up via the command line](https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md)
【Day37】積み上げ日記

##予定
■ポートフォリオの作成

##完了
■ポートフォリオの作成

##学習時間
1h

##学習ポイント
■レスポンシブ対応
①ビューポイントを設定する
width=device-width でデバイスの幅に応じたpxになる。
②画像の最大幅を100％にする
高さはautoにする。
③ボックスの定義を変更
もしwidthを100％に設定しているのに、画面からはみ出ていたら、borderとpaddingが考慮されていないことが多い。→box-sizing: border-box; でこの2つも含みますよと。
④固定値に最大幅を設定する
widthとmax-widthで指定

##計画通り進んだか？
進んでいない。最近、進むべき方向がぶれている気がする。WEB制作の道なのか、アプリ系フロントエンドの道なのか、明確にする必要がある。
KerasRegressorをpickleやjoblibで保存できるようにする方法

## 概要

KerasRegressorをpickleやjoblibで保存しようとするとエラーになりますが、
保存できるようにする方法です。

## ソリューション

以下でKerasRegressorをモンキーパッチ

```python
def KerasRegressor__getstate__(self):
    result = { 'sk_params': self.sk_params }
    with tempfile.TemporaryDirectory() as dir:
        if hasattr(self, 'model'): # 親Estimatorによるcloneなどで存在しないケースがある
            self.model.save(dir + '/output.h5', include_optimizer=False)
            with open(dir + '/output.h5', 'rb') as f:
                result['model'] = f.read()
    return result
KerasRegressor.__getstate__ = KerasRegressor__getstate__

def KerasRegressor__setstate__(self, serialized):
    self.sk_params = serialized['sk_params']
    with tempfile.TemporaryDirectory() as dir:
        model_data = serialized.get('model')
        if model_data:
            with open(dir + '/input.h5', 'wb') as f:
                f.write(model_data)
            self.model = models.load_model(dir + '/input.h5')
KerasRegressor.__setstate__ = KerasRegressor__setstate__
```

## 解説

```__getstate__, __setstate__``` を使うと、pickleのシリアライズ、デシリアライズをクラスごとにカスタマイズできる。 (詳細はぐぐって)
selenium

#selenium + firefoxによるUIテストの自動化

```py
import time
import unittest

#pip install selenium
#brew install geckodriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


class PythonOrgTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

    def tearDown(self):
        self.driver.close()

    def test_python_org(self):
        self.driver.get('http://www.python.org')
        self.assertIn('Python',self.driver.title)
        self.driver.find_element_by_link_text('Downloads').click()

        element = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'widget-title')))
        self.assertEqual('Looking for a specific release?', element.text)

        self.driver.find_element_by_link_text('Documentation').click()

        element = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'call-to-action')))
        self.assertIn('Browse the docs', element.text)

        element = self.driver.find_element_by_name('q')
        element.clear()
        element.send_keys('pycon')
        element.send_keys(Keys.RETURN)
        assert 'No results found' not in self.driver.page_source
```
Firebase Hostingの履歴を一括削除する方法

#Firebase Hostingには制限がある
[Firebase Hosting](https://firebase.google.com/docs/hosting?hl=ja)を使って，構築中のサービスをテストしています．コマンドで簡単にhostingできるので重宝しているのですが，Firebaseの無料プラン枠には使用上限(アップロードするファイル数の合計1 GB)がみたいです．上限を超えてもしばらくは使用ができますが，突然hostingできなくなるそうで，そうなる前に対処しました．

#ひとつずつ削除もできるけど…
Firebase consoleのHosting ダッシュボードでリリース履歴を1つずつ削除することもできるのですが，deployした数が多いと非常に面倒くさいです．そこでgithubにあがっている大変便利なツールを使って一括削除を行いました．

#ツールを使った一括削除
[こちらのGitHub](https://gist.github.com/mbleigh)で公開されているツールを使いました．まずはこのツールを以下のようにローカルにcloneします．

```
$ git clone https://gist.github.com/5be2e807746cdd9549d0c33260871d21.git firebase_hosting_version_cleanup
$ cd firebase_hosting_version_cleanup
$ npm install
```

いきなり削除を開始するのは怖いということで，確認ツールも用意されています．確認ツールを起動します．

```
node cleanupVersions.js <プロジェクト名> <残したいバージョン数>
```

プロジェクト名はconsoleで確認ができます．残したいバージョン数を指定すると，最新からその数分を除いた，削除対象のプロジェクト一覧が表示されるはずです．
確認後，実際に削除するコマンドが以下です．

```
node cleanupVersions.js <プロジェクト名> <残したいバージョン数> commit
```

これを実行すれば先程確認で表示された履歴が削除されます．consoleのHosting ダッシュボードでも削除されているのが確認できると思います．

#残す上限を指定できる
以上の方法で履歴を削除することはできるのですが，そもそもconsoleで残す数を指定することができます．consoleのhostingのダッシュボードで以下のスクショの箇所を押すと残したい数を指定することができます．
<img width="966" alt="スクリーンショット 2020-03-28 5.47.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597590/857aaf06-8399-c934-49b7-a4553f6e877b.png">
指定した後，右上に以下の画像のようなコメントが表示されれば成功です．
<img width="476" alt="スクリーンショット 2020-03-27 14.14.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597590/fffe1935-d313-9a24-4c2f-12ef6e761e8a.png">

以上です．
ブログをはじめるならGitHub Pagesがおすすめ

ブログをやるなら`GitHub Pages`か`GitLab Pages`がおすすめです。

私は、少し前にGitLabでブログをやっていましたが、その後、GitHubに移行したというか、戻りました。経緯としては`GitHub -> GitLab -> GitHub`という流れです。

[syui.github.io](https://syui.github.io)

割と長くGitHub PagesやGitLab Pagesでブログをやってきたので、今回は、両者の違いをまとめてみます。

- GitLabはプライベートリポジトリが無制限で、HTMLソースを公開しなくていい

- Web Serverは、GitHubのほうが安定していて速い

- GitLabのほうがドキュメントが充実しており、公式テンプレートがわかりやすい

- どちらもCIを回せるけど、GitLabはGitLab CIを回して、public/にビルドするという形態と採用するため、CIが成功しないとページが公開、更新されない。ユーザーが`.gitlab-ci.yml`を書く必要がある

- GitHub PagesはデフォルトでJekyll Buildを実行しページが公開される仕組み。ただし、リポジトリルートに`.nojekyll`を置くことでJekyll Buildを実行しないオプションも存在する。よって、HTMLを直に置いてページを作ることもできる

- GitHubは、`${USER}.github.io`というリポジトリ名を作成することで、当該ドメインが与えられる。`branch:master`にHTMLをpushすると更新される。複数のページを用意したい場合は、リポジトリを作ったうえで`branch:gh-pages`に`jekyll build`が通るHTMLを置くことでページを公開する

- GitLabも同じく`${USER}.gitlab.io`というリポジトリ名を作る。ただし、ブランチは基本的にはmasterを使用する。なお、`.gitlab-ci.yml`でソースを置くブランチは制御、変更できる

- 現在、GitHub Pagesには、GitLab CIに相当するGitHub Actionsがあるのでページの自動ビルド、デプロイに関しての不便はない

- GitLab Pagesは複数のドメインを登録できる。GitHubは無理。なので必要なときはGitLab Pagesのドメイン設定を使ってGitHub Pagesにリダイレクトさせるなどのハックに利用させてもらってる

### GitLabからGitHubに移行した経緯

私は、GitLab Pagesを2年くらい使っていましたし、特に不満もなかったのですが(たまに不安定で遅かったというのはある)、あるとき突然にページが非公開になってしまうことがありました。

で、運営に連絡してみたのですが、返事がなかったので、GitHub Pagesに同じソースでデプロイしました。つまり、ここで移行という形になります。

その後、GitLabの方で非公開が解除されたのですが、なんだったのかよくわからなかったので、その後、GitLabに戻ることはありませんでした。そのような経緯で、それ以降は、GitHub Pagesを使っています。

ただ、GitHubはCI連携がデフォルトではなかったため、通常は、ビルドしたものをリポジトリにpushしなければ更新できません。したがって、Travis CIを回してページのビルド、デプロイを自動化してましたが、GitHub Actionsが登場したので、今はそちらに移行しています。

### GitLab Pagesを使った複数ドメインを利用するハック

例えば、`blog.syui.cf`と`log.syui.cf`というドメインを`syui.github.io/blog`に飛ばしたいとしましょう。この場合、GitHub Pagesは一つのページに一つしかドメインを指定することができないので難しい。

そこで、GitLab Pagesで２つのドメインを登録した上で、CloudFlareなどのリダイレクトをGitHub Pagesへ走らせることで、`blog.syui.cf`と`log.syui.cf`を目的の場所に飛ばすことができます。

```
CNAME : gitlab pages

↓

リダイレクト : github pages
```

とはいえ、これはあくまでリダイレクトという形なので、アクセスは、トップドメインにとどまります。このような形を実現したい場合のみ利用できるハックです。

### 簡単にブログを立ててみる手順

#### GitLab Pages

https://gitlab.com/pages

まず、リポジトリを作りましょう。リポジトリ名は`${user}.gitlab.io`です。例えば、私の場合、`syui.gitlab.io`ですね。

そして、以下のリポジトリをpushしましょう。

```sh
$ git clone https://gitlab.com/pages/jekyll

$ cd jekyll

# ${USER}に注意
$ git remote add origin git@gitlab.com:${USER}/${USER}.gitlab.io.git

$ git push -u origin master
```

GitLab CIが通ったのを確認したら、ページが表示されているはずです。(GitLabの場合、成功しても公開まで少し時間がかかります)

ビルド出力は`public`ディレクトリでないといけません。このへんは注意です。それぞれのジェネレーター(静的サイトジェネレーターなど)の実行にオプションから指定しないといけない場合があるかもしれません。publicがデフォルトでない場合はそうですね。

複数のページを作りたい場合は、同じような手順に加えて、`.gitlab-ci.yml`を調整しましょう。

#### GitHub Pages

まず、リポジトリを作りましょう。リポジトリ名は`${user}.github.io`です。例えば、私の場合、`syui.github.io`です。

```sh
$ git clone https://gitlab.com/pages/jekyll

$ cd jekyll

# ${USER}に注意
$ git remote add origin git@github.com:${USER}/${USER}.github.io.git

$ git push -u origin master
```

複数のページを作りたい場合は、同じような手順に加えて、ブランチを`gh-pages`にしてpushしましょう。アクセスは、`https://${USER}.github.io/リポジトリ名`となります。

```sh
# リポジトリを作った上で
$ git remote add origin git@github.com:${リポジトリ名}.git
$ git branch -b gh-pages
$ git push -u origin gh-pages
```
初心者によるプログラミング学習ログ 275日目

#100日チャレンジの275日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
275日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>275日目<br>・XDデザインカンプからのwebサイト模写<br>・セクション1つ作成<br>・git,sass,FLOU設計<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/1243629377813798912?ref_src=twsrc%5Etfw">March 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Python 文字列 特定文字を置換による削除

## 背景
備忘録です。
文字列を扱うときに、いらない文字が含まれいると削除する必要がある。
調べても、あんまりしっくりいくものがなかったので。
そこで、特定文字を無くなるように文字列置換をしてあげることで楽に処理できる。


```python:change_and_remove_string.py
#邪魔な文字@,%を""に置換 
#:を.(コンマ)に置換
str_ = "@14@:@30@@%%%"
str_ = str_.replace('@', '')
str_ = str_.replace('%', '')
str_ = str_.replace(':', '.')
print("str_", str_)
#str_ 14.30

STR_ = "@14@:@30@@%%%"
STR_ = STR_.replace('@', '').replace('%', '').replace(':', '.')
print("STR_", STR_)
#STR_ 14.30
```
tkinterで作ったLabelの右端の座標【Python】

tkinterで作ったLabelの右端の座標が知りたい。

Frame,Labelの配置方法など基礎的な部分は[【tkinter】Labelを使ってみる](https://www.pytry3g.com/entry/2018/02/25/231420)などを参照してください。

(本記事は[tkinterでLabelを動かす【Python】](https://qiita.com/teahat/items/a1e70621a62ab3a42ad8)の一部です。検索しやすいように別記事に分けてみました。)

# 問題
```python

txt=Labeltext
label=ttk.Label(master=root,text=txt,font=("メイリオ",fontsize))
label.place(x=xx,y=yy)
```
としたとき、`label`の左端はもちもんxxである。
では、そのLabelの表示の上での右端の座標は？

# 答え
```python
label.winfo_reqwidth()+xx
```

# 解説(オマケ)
私ははじめ`len(txt)*fontsize`(`fontsize`の単位はピクセルpx)でいけると思った。しかし、[tkinterでLabelを動かす【Python】](https://qiita.com/teahat/items/a1e70621a62ab3a42ad8)で紹介した右端にきたら折り返すプログラムにて、文字列によってはLabelが右端に行く前に折り返してしまった。
![missrei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240141/1a9ad222-3ec7-c393-17d3-b092d372f655.gif)


これは、`len(txt)`としていることに起因する。この実装の場合、
iiiii
AAAAA
が同じ長さ扱いにされてしまうからである。

そこで登場するのが__`winfo_reqwidth()`__である。
https://effbot.org/tkinterbook/widget.htm によると、
>Returns the “natural” width for this widget. The natural size is the minimal size needed to display the widget’s contents, including padding, borders, etc. This size is calculated by the widget itself, based on the given options. The actual widget size is then determined by the widget’s geometry manager, based on this value, the size of the widget’s master, and the options given to the geometry manager.

要するに、指定されたオブジェクト(ここではLabel)をFrame上で表示するのに最小限必要なサイズを返してくれる。これに`label`の左端の座標xxを足せば、現在の`label`の右端の座標を取得できる。
![seikourei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240141/f6919b3f-1989-1cd5-ca5e-88ca0ff68fc4.gif)
うまく右端判定ができた。

</br>
ちなみに、`winfo_reqheight()`で高さが取得できる。すなわち、

```python

label=ttk.Label(master=root,text=txt,font=("メイリオ",fontsize),foreground="red",background="green")
print(label.winfo_reqwidth())
>>125
print(label.winfo_reqheight())
>>45
txt="Labeltext\nLabeltext"#二行に渡って表示する場合
label=ttk.Label(master=root,text=txt,font=("メイリオ",fontsize),foreground="red",background="green")
print(label.winfo_reqwidth())
>>125#横幅は変わらない
print(label.winfo_reqheight())
>>86#2行になったので増えた。ただし、≠45*2である点に注意
```
Google reCAPTCHAを設置する

個人的な備忘録として

#APIの取得

ここからいろいろ設定
[Google reCAPTCHA](https://www.google.com/recaptcha/admin/create)

#HTML

```recaptcha.html
<html>
<head>
<title></title>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<form action="" method="post">
    <div class="g-recaptcha" data-sitekey="サイトキーを入力"></div>
</form>
</html>
```

#php
```Ninshou.php
    public function login() {
        if ($this->request->is('post')) {
            //RECAPTCHAからのResponseデータを受ける
            $recaptchaResponse = $_POST['g-recaptcha-response'];
            $secretKey = "セキュリティーキーを入力";

            //reCAPTCHA
            $response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptchaResponse}");

            $responseKeys = json_decode($response,true);
            if(intval($responseKeys["success"]) !== 1) {
                $this->Session->setFlash('「私はロボットではありません」にチェックを入れてください。');
            } else {
                if ($this->Auth->login()) {
                    $this->Session->setFlash('ログインに成功しました。');
                } else {
                    $this->Session->setFlash('ユーザー名かパスワードを確認してください。');
                }
            }

        }
    }
Twitter詳細検索(iOS/ショートカット)作った！公開！

タイトルの通りiOSのショートカット機能使って作ったので公開します！
よく検索する単語や、一度検索した内容も再度使えるので便利です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609872/2e55191a-a387-7953-fbd1-d9d5aaf973f9.png" width="50">
▼公開リンク
<a href="https://www.icloud.com/shortcuts/881534a226af4e0a95727269ca7bb499" >Twitter詳細検索</a>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609872/091f57bf-c3bf-69dc-5fce-3e0cd1a40b70.png" width="300">



▼iPhoneショートカット機能について
<a href="https://support.apple.com/ja-jp/guide/shortcuts/welcome/ios" >ショートカット ユーザガイド - Apple サポート</a>
<a href= "https://support.apple.com/ja-jp/guide/shortcuts/apdf01f8c054/ios" >ショートカットを共有する - Apple サポート</a>
Ansible+ServeRSpecで学ぶ基盤自動構築(ダイジェスト版)

本日は今話題(※)のAnsibleとserverspecを使って、基盤自動構築を試してみたいと思います。
(※流行り廃りの激しいこの業界、この構成はもしかしてふるかったりしますでしょうか・・・教えて偉い人)
想定読破時間：5分

# 最初に

 - とりあえず最初に言っておきます以下の本の宣伝です。是非買ってください
 - ちょっとでもいいと思ったら以下ポチッとお願いします(アフィリエイト並の感想)
 - https://techbookfest.org/product/4761877666070528

## 伝えたいこと
今日はみんなにどうしても伝えたいことがある。(SAKURA○)

 - 自動構築は最高。神になれる。
 - 自動構築は簡単。いつも手でやっていることをちょっと頭捻って言葉にするだけ。

## 構成
自動構築する完成図は以下です。(Ubuntuと書いてありますが、RaspberryPiなのでRaspbianです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/c5d8a2e4-1493-005a-50ba-be06ae671a0e.png)

## 対象読者
以下の人が特にオヌヌメです。
 - インフラエンジニアをちょっとやってて自動構築に興味がある
 - Wordpressをインストールしたことがある人
 - アプリケーションエンジニアだけどどうやって基盤が構築されているか知りたい人
 - とにかく楽したい人
 - 今日朝ごはんあるいは昼ごはんあるは夜ご飯を食べた人
 - 神(あるいはそれに準ずる立場の方)

# Ansibleで構築してみる
Ansibleとは何か、みたいな前提知識は一旦ここでは端折っちゃいますね(本の中では書いてます。)
端的にいうとAnsibleは自動で構築できるフレームワークです(結局説明しましたね。)
もっともっと簡単にいうと、構築するときのシェルスクリプトの**書き方**をまとめたものみたいなものです。

例えば、Wordpressで使う用のApacheのインストールおよび、起動設定は以下の通りに記載します。

```yaml:main.yml
---
- name: Install Apache
    apt: name=apache2 update_cache=yes cache_valid_time=3600
- name: Start Aapche
    service: name=apache2 state=started enabled=yes
```

ぱっとみて何をしようとしているか非常にわかりやすいですね。
(aptコマンドでapach2インストール、そのあと、serviceコマンドでapache起動)
このファイルを作ったらあとは以下の通り実行するだけです。

```terminal:Ansible
root@raspberrypi:~# ansible-playbook -i hosts common.yml

TASK [Apache : Install Apache] 
**************************************************************************
changed: [raspberrypi01.local]
〜略〜
```

ね？簡単でしょう？
実際には事前の準備等々があるので、めちゃくちゃ省略してますが、
雰囲気だけでも伝わればいいかなと思います。(本では丁寧に解説してます)

# ServeRSpecでテストしてみる
構築をしたら次は構築できてるか確認(テスト)ですね。これはserverspecというツールを使います。
(元々はRSpecというrubyでのテストのためのツールをベースにしているようです。)

```ruby:sample_spec.rb
# Checking Installed Apache2
 describe package('apache2') do
  it {should be_installed}
 end 

# Checking Apache2 Service Status
 describe service('apache2') do
  it { should be_enabled }
  it { should be_running }
 end
```

```terminal:ServeRSpec
root@raspberrypi:~# rake
Package "apache2"
is expected to be installed

Service "apache2"
is expected to be enabled
is expected to be running
〜略〜
```

知識なんかなくったって何をしているかわかりやすいですね。shouldは「~すべき」ですからね。
これもAnsibleと同様、めちゃくちゃ省略してます。(Ansibleと同様、本では丁寧に(以下略))


# 最後に
大体5分で説明するならこれぐらいの分量ですね。(時間は金より重い。)
他にも本だとWordpressを自動構築するときの注意点だとか、AWSとかでの自動構築のイメージとか紹介してます。

上に戻らなくてもいいようにここにもリンク貼っておきますね。
https://techbookfest.org/product/4761877666070528
【React】export default しか無いコンポーネントの記述の仕方

# こっちの方がカッコいいよねと思った
```jsx

import React from 'react';

export default () => <h1>Hello World!!</h1>;
```

# こっちでも勿論OK
```jsx

import React from 'react';

const Hello = () => <h1>Hello World!!</h1>;

export default Hello;
```
Python CSVファイル 読み込みと書き込み

## 背景
CSVファイルの読み込みと書き込みの方法はネットにたくさんあるんですが、
毎回自分がググるのがつらいので、備忘録を作成します。
pandasライブラリを使ってもいいんですが、
csvファイルのフォーマット自体が整っていないときに使用できるかなと思います。
フォーマットが整っていたら、pandasを使うと楽です。

###CSVファイルの読み込み

```python:read_csv_file.py
import csv
#csvファイル
csv_file = "demo.csv"
with open(csv_file) as f:
    reader = csv.reader(f)
    #内包表記 1行ごとのデータをlist_に入れる
    list_ = [num for num in reader]
#出力
print("list_ ", list_ )
```

###CSVファイルの書き込み


```python:read_csv_file.py
import csv
#csvファイル
csv_file = "demo.csv"
#newline=""で書き込み時の改行を阻止
with open(csv_file , 'w', newline="") as f:
    writer = csv.writer(f)
    # writerow writerows の二種類を使い分ける
    writer.writerow(list_1)#list_1[A,B,C,D]
    writer.writerows(list_2)#list_2[[],[],[]]
```
【今日のアブストラクト】The Impact of Neural Network Overparameterization on Gradient Confusion and Stochastic Gradient Descent【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.


翻訳元
[The Impact of Neural Network Overparameterization on Gradient Confusion and Stochastic Gradient Descent](https://arxiv.org/abs/1904.06963)

# Abstract

### 訳文

本論文では, ニューラルネットワークのアーキテクチャが訓練の速度にどのように影響するかを研究する. これを正式に分析するために, 勾配の混乱 (gradient confusion) と呼ばれる簡単な概念を導入する. 混乱が高い場合, 異なるデータサンプルによって生成される確率的な勾配が負の相関を持ち, 収束が遅くなることがある. しかし, 勾配の混乱が低い場合には, データサンプルは調和的に相互作用し, 訓練は迅速に進行する. 新しい理論と実験結果を用いて, ニューラルネットのアーキテクチャが勾配の混乱にどのように影響を与え, その結果, 訓練の効率に影響を与えるかを示す. 深層学習で使用される一般的な初期化手法では, ニューラルネットワークの幅を大きくすると, 勾配の混乱が減少し, モデルの訓練が容易になることを示す. 一方, ニューラルネットワークの深さを大きくすると逆の効果がある. さらに, 直交初期化を用いた場合, 線形ニューラルネットワークでは初期の学習ダイナミクスが深さに依存しないことを示し, 深層学習モデルの学習の進め方を示唆している. 最後に, バッチ正規化とスキップ接続を組み合わせることで, 勾配の混乱が減少し, ガウス初期化を用いた非常に深いネットワークの訓練負担が軽減されることを観察した.


### 原文

In this paper we study how neural network architecture affects the speed of training. We introduce a simple concept called gradient confusion to help formally analyze this. When confusion is high, stochastic gradients produced by different data samples may be negatively correlated, slowing down convergence. But when gradient confusion is low, data samples interact harmoniously, and training proceeds quickly. Through novel theoretical and experimental results, we show how the neural net architecture affects gradient confusion, and thus the efficiency of training. We show that for popular initialization techniques used in deep learning, increasing the width of neural networks leads to lower gradient confusion, and thus easier model training. On the other hand, increasing the depth of neural networks has the opposite effect. Further, when using orthogonal initialization, we show that the training dynamics early on become independent of the depth for linear neural networks, suggesting a way forward for training deep models. Finally, we observe that the combination of batch normalization and skip connections reduces gradient confusion, which helps reduce the training burden of very deep networks with Gaussian initializations.
最新バージョンのUnityでStandard Assetsを入れてエラーが起きたときの対処法

Unityを使い始めた人の中には、Standard Assetsをインポートした人も多いと思います。

僕もUnityで最初にゲームを作ったときには、Standard Assetsのアセットを使って3Dゲームを作りました。

ただ、Standard Assetsをインポートしてそのまま使おうとしても、最新バージョンのUnityではエラーが発生します。

このままではコンソールにエラーを残したまま、ゲームのデモプレイはできず戸惑ってしまいます。


今回のエラーが出てしまう原因は、Standard Assetsで採用されているUI TextとUI Textureが、最新のUnityでは対応していないということです。

問題の解決手順は以下の通りです。

下部にある「Project」ウィンドウで、「Assets」→「Standard Assets」→「Utility」のフォルダを開きます。

次に、「Utility」フォルダ内の、「ForcedReset.cs」と「SimpleActivatorMenu.cs」を削除してください。

コンソールにエラーが残っているとデモができないので、エラーが残っている場合は左上の「Clear」をクリックしてください。

以上の手順でStandard Assetsのインポートに伴うエラーは解決できると思います。

参考になれば幸いです。
AtCoder AGC埋め立て帳 (Perl)

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)* を利用してAGC問題の簡単なものを埋め立てするポエムです

# 埋め立て（予定地）

|Contest|A|B|
|:--:|:--|:--|
|AGC043|<font color="gray"></font>|
|AGC041|<font color="gray">Table Tennis Training(254)</font>|
|AGC040|<font color="gray">><(327)</font>||
|AGC039|<font color="brown">Connection and Disconnection(645)</font>||
|AGC038|<font color="green">01 Matrix(1110)</font>||
|AGC037|<font color="gray">Dividing a String(198)</font>||
|AGC036|<font color="green">Triangle(932)</font>||
|AGC035|<font color="brown">XOR Circle(688)</font>||
|AGC034|<font color="brown">Kenken Race(587)</font>|<font color="green">ABC(1062)</font>|
|AGC033|<font color="green">Darker and Darker(1132)</font>|
|AGC032|<font color="brown">Limited Insertion(657)</font>||
|AGC031|<font color="brown">Colorful Subsequence(648)</font>||
|AGC030|<font color="gray">Poisonous Cookies(17)</font>||
|AGC029|<font color="gray">Irreversible operation(327)</font>||
|AGC028|<font color="brown">Two Abbreviations(605)</font>||
|AGC027|<font color="gray">Candy Distribution Again(92)</font>||
|AGC026|<font color="gray">Colorful Slimes 2(32)</font>||
|AGC025|<font color="gray">Digits Sum(26)</font>||
|AGC024|<font color="gray">Fairness(127)</font>||
|AGC023|<font color="brown">Zero-Sum Ranges(1032)</font>||
|AGC022|<font color="brown">Diverse Word(677)</font>||
|AGC021|<font color="gray">Digit Sum 2(218)</font>||
|AGC020|<font color="gray">Move and Win(3)</font>||
|AGC019|<font color="gray">Ice Tea Store(265)</font>||
|AGC018|<font color="green">Getting Difference(917)</font>||
|AGC017|<font color="brown">Biscuits(535)</font>||
|AGC016|<font color="brown">Shrinking(501)</font>||
|AGC015|<font color="brown">A+...+B Problem(424)</font>|<font color="brown">Evilator(508)</font>|
|AGC014|<font color="gray">Cookie Exchanges(79)</font>|<font color="green">Unplanned Queries(1175)</font>|
|AGC013|<font color="brown">Sorted Arrays(447)</font>||
|AGC012|<font color="gray">AtCoder Group Contest(241)</font>||
|AGC011|<font color="brown">Airport Bus(566)</font>|<font color="green">Colorful Creatures(915)</font>|
|AGC010|<font color="gray">Addition(4)</font>||
|AGC009|<font color="brown">Multiple Array(607)</font>||
|AGC008|<font color="brown">Simple Calculator(616)</font>||
|AGC007|<font color="brown">Shik and Stone(612)</font>||
|AGC006|<font color="brown">Prefix and Suffix(450)</font>||
|AGC005|<font color="green">STring(975)</font>||
|AGC004|<font color="gray">Divide a Cuboid(321)</font>||
|AGC003|<font color="gray">Wanna go back home(178)</font>|<font color="green">Simplified mahjong(1186)</font>|
|AGC002|<font color="gray">Range Product(119)</font>|<font color="brown">Box and Ball(693)</font>|
|AGC001|BBQ Easy(?)||
# 短評
|Problem|Comment|
|:--|:--|
|Darker and Darker|Perl では TLE|
|Getting Difference|最大公約数|
|Biscuits|組み合わせ|
|Unplanned Queries|意味不明|
|Colorful Creatures|累積和|
|Shik and Stone|幅優先探索|
|Box and Ball|確率計算の無いPageRank|
# まとめ
+ *[AtCoder](https://atcoder.jp/home)* さん、ありがとう
+ *[AtCoder Problems](https://kenkoooo.com/atcoder/)* さん、ありがとう
+ ネット上で解答・解説を載せているみなさん、ありがとう
Laravel 6系以降のauth


使い方、ざっくりした流れ

1.laravel/uiライブラリをインストール

変更されるファイル
・composer.json
・composer.lock

```bash
composer require laravel/ui
```

2.LOGIN機能＆テーブル作成

```bash
php artisan ui vue --auth
```

追加されるファイル
app/Http/Controllers/HomeController.php
resources/js/components/ExampleComponent.vue
resources/sass/_variables.scss
resources/views/auth/login.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/auth/verify.blade.php
resources/views/home.blade.php
resources/views/layouts/app.blade.php

変更されるファイル
package.json
resources/js/app.js
resources/js/bootstrap.js
resources/sass/app.scss
routes/web.php
webpack.mix.js

3.packageインストール(npmが必要)

```
npm install
```

4.CSS/JS 作成ビルド

```
npm run dev
```


##laravel5系の場合
Laravel5系の場合は下記コマンドで６系、７系の上記コマンドと同じ環境になる

```
php artisan make:auth
```

##認証メソッド

```controller.php
use Illuminate\Support\Facades\Auth;

// 現在認証されているユーザーの取得
$user = Auth::user();

// 現在認証されているユーザーのID取得
$id = Auth::id();

// 認証チェック
if (Auth::check()) {
    // ユーザーはログインしている
} else {
  // ログインしていません
}
```

上記のように認証ユーザを取得してAuth::check()メソッドを使うとログイン済かログイン未なのかがチェックできるので、それに応じてログインページにリダイレクトさせたりできる。

デフォルト設定なら自動的にルーティングやコントローラが作成されているはずなので下記のようにしてログイン未ならリダイレクトとかやれば良いかとおもう。（ルーティングやコントローラは自身の環境確認してください）

```
return redirect('/login');

return redirect('/register');

```

※調べたらルーティングにｍiddleware('auth')を追加するだけでログインフォームにリダイレクトされるみたいですね。
下記にまとめときます
##特定ページに画面遷移したとき、ログインしてない場合はリダイレクトさせる方法

ルーティングの後に```ｍiddleware('auth')```を追加するだけ

```
Route::get('/hoge', 'HogeController@index')->middleware('auth');
```

##ログイン処理の実装

```php
# Auth::attempt()メソッドを使う

    if (Auth::attempt(['email' => $email,
                       'password' => $password])) {
                         $msg = "ログインしました。'( . Auth::user()->name . ')";
                       } else {
                         $msg = "ログインに失敗しました。";

```

```controller.php
  public function getAuth(Request $request)
  {
    $params = ['message' => 'ログインしてください'];
    return view('hello.auth', $params);
  }

  public function postAuth(Request $request)
  {
    $email = $request->email;
    $password = $request->password;
    if (Auth::attempt(['email' => $email,
                       'password' => $password])) {
                         $msg = "ログインしました。'( . Auth::user()->name . ')";
                       } else {
                         $msg = "ログインに失敗しました。";
                       }
                       return view('hello.auth', ['message' => $msg]);
  }
```

独自で作ったログイン画面を使うこともできるし、デフォルトのログイン画面をカスタムして使うこともできるので、やり方次第でなんでもできそう。


##参考サイト

https://qiita.com/rei67/items/d6d0f5f6e58edbb17c09

https://qiita.com/ucan-lab/items/bd0d6f6449602072cb87

公式：https://readouble.com/laravel/7.x/ja/authentication.html
reCAPTCHAのチェックボックスを送信ボタンにする

#概要

reCAPTCHAのチェックボックス、わざわざクリックしたのにフォームの送信ボタンをわざわざもう一回押さなきゃいけないのって面倒くさいと思ったんですよ。

いや、それくらいやれよって思う人も居ると思うんですよ。わかってますよ。

でも僕みたいに最小限の操作だけで物事を行いたいって人も居ると思うんです。

まぁ今回はそんな面倒くさがりの僕みたいなユーザーばっかりのサービスを作るあなたにぴったりなお話です。

# ※注意

今回はサーバーサイド側のコードは一切ありません。
全てJavaScriptだけで完結しています。

サーバー側は[こっち](https://qiita.com/Sakurai-Shinya/items/15c20fde94045569a44f)のコードの使いまわしです。
もし宜しかったらこっちの方も見てやってくだしあ！！

# まず普通に動くHTMLコードを用意します

無い人は[こっち](https://qiita.com/Sakurai-Shinya/items/15c20fde94045569a44f)から引っ張って来ましょう。

```HTML
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>reCAPTCHAのサンプル</title>
        <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    </head>
    <body>
        <form action="login" method="post">
            ID:<input type="text" name="id"><br>
            パスワード:<input type="password" name="current-password">
            <div class="g-recaptcha" data-sitekey="[あなたのサイトキー]"></div>
            <input type="submit" value="ログイン">
        </form>
    </body>
</html>
```

引っ張ってきました。

# 送信ボタンを消します

この記事では送信ボタンはいらない子です。

# g-recaptchaの要素にdata-callbackを追加

チェックボックスが押された時にreCAPTCHAに実行してもらう関数名を決めます。
ここでは「formSubmit」と決めています。

```HTML
<div class="g-recaptcha" data-sitekey="[あなたのサイトキー]"></div>
    <!-- ↓こう追加する -->
<div class="g-recaptcha" data-sitekey="[あなたのサイトキー]" data-callback="formSubmit"></div>
```

# 送信するフォームをJavaScriptから手に取れるようにする

formに名前を付けましょう。
ここでは「loginForm」と決めています。
~~今からお前の名前はloginFormだ！いいかい、loginFormだよ。分かったら返事をするんだ、loginForm！！~~

```HTML
<form action="login" method="post">
    <!-- ↓こう追加する -->
<form action="login" method="post" name="loginForm">
```

# ここが肝心！JavaScriptを書く！

それではチェックボックスにチェックが入ったら叩かれる関数を書きましょう。

```javascript
function formSubmit(){
	document.loginForm.submit();
}
```
実行されたら指定したformのsubmit()を実行するだけです。
簡単ですねぇ～～～

# テスト

完成したら試しに実行してみましょう

以下のGIFのようになれば成功です。

![SS1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607960/9878d462-0080-97cc-ba15-080a37bdd162.gif)

# おまけ

やっぱちゃんとチェックボックスが入るアニメーションがみたいですよね？

JavaScriptのsetTimeoutを使って送信を遅らせましょう。

```javascript
function formSubmit(){
	setTimeout(function() {
		document.loginForm.submit();
	},1000);
}
```

![SS2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607960/1e5cc0c9-7ef3-2a55-bb32-cbb546f132c0.gif)
SQL Server ExpressでTCP/IP接続する方法

Microsoft SQL Serverへのアクセス方法は、共有メモリ、名前付きパイプ、TCP/IP接続の３つで、その中でもTCP/IPが一般的です。

ExpressサーバをWindows10などにインストールして、Microsoft SQL Server Management Studio（SSMS）でローカル接続して使っているうちは共有メモリアクセスで気づかないけど、ソケット接続しようとすると1433でつながらないぞということでちょっとハマったのでメモしておきます。

SQL ServerのTCP/IPのListenポートといえばtcp:1433で有名ですが、無料版のSQL Server ExpressではWell-knownポートでのListenができないため、別のポートを使う必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609861/af196d31-5357-b5fa-b9bd-feef49e2141e.png)

###SQL Server Confiruration Managerの設定
まずはSQL Server Confiruration Manager（構成マネージャー）を起動して、TCP/IPの設定を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609861/4e5d8982-89d0-8072-5161-90822c2f6602.png)

TCP/IPのプロパティを開いて、IPアドレスのタブの一番下にあるIPAllのTCPポートに49152～65535の間で決めます。
これを設定しないと、ポート番号がSQL Serverを起動するたびに動的に任意のポート番号が割り当てられるので面倒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609861/015707e8-2984-3579-5cf7-ff77b6c7aafe.png)

###ファイアウォールの設定
管理ツールからWindows Firewallの構成マネージャを開いて、「受信の規制」で新しい規制を登録します。
適当な名前を付けて、「プロトコルおよびポート」のタブでプロトコルの種類を「TCP」、ポート番号をSQL Server構成マネージャで設定したポート番号を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609861/6d55f1ac-8afd-6e06-82bb-254d74543b7a.png)

これでSQL Server側の設定は完了です。

###接続テスト
SSMSでは共有メモリ接続してしまうので、HeidiSQLを使って接続テストしました。
ホスト名はlocalhostでポート番号は構成マネージャやFirewallで設定したポート番号を記述します。
ちゃんと設定されていれば接続できるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609861/df3d7797-fffc-8921-3dce-8160c149c7c1.png)

###トラブルシューティング
うまくつながらない場合はユーザの設定などが怪しいかもしれません。SSMSのセキュリティのところで確認してみましょう。
iTermでトラックパッド使わないでコピー

# iTermでトラックパッド使わないでコピー
iTermで表示されたテキストをコピーするとき、トラックパッドでマウスカーソルで選択してコピーしていました。
できるだけキーボードで操作しようとしてるのにこれはcoolじゃない。

そんな中、トラックパッドを使わなくてもテキスト選択できる方法を知り感動したのでメモ


## command + shif + C でvimのノーマルモードみたいになる
見出しの通りです。

`command + shift + C` でvimみたいに自由に移動できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/c6e7737f-30b0-583f-dd19-9b8dbafd57c5.png)

こんな感じでキーボードだけで任意の範囲を選択できます。便利〜
Folding@homeの使い方(Windows)

>【告知】慶應SFC生によるF@hグループ「[KeioSFC](https://stats.foldingathome.org/team/253284)」に言い出しっぺとして参加しています。自分は慶応/SFC関係者だと思う皆様、SFCが好きな皆様ぜひご参加ください。[詳細](https://wiki.jj1lfc.dev/fah-keiosfc)

- 追記:友人が[Ubuntuでの参加方法](https://wiki.jj1lfc.dev/blog/fah-on-ubuntu-server)を書いています。ぜひご覧ください

# 背景
知人友人とF@hに参加していますが、チームへの参加方法など聞かれることが多かったので簡単にまとめました。不正確な点、情報不足な点などありましたらご指摘ください。

## 注意

プロジェクトへは自己責任で参加してください。私はこの記事を読んで参加した方に損害や電気代が発生しても責任を取れません。PCに長時間高い負荷を掛け続けることはPCパーツの劣化を招き、低品質なパーツは発火のリスクも存在することを理解してください。自作PCの場合、冷却系に配慮してください。

# インストール
[公式](https://foldingathome.org/)からインストーラーをダウンロードできます。詳しいことは[PC WATCH](https://pc.watch.impress.co.jp/docs/news/1243458.html)に載ってます。

# 起動
インストールするとWebUIが立ち上がりますが、個人的にはアプリの方が好きなのでアプリベースで話します。WebUIについては先程の[PC WATCH](https://pc.watch.impress.co.jp/docs/news/1243458.html)に詳しく書かれています。

![EUH53kLUYAAo-na.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/6b61632b-840b-9aa6-4744-bdda778f51b0.jpeg)

このうち私が触っていのは主に2つです

- Fold/Pause/Finishボタン
 - Foldを押せばF@hに参加し始めます。ただし**すぐにタスクが割り当てられるとは限らない**ので気長に待ちましょう。

- FoldingPower
  - 負荷の大中小を選べます



#ID設定、チーム参加

上部のメニューからConfigureを開きます。
![EUH5q4gUYAAoqQd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/8d957a9a-f34b-cac8-dd92-2a9f1cf128cd.png)
このうち私は**Identity**タブで以下を設定しています。

- Name
- TeamNumber
    - 参加したいチームの番号を入力します。日本だと[ASRockJapan公式Twitter](https://twitter.com/AsrockJ/status/1243107009634775041)、海外だと[LinusTechTips](https://www.youtube.com/watch?v=KU4qOebhkfs&feature=youtu.be)なんかがチームを作っているほか、後述するように誰でも作成できます。参加する・しないでメリットは多分ありません。ただただ楽しい。
    
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E6%8B%A1%E6%95%A3%E5%B8%8C%E6%9C%9BRT%E3%81%8A%E9%A1%98%E3%81%84%E3%81%97%E3%81%BE%E3%81%99?src=hash&amp;ref_src=twsrc%5Etfw">#拡散希望RTお願いします</a> <br>ASRockerでもそうでない人も<br>リソース余ってたり、stresstestしたい自作erかもーん！<br><br>新型コロナ解析で分散処理プロジェクト「Folding@home」<a href="https://t.co/4EheevUKsK">https://t.co/4EheevUKsK</a> <a href="https://twitter.com/pc_watch?ref_src=twsrc%5Etfw">@pc_watch</a>さんから <a href="https://t.co/pUtQyuQgPp">pic.twitter.com/pUtQyuQgPp</a></p>&mdash; ASRock Japan (@AsrockJ) <a href="https://twitter.com/AsrockJ/status/1243107649094184960?ref_src=twsrc%5Etfw">March 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


- Passkey
    - [Click here to...](https://apps.foldingathome.org/getpasskey)というリンクを踏み、メアド登録フォームに登録するとPasskeyが発行されます。これを登録してあるとスコアにボーナスがつくらしいです(詳しくは英語読んでください)。
    

# スコア閲覧
[公式サイト](https://stats.foldingathome.org/teams-monthly)でチームや個人のスコア、ランキング等が閲覧できます。ただしチームの設定やスコアの反映には結構時間がかかります。気長に待ちましょう。
**追記; 2020-03-28 01:26:02（UTC)頃から更新が止まっているみたいです。代わりに公式ドメイン上の[JSONファイル](https://api.foldingathome.org/team/find?name=KeioSFC)でランキングなどが閲覧できるようです**


# チームの作成
[このフォーム](https://apps.foldingathome.org/team)に必要事項を記入するだけです。
チーム作成時には"Team" "ResetCode"欄は空欄で構いません(TeamIDはたぶん指定できない)。また、URLなど一部はOptionalです。

![Screenshot from 2020-03-27 23-39-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/d77db842-7f6e-9c20-9957-c281bd56ac6e.png)
WordPressの独自テーブルに格納したデータを記事内で表示する方法【$wpdbとショートコードの利用】

WordPressのホスティングサーバで動作するMySQLの独自テーブルに格納したでデータを、記事内で表示する方法について説明します。

#WordPressの独自テーブルに格納したデータを記事内で表示する方法
ということで、前回の説明で活用した独自テーブルのデータ表示を例として説明したいと思います。

>（参考）
[スプレットシートのデータをWordPressのMySQLにコピーする方法【PHPでまるっと処理】](https://qiita.com/fuku_up/items/7125e63d75ab42a494a3)

>具体的には`wp_member_list`という独自テーブルに格納した以下のデータを表示することを目指します。
![wordpress_mysql_show_data_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/1da1535c-e2cf-7c93-0b64-64aa5c59a47e.jpeg)

>また、独自テーブルを活用する際には、`wp-db.php`ファイルの更新も必要になるので、分からない方は[こちら](https://qiita.com/fuku_up/items/28e7540cac7cfc1602f1)の記事もご確認ください。

#$wpdbを使うショートコードの作成
以下の通り、[外観] → [テーマエディター]から、更に`functions.php`を選択し、ファイル最下部に以下のコードを貼り付けてください。いわゆるショートコードを作る作業です。
![wordpress_mysql_show_data_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/c978bfac-7d9b-b0da-ffc6-4ddf37f2e1cc.jpeg)

**【貼布するPHPコード】**
ここではは`show_table`という名前のショートコードを作成しています。

```php:functions.php
function show_table_func()
{
    global $wpdb;
    $rows = $wpdb->get_results("SELECT * FROM $wpdb->member_list");

    echo "<br> 独自テーブルのデータを表示 <br><hr>";

    // データベースのレコード毎に出力処理を行う。![wordpress_mysql_show_data_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/b71e36f4-12e0-92bb-c2be-de1b55201744.jpeg)

    if ($rows) {
        foreach ($rows as $row) {
            echo "<img border='0' src='".$row->image."' width='50' height='50'>";
            echo "<p>名前:".$row->name."</p>";
            echo "<p>出身地:".$row->birthplace."</p>";
            echo "<p>主な実績:".$row->performance."</p>";
            echo "<hr>";
        }
    }
    return;
}
add_shortcode('show_table', 'show_table_func');
```

#ショートコードによる独自テーブルデータの表示
新規投稿を選択して、本文に`[show_table]`と入力してください。これにより、先ほど作成したショートコードを呼び出します。あとは通常通り公開でOKです。

![wordpress_mysql_show_data_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/f87bf332-75b4-cb58-4051-bbc28f29346c.jpeg)

**【アップロードした投稿の表示確認】**
期待通りに実行が完了していれば、以下のようにデータベースに格納したデータがリストで表示されます。
![wordpress_mysql_show_data_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/7e9f250f-7e7b-322d-cc9e-dd2de4462a4f.jpeg)

細かいデザインなどは、CSSなど調整してお好みで変えてください！！

---
ということで、WordPressの独自テーブルに格納したデータを記事内で表示する方法についての説明でした。

WordPress上でfunctions.phpを編集すると構文チェックなど最低限のエラーチェックをしてくれるので、割と便利です。ただし、誤ったコードを書くと、最悪の場合WordPress自体が動かなくなってしまったりするので、バックアップを事前にとるなどリスクへの対処はお忘れなくです。
pandasのDataFrameの"どこか"に任意の値がないかを調べる方法

#概要（TL;DR）
50列x300万行のcsvの中に、いずれの列でも良いので、ある文字が含まれている行を抽出して欲しいという依頼を受けて、まさかExcelでは開けないので、Pandasで試してみた。

#注意
***grep***使えば・・・とか絶対に言わないこと。あくまでもpandasの練習なんです。

#サンプルデータ
流石に50列x300万行のcsvで書くと面倒なので、下記をサンプルデータとする。（実際のデータはNaNとかもあるので、もう少し複雑だった。）

```python
df = pd.DataFrame({"NAME":["Alice","Bob","Charly","Eve","Frank"],
                   "AGE":[10,20,30,20,10],
                  "ADDRESS":["TOKYO","OSAKA","TOKYO","OSAKA","AICHI"],
                  "COMPANY_PLACE":["TOKYO","TOKYO","AICHI","OSAKA","OSAKA"],
                  "BIRTH_PLACE":["TOKYO","OSAKA","TOKYO","OSAKA","OSAKA"]
                  })
df.head()
```

![スクリーンショット 2020-03-27 23.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/de29118b-fb5e-29c7-553c-0697982765df.png)

#作戦A：すべての列を結合した列を作る
全部の列を結合させて、その列に対して部分一致検索をすればいいじゃないか！

```python
df["P"] = df['ADDRESS'].str.cat(df['COMPANY_PLACE'], sep='-').str.cat(df['BIRTH_PLACE'], sep='-')
df

```

![スクリーンショット 2020-03-27 23.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/24d14715-ea05-e32a-a4f3-b1a8a00d7752.png)


```python
df[df["P"].str.contains("OSAKA")]
```

<img width="649" alt="スクリーンショット 2020-03-27 23.23.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/d28f4648-ad25-ea0e-0966-a45062602fc0.png">

サンプルは5カラムだけど、実データは50列・・・。全部足すのはちょっと・・・。


# 作戦B:列の結合を工夫しよう

```python

df = df.drop("P",axis=1)
df["P"] = [""] * len(df)
for column in df.columns.values:
    if column != "P":
        df["P"] = df["P"].str.cat(df[column].astype(str), sep='-')
df[df["P"].str.contains("OSAKA")]
```

文字列と数字が混ざる危険性があるので、catするときにastype(str)しておくのがポイント。

<img width="695" alt="スクリーンショット 2020-03-28 0.18.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/e114710f-3ebf-a4bf-676b-12b8d942d077.png">


# 作戦C:各列を検索して、結果をまとめる。

```python
df["P"] = [False] * len(df)
for column in df.columns.values:
    df["P"] = df["P"] | df[column].astype(str).str.contains("OSAKA")
df[df["P"]]
```

<img width="562" alt="スクリーンショット 2020-03-28 0.10.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/a05b2267-8869-72f0-5616-662759d0d54b.png">


# 結論

やっぱりgrep + awkが最強。
いいトレーニングにはなったけど、策に溺れた気分・・・・。
Power Query クロス結合(Cross Join)

Power Queryでクロス結合（交差結合）してみました。

#クロス結合
２つのテーブルを結合して 新しくテーブルを作るとき、
２つのテーブルのデータを 全て組み合わせるやり方です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/88019c7c-926d-f694-adae-7554ec8c97f3.png)

Power Queryの"クエリのマージ"（いわゆるJoin）は外部結合、内部結合などは選べるけど、クロス結合は用意されてません。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/738186e2-3126-8ed3-bbde-c36c502ac221.png)

そして２つのテーブルを紐づける照合列を 必ず選ばないとマージできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/036e9b48-421f-5e16-b6cf-e290222152c6.png)
この"クエリのマージ"画面では どう頑張ってもできなかったので、"カスタム列の作成"を使いました。

#カスタム列の作成 でクロス結合する手順

まずテーブルAを開いて
カスタム列ボタン を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/983c95c6-a65c-9564-1a41-b2fb7bb0f3de.png)

カスタム列の式に`=テーブルB` と打ち込み
（もしくは Ctrl+Space で表示される一覧からテーブルBを選び）、
OKボタン を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/e0ab83af-878d-178b-2ca1-2c92b5733d1a.png)

展開ボタン を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/07e49801-4f64-35e0-a045-a44e714ed336.png)

OKボタン を押します。（お好みでプレフィックスを外してください。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/31ead12f-05e5-561e-e126-5b3b786a1414.png)

完成！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239983/b80dba3f-6159-1397-6feb-02142393f14a.png)
クロス結合できました。

#おわりに
クロス結合は **すべてのマージ(Join)の基礎**になる テーブル操作です。

もちろん、"特定の１列" が "一致する" のであれば、
あらかじめ用意されたマージで十分なことがほとんどで、実際、左外部マージはよく使います。

でも、ちょっと凝ったことをしたいとき、

例えば、複数の列を参照したり、不等号(≦や≧)で比較してマージする場面で
ものすごく柔軟にデータを加工できますよ。

クロス結合を使って、自分で作り上げることで
いろんなデータ、細かい要件に対応できるようになると思います。

とはいえ、
これ単体ではどうやって使うのか 想像しにくいかも なので、
[別記事](https://qiita.com/hrkasno/items/b57ddc5877d9d84c37c3)で活用例を書き~~ます~~ました。

やっぱりクロス結合を標準メニューに欲しいなぁ。

#参考
[複数リストから全ての組み合わせデータを作りたい（2/2）](https://www.shegolab.jp/entry/excel-macro-cross-join)
GoogleAnalyticsのrawデータをBigQueryにcloud functionsを使って定時エクスポート

#GoogleAnalyticsのrawデータをBigQueryにcloud functionsを使って定時エクスポート

[2日目の記事](https://qiita.com/AoHina/items/4eb2b469705382c8519b)と内容がほぼ同じなのですが、しばらくして、2日目の記事がcloud functionsからだと使えないことがわかったので、詰まったところと、その対処方法までお伝えしていきたいと思います。

##やること
1. GoogleAnalytics APIを使ってpythonにrawデータをはき出す
2. pandasを使って、GoogleCloudStarageにアップロード
3. GCSからBig Queryにエクスポート

##つまったところ
###1.ローカルにファイル作成ができない
2日目のものはローカルで実行する分には問題ありませんでした。
しかし、cloud functionではread onlyであり、csvファイルを作成することができません。
なので、直接BigQueryにエクスポートするか、GCSにcsvファイルを作成することなくアップロードするしかありません。
結果から言うと、後者を選びました。

/tmp/ディレクトリならファイル作成できるとか記事があったんですが、試してうまく行かなったので途中であきらめました。

###2.なんか勝手に実行する関数に2つの変数を与えられている
実行する関数には2つの変数を用意しておかないといけないようです。

##理由
前者だと、letter,number,under_scoreしかpagePathに使えないらしく、また、ほかにもルールがいろいろとあるようで使えませんでした。

##GCSに直接アップロードする方法
記事を探していたら、この方の記事がわかりやすかったです。
[PythonでGoogle Cloud Storage(GCS)、BigQueryへpandas DataFrameをcsv保存するclass](https://qiita.com/LightSign/items/17d652978095bae02d94)

##コード
[day5.py](https://github.com/HinataAoki/Everyday-AI-life/blob/master/day5.py)

##5日目も終了！
ちょっとこういうのを塚回すのもどうかなって思ったんですが、めっちゃ時間かかっちゃったので、ほかにも同じ人がいたら助けになれたら幸いです。
みなさんもコロナには気を付けてください！
北大西浦先生のコロナ感染者数の推定の論文を読んでみた。

# はじめに

素人が英語の医学論文を読むのなんか絶対無理と思っていたけど、ガマンして読んでたらなんとなくわかった気になれたというお話です。

感染の発生をポアソン分布でモデル化して、対数尤度関数で推定しましたとのことです。

原論文はこちらです。
[ Ascertainment rate of novel coronavirus disease (COVID2 19) in Japan](https://www.medrxiv.org/content/10.1101/2020.03.09.20033183v1.full.pdf?fbclid=IwAR0STGh1iicp4yOpP5OVlspyg7NJJEbFCtQUg-eFlbnzzOlbr4UW3W0Eixk)

## 使用するデータ

* ２月２８日時点の都道府県別、年代別の人口と軽症患者数と重症患者数を使います。

$N_{x,a}$ = 県$x$ の 年代$a$ の人口
$D_{ns,x,a}$ = 県$x$ の 年代$a$ の軽症患者数
$D_{s,x,a}$ = 県$x$ の 年代$a$ の重症患者数

$ns$はnon-severe、$s$はsevere、$a$はageの略です。

* 年代別の重症患者に対する軽症患者の割合$f_a$を使います。

$f_a$ = 年代$a$の軽症患者数 ÷ 年代$a$の重症患者数 

※ $f_a$は中国で得たデータを使っています。

## 推定したい値

* 軽症感染者のうち検査で見つかった患者の割合 $k$ を推定します。

$k$ = 検査で見つかった軽症患者数 ÷ 軽症感染者数全体

検査で見つかった人以外にどれくらい軽症感染者がいるの？ということを知りたいわけです。

* 年代別の重症患者の確率$p_{x,a}$を推定します。

$p_{x,a}$ = 年代$a$ の人が重症患者になる確率

年代$a$ の人が軽症感染者になり検査で見つかる確率は以下の式とします。

```math
k \cdot f_a \cdot p_{x,a}
```

つまり、重症患者の確率$p_{x,a}$に$f_a$をかけると軽症感染者の確率になり、$k$をかけると検査で見つかる確率になるということです。

※論文では $p_{x,a}$ と書かれていますが、おそらく$p_{x,a}$は県$x$には依存しないと思います。
読み間違えていたら、すみません。

## ポアソン分布

$p_{x,a}$ は[ポアソン分布](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83)に従うとします。

ポアソン分布は２項分布で、試行回数$n$が大きく確率$p$が小さい場合に、$\lambda$を一定に保った場合の極限です。

$$
\lambda = n \cdot p   \qquad (n \to \infty)
\tag{1}
$$

ポアソン分布で事象が$m$個起こる確率は以下の式になります。

```math
\frac{\lambda^m \exp(-\lambda)}{m!}
\tag{2}
```

### 重症患者の確率
県$x$では年代$a$の重症患者という事象が$D_{s,x,a}$個ありました。
また、県$x$の年代$a$の人口は$N_{x,a}$で、重症患者になる確率は$p_{x,a}$なので、式(１)から$\lambda$は以下になります。

$$
\lambda = N_{x,a} \cdot p_{x,a}
$$

この$\lambda$を式(２)に代入すると重症患者の確率は以下になります。

```math
\frac{(N_{x,a} p_{x,a} )^{D_{s,x,a}} \exp(- N_{x,a} p_{x,a})}{D_{s,x,a} !}
\tag{3}
```

### 軽症患者の確率
同様に県$x$の年代$a$の軽症患者の事象は$D_{ns,x,a}$個ありました。
県$x$の年代$a$の人口は$N_{x,a}$で、検査で見つかる軽症患者の確率は$k f_a p_{x,a}$なので、式(１)から$\lambda$は以下になります。

$$
\lambda = N_{x,a} \cdot k f_a p_{x,a}
$$

この$\lambda$を式(２)に代入すると軽症患者の確率は以下になります。

```math
\frac{ (N_{x,a} k f_a p_{x,a}) ^{D_{ns,x,a}} \exp(- N_{x,a} k f_a p_{x,a} )}{D_{ns,x,a} !}
\tag{4}
```

### 対数尤度
式(３)と式(４)から同時確率の対数尤度は以下になります。

```math
\ln[\Pi_x \Pi_a  
\frac{(N_{x,a} p_{x,a} )^{D_{s,x,a}} \exp(- N_{x,a} p_{x,a} )}{D_{s,x,a} !}
\cdot
\frac{ (N_{x,a} k f_a p_{x,a}) ^{D_{ns,x,a}} \exp(- N_{x,a} k f_a p_{x,a} )}{D_{ns,x,a} !}
]
```

対数の中の積を外に出して和にすると

```math
 = \sum_x \sum_a \ln[ 
\frac{(N_{x,a} p_{x,a} )^{D_{s,x,a}} \exp(- N_{x,a} p_{x,a} )}{D_{s,x,a} !}
\cdot
\frac{ (N_{x,a} k f_a p_{x,a}) ^{D_{ns,x,a}} \exp(- N_{x,a} k f_a p_{x,a} )}{D_{ns,x,a} !}
]
```

この式を $k$ や $p_{x,a}$ で偏微分して0とおくと、$k$ や $p_{x,a}$の最尤推定はできそうです。

論文ではプロファイル尤度信頼区間で信頼度を求めたとありますが詳しい内容は分かりませんでした。

論文の結論は $k$の推定値は0.44で、95%の信頼区間は0.37～0.50でした。

つまり、検査で見つかった軽症患者数の２倍くらいしか日本には軽症感染者はいないということです。

### おわりに

感染症については素人ですので、間違えてるところもあるかもしれません。
誤りなどがあれば、コメント欄で指摘していただければ助かります。

**ここまで読んでいただき、ありがとうございました。**
Mac Node.jsのバージョン有効化する手順でvX.X.X is not installedと出力された話

# 目的

- Node.jsをHomebrewを使用してインストール後にバージョンを有効化する際に「vX.X.X is not installed」と出力され、それを解決した話をまとめる。

# 実施環境

- ハードウェア環境

| 項目 | 情報 | 備考 | 
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) ||
| ハードウェア | MacBook  Air (11-inch ,2012) ||
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 ||
| メモリ | 8 GB 1600 MHz DDR3 ||
| グラフィックス | Intel HD Graphics 4000 1536 MB ||

# エラー内容

- インストール後に下記コマンドを実行してバージョンの有効化を行った。(インストールは正常に完了、X.X.Xはバージョン名)

    ```terminal
    $ nodebrew install-binary stable
    $ nodebrew use vX.X.X
    >vX.X.X is not installed
    ```

# 解決方法

1. 下記コマンドを実行する。

    ```terminal
    $ nodebrew --version
    ```
1. コマンドの出力の下部にある「# install」に記載されているコマンド`$ nodebrew install vX.X.X`を実行する。

    ```terminal
    $ nodebrew install vX.X.X
    ```
1. 再度、バージョンを有効化するコマンドを実行する。

    ```terminal
    $ nodebrew use vX.X.X
    ```
1. 下記コマンドを実行して有効化したバージョンが正しい物になっている事を確認する。

    ```terminal
    $ nodebrew ls
    ・
    ・
    ・
    >current: vX.X.X
    ```
'Hoge' is assigned a value but never used  no-unused-varsのエラー

###エラー
'Hoge' is assigned a value but never used  no-unused-vars

###原因
Hogeを定義してるのに使ってない

###対処法
```
const Hoge = () => {
    return <p>Hello</p>;
};

return (
    <div>
     <Hoge/>   //ここを追加
    </div>
);

```