OmniAICreator/Qiita-1.07M huggingface dataset:
Goの複素数を触ってみた

自分でGo関連の情報を収集してたら、Goだと複素数が組み込みで入ってるらしいので、触ってみることにした。

# やること
シンプルに複素数の積と偏角の和の性質を確かめる。
その過程で使える便利関数を探してみる。


## 角度計算をしてみたコード

```go
package main

import (
	"fmt"
	"math"
)

func main() {
	const X complex128  = complex(1,1)
	ratio := real(X)/imag(X) // 実部と虚部を取り出して比を計算
    const radian := math.Atan(ratio) // 比からタンジェントの逆関数で偏角を計算
	fmt.Println(radian * 180 / math.Pi) // ラジアンから度数に変換 45度になる
}

```
複素数型である complex128 を宣言して、
real関数: 実部を取得
imag関数: 虚部を取得

と、組み込み関数で簡単に取り出せるのはすごく楽
ただ、探した感じラジアンを度数法に変換する組み込み関数は見つからなかったので、そこは自分で実装してみた。

## 複素数の積を計算してみたコード
```go
package main

import (
	"fmt"
	"math/cmplx"
	"math"
)

func main() {
	const X complex128  = complex(1,1)
	const Y complex128  = complex(2,2)
	const multi = X * Y // 乗算

	_, theta := cmplx.Polar(multi) //極座標の形で距離と偏角を返す
	fmt.Println(theta * 180 / math.Pi) // ラジアンから度数に変換 90度になる
}
```

二つの複素数の積は二つの複素数の偏角の和となるかをさくっと検証してみたコード。
今回の乗算結果の複素数は90度になるので、普通にタンジェントだと計算できない(０除算できない)が、

cmplx.Polarで極座標の形で返した場合はちゃんと90度が返ってきた

極座標変換を実装するのは面倒臭いので、組み込み関数で行えるのは本当にありがたい。

## 複素数の感想

https://golang.org/pkg/math/cmplx/

上記の複素数計算パッケージを見る限り、一通りの計算方法が実装されていて、複素数の性質とGoのドキュメントがよめれば結構有用だと思う。

そのほかにも、単純計算パッケージである、

https://golang.org/pkg/math/

にも三角関数やπなどの無理数が定数として入っていて非常に使いやすかった。

## さいごに
始めてGoを触ったのですが、オブジェクト指向に慣れ親しんだ人だと結構面を食らいます。
複素数型が入っているのに、計算を行う関数は複素数型に生えておらず全く別の関数として存在しているという点からも、Goの思想がにじみ出ていると感じました。

個人的には、複数の返り値の受け取り方や、組み込み関数の形的に静的型チェックを追加したpythonにC++を混ぜて、オブジェクト指向を削ったような印象です。

ただ、静的型チェックなども含めて非常にシンプル且つ安全なコードを書きやすいと感じました。
それではよきGoライフを
1日目_初心者向けデータ分析基本操作①

#①csvデータを読み込む
データ分析をするにはまずはデータを読み込ませる必要があります。
pandasというライブラリを用います。データ解析を支援する機能を提供するライブラリですが、ここでは、csvデータを読み込むにはpandasを使うのねくらいで大丈夫です。
公式ドキュメント：http://pandas.pydata.org/pandas-docs/stable/

コードはこちら

```ruby:qiita.py
#pandasをインポートしてpdという名前をつける
import　pandas as pd
#csvデータのある場所を指定し、dataという変数にcsvデータを格納する
data=pd.read_csv('ファイルの格納パス/ファイル名.csv')
#csvデータが読み込めたことを確認するために最初の5行を表示する。
data.head()
```

よくあるエラー
①ファイルが存在しない：ファイルの格納先をもう一度確認し、
今作業しているフォルダから見て今回読み込みたいcsvファイルが
どこにあるかを確認してください。

#②データの各種統計量を把握する
以下のコードで、読み込んだデータの全体感を把握することができます。
コードはこちら

```ruby:qiita.py
#欠損値の数をカラム別に算出
data.isnull().sum()
#各種統計量を確認する(count,mean,std,min,25%,50%,75%,max)
data.describe()
```

#③データの欠損値を処理する
データ分析では、データに欠損値があると上手く処理できないことがあります。そのため、欠損値処理を行います。
まず、以下のコードで、データ欠損値の有無をチェックできます。
コードはこちら

```ruby:qiita.py
#欠損値の有無をカラム別に算出
data.isnull().sum().any(axis=0)
```
続いて欠損値の処理方法についてです。
補完方法はいくつか種類がありますが、
ここでは代表的な手法について2つほどご紹介します。

-欠損値を単純に処理する

```ruby:qiita.py
#nullが含まれる行を削除する
data.dropna()
#nullに0をいれる
data.fillna(0)
```
-欠損値を平均値で補完する

```ruby:qiita.py
#平均値を入れる
data["欠損しているカラム名"]=data["欠損しているカラム名"]fillna(data["欠損しているカラム名"].mean())
```
Xcodeのframeworkの追加の仕方

#frameworkを追加するには、
![スクリーンショット 2020-03-28 11.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/06ae2cb5-2caa-da6c-e1ef-7f8718fce648.png)
プロジェクト名をクリックして、Generalから、frameworks, libraries and Embedded content の　+　ボタンをクリックして、出てくる、ダイアログを
![スクリーンショット 2020-03-28 11.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/eb7ace68-baa7-a0e0-60f1-2a2c5f9bdb22.png)
下り、必要に応じて、追加する。削除するには、青く反転させて、-　ボタン。

ちなみな、Audioを鳴らすのに、一番の近道は、
AVFoundation.framework
video再生には、
AVKit。
AVFoundationには、AVPlayer、AVKitには、AVPlayerViewControllerが関連付けらている。
Googleフォームの回答者にIDを自動返信する方法【GASでアカウント自動払い出し】

Googleフォームの回答者に、自動で特定の情報（例えば自社システムのアカウント情報など）を通知したいというケースはわりかしあるのではないでしょうか？今回はGAS（Google Apps Script）を用いて、予め用意したIDリストから未使用のものを選んで回答者に通知するという機能を説明したいと思います。

#Googleフォームの回答者にIDを自動返信する方法
まずは下準備としてGoogleフォームとID（←こちらは自動返信したい情報と読み替えてください。）を管理するリスト（スプレットシート）を準備します。

**【Googleフォームの準備】**
まずはフォームの設定として、以下をチェックします。メールの自動返信用にメールアドレスの入力を必須とし、情報の取得漏れが無いようにしておきます。

![google_form_id_auto_notification_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/9f1c587c-072e-13f1-2e6a-f182c1f9810a.jpeg)

メールアドレスの他に、名前を入力してもらう欄を付け加えて、今回のデモでは以下のシンプルな2設問のフォームを用意しました。

![google_form_id_auto_notification_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/b8b23abc-bf4d-fd99-7843-d9539e0c172b.jpeg)

**【スプレットシートでIDリストを作成】**
スプレットシートに、回答者に`払い出したいID情報を予め登録`しておきます。ID/PASSのように送付したい情報が複数になっても自動送信可能です。後述のスクリプトを書き換えるようにしてください。

また、Googleフォームの回答情報はこのIDリストに転記していくことで、こちらをユーザリストとして扱っていくことを想定しています。ですので、`Googleフォームの設問項目を順番に1行目に入力しておいてください`。今回の例でいうと`{メールアドレス、名前}`が該当します。

![google_form_id_auto_notification_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/3f1a5925-0a21-693c-d7a5-7aa9de2694b3.jpeg)

なお、後述のスクリプトでスプレッドシートのIDを参照しますが、IDは下に示すように`スプレットシートのURLの黄色下線部の部分`に該当します。お手元のスプレットシートをご確認くださいませ。（IDはダミー値にしています。）

<img width="691" alt="Screen Shot 2020-03-28 at 12.04.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/74babf6b-1f9f-2fca-d03b-5fb2132a122a.png">

#GASでアカウント払い出し機能の実装

Googleフォームの編集画面から、スクリプトエディターを起動し以下を入力してください。挙動はコメントを確認くださいませ。

```js:gas.js
function myFunction(e) {

    // Googleフォームのレスポンスから必要なデータを取得する
    var itemResponse = e.response.getItemResponses();
    var email = e.response.getRespondentEmail();
    var name = itemResponse[0].getResponse();

    var sheet = SpreadsheetApp.openById('1【スプレットシートのIDを指定】').getSheets()[0];
           
    // B列（Eメールアドレス）が空値になっている行を特定し、未使用IDをターゲットにする
    var user_list = sheet.getRange('B:B').getValues();
    var empty_row = user_list.filter(String).length + 1;
    var id = sheet.getRange(empty_row, 1).getValue();

  　// フォームで取得した値を入力する
    sheet.getRange(empty_row, 2).setValue(email);
    sheet.getRange(empty_row, 3).setValue(name);

    // IDを本文に加えて、メールを送る
    var title = '【ID通知メール】';
    var content = [
        name+'さま。',
        'ご登録ありがとうございます。',
        'IDは以下の通りです。',
        '【ID】' + id,
    ].join('\n');
    GmailApp.sendEmail(email, title, content);

}
```

**【トリガーの設定】**
あとはこのスクリプトがフォーム回答時に実行されるように設定をする必要があります。以下の手順で、トリガーを設定してくだい。

![google_form_id_auto_notification_07-1 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/afd1f014-6088-d59e-3700-2a9da66c4d68.jpeg)

**【実行結果（回答送信時の挙動）】**
未使用のIDの欄に、フォームの回答結果が反映されることが確認できます。

また、回答者の登録したメールアドレスに対して、ID情報が自動で通知されることも確認できました。

次の回答者にはid_02が通知されるようになっています。ID払い出し及びその通知を自動化することによって、稼働効率化だけでなくIDの通知漏れなども防ぐこともできるため、運用の中で今回紹介した内容が流用できるところがあればぜひトライしてみてください。

---
今回は、GASを用いてGoogleフォームの回答者にIDを自動返信する方法について説明しました。

GAS自体はプログラミング経験がなくても割と簡単に使うことができるようになるので、ご興味が在る方はぜひ学習の検討をしはじめてみてくださいね。
Xojo で CSV ファイルをエクスポート／インポート

# エクスポート

「Exporting to text in xojo」
https://stackoverflow.com/questions/49976204/exporting-to-text-in-xojo
を参考に


```

ListBox1.AddRow("1", "ThunderBlade", "SEGA")
ListBox1.AddRow("2", "GALAXY FORCE", "SEGA")
ListBox1.AddRow("3", "STARBLADE", "namco")
ListBox1.AddRow("4", "DARIUS", "TAITO")

Dim f As FolderItem
Dim outcsv As TextOutputStream
Var dir As New FolderItem("/mnt", FolderItem.PathModes.Native)
f = dir.Child("itemm.txt")
outcsv = f.CreateTextFile
Dim maxRow As Integer = Listbox1.ListCount - 1
For row As Integer =  0 To maxRow
  outcsv.WriteLine(""""+ListBox1.Cell(row, 0)+""","""+ListBox1.Cell(row, 1)+""","""+ListBox1.Cell(row, 2)+""","""+ListBox1.Cell(row, 3)+"""")
Next
outcsv.Close
```

これはデスクトップアプリ。Webアプリの場合は Listbox1.ListCount の代わりに Listbox1.RowCount を使う。

# インポート

## ListBoxにインポート
「TextInputStream.ReadLine」
https://docs.xojo.com/TextInputStream.ReadLine を参考

```

Var f As FolderItem
Var csvFile As TextInputStream
Var csvRow As String

f = FolderItem.ShowOpenFileDialog("")
If f <> Nil Then
  csvFile = TextInputStream.Open(f)
  csvFile.Encoding = Encodings.UTF8
  Do
    csvRow = csvFile.ReadLine
    Listbox1.AddRow( NthField(csvRow,",",1).ReplaceALL("""",""), NthField(csvRow,",",2).ReplaceALL("""",""), NthField(csvRow,",",3).ReplaceALL("""",""))
  Loop Until csvFile.EndOfFile
  csvFile.Close
End If
```

なお、 元にした
「TextInputStream.ReadLine」
https://docs.xojo.com/TextInputStream.ReadLine
では、タブ区切りファイルをインポート、更に動的にListBoxのカラム数を増やしている。

## 配列にインポート


ListBoxに読み込むのは遅い。上を RaspberryPi Model 3  で試してみたら7カラムx1000件の場合で10秒程度。
配列に読めば早い。


```

Var f As FolderItem
Var csvFile As TextInputStream
Var csvRow As String
Var regends(0, 10) As String
var counter as Integer = 0

f = FolderItem.ShowOpenFileDialog("")
If f <> Nil Then
  csvFile = TextInputStream.Open(f)
  csvFile.Encoding = Encodings.UTF8
  Do
    regends.ResizeTo(counter,10)
    csvRow = csvFile.ReadLine
    csvRow = csvFile.ReadLine
    regends(counter,1)=NthField(csvRow,",",1).ReplaceALL("""","")
    regends(counter,2)=NthField(csvRow,",",2).ReplaceALL("""","")
    regends(counter,3)=NthField(csvRow,",",3).ReplaceALL("""","")
    counter=counter+1
  Loop Until csvFile.EndOfFile
  csvFile.Close
End If
```
古いPCに CloudReady を導入したら画面の明るさが調節できない。

## 概容
* Windows7 のサポートが切れたので古いPCを ChromeBook 化しようとしたが、少し問題が発生したので備忘録

## 導入環境
* dynabook SS RX1 RX1/T8A 2007年モデル

## 準備
* 正確には Chrome OS の オープンソース版の CloudReadyをダウンロードしてインストールする。　
* [ここ](https://www.neverware.com/freedownload)からHome EditionをダウンロードしてライブUSBを作成する。
* ここまでは特に問題なく、画面の表示の通り行えば難なくできた。

## 導入
1. PCを起動してBIOSを起動(esc を押しながら電源をON, すぐにF1) 
1. Boot の優先順位を USB → HDD に切り替え、設定を保存して再起動
1. CloudReady が起動するので画面に従って初期設定
1. USBからHDDにインストール
1. 正常に完了すると自動で電源が切れる。
1. ここまでも大きな問題はなかった。
ただし、PCが古いからかほっとくと勝手にスリープし、USBの接続が切れてフリーズすることがあったので注意 

## 導入後
1. PCを起動してBIOSを起動(esc を押しながら電源をON, すぐにF1) 
1. Boot の優先順位を HDD → USB に切り替え、設定を保存して再起動
1. USBから起動した時と同様に、CloudReady が起動するので画面に従って再度初期設定
1. 導入完了特に問題なくできたと思った。

# 問題発生！画面の明るさが調整できない(本題)
* インストール直後は問題なかったが、二回目移行起動すると画面が暗い・・・
画面のバックライトの調整が調整できず、明るさ調整のバーを動かしても全く変わらない。
これでは作業ができない。

* 起動直後の CloudReady のロゴ画面は明るいが、ログイン画面が表示する前にバックライトが消える。
まあ、10年以上前のPCが正常に動く保証なんかないか・・・

## 対処方法(応急処置1)
* [ここ](https://neverware.zendesk.com/hc/en-us/community/posts/209777148-Adjusting-screen-brightness-is-not-working)で挙がっていたが明るさ調整がうまく機能しないことがあるらしいので以下を実行
* ターミナルから手動で明るさを変更する。

1. Chrome を起動して ctl+alt+t
1. ターミナルが起動するので `crosh> shell` と入力
1. bash が起動するので `$ sudo tee /sys/class/backlight/toshiba/brightness <<< 8` を入力
     * "toshiba" の部分は機種によって変わるみたいだ。
     * 8 の数字も機種によって変わるようだ。
     * `$ cat /sys/class/backlight/toshiba/max_brightness` で適切な数値を確認できる。

## 対処方法(応急処置2)
※ 追記

* D-Sub ケーブルで外部ディスプレイに接続した状態で起動する。こちらは特に設定なしで画面の明るさが維持できる。

## まとめ
* 成功すると画面の明るさが変更できた。これで作業ができる。ただし、PCを再起動するとまた戻ってしまうようだ。
まあ、そこは仕方ないか。
ESP-IDF(ESP32)でwebsocketを使う

# はじめに

　ESP32のようなマイコンを使ってシンセサイザーを作りたいのですが、シンセサイザーにはツマミやスイッチがたくさんあります。ですが、プロトタイピングの段階でツマミやスイッチの回路を組むのは、ちょっと時間・リソースがもったいないように思います。そこで、websocketを使ってPC上にツマミやスイッチを実装できないか、と考えました。調べたところ、ESP-IDFですごく簡単に使えるライブラリ[Molorius/esp32-websocket](https://github.com/Molorius/esp32-websocket)（GPLv3）を見つけましたので、今回はその紹介をします。


# 準備するもの

- PC(筆者はMac)
- ESP32開発ボード(NodeMCU, ESP-WROOM-32等)


# 環境構築

## ESP-IDFのセットアップ

今回はv3.3.1を使います。[ESP-IDF Programming Guide v3.3.1](https://docs.espressif.com/projects/esp-idf/en/v3.3.1/get-started/index.html)の通りに進めます。


## Githubからプログラムを入手
[サンプル](https://github.com/Molorius/ESP32-Examples)と[ライブラリ](https://github.com/Molorius/esp32-websocket)を使います。

```bash
# ESP-IDFが標準的なパス（~/esp）に導入されているものとします。

cd ~/esp
git clone https://github.com/Molorius/ESP32-Examples
cd ESP32-Examples/websocket_server
git clone https://github.com/Molorius/esp32-websocket components/websocket
```

[esp32-websocket](https://github.com/Molorius/esp32-websocket)が[ESP32-Examples](https://github.com/Molorius/ESP32-Examples)のsubmoduleになっているのですが、gitコマンドで最新のものを引っ張ってくる方法がわからなかったので、2回`git clone`しています。gitに疎く、すみません。**どなたか情報いただけると嬉しいです。**



# 動かす
ESP-IDF(v3)ではおなじみですが、以下の流れになります。

1. `make menuconfig`でserial portを設定する
2. ESP32ボードを接続し、`make flash`で書き込む
3. `make monitor`でコンソール出力（デバッグメッセージ等）を見る


```bash
cd ~/esp
cd ESP32-Examples/websocket_server

make menuconfig
make flash
make monitor
```

`make menuconfig`では、`Serial flasher config`->`Default serial port`と選び、ポート名を入力します。ポート名の調べ方は、macの場合、`ls /dev/tty.*`で調べられます。私の環境では`/dev/tty.SLAB_USBtoUART`になっています。

また、トップメニューの`Example Options`からWIFIのSSIDとパスワードを変更することもできます。デフォルトはSSIDが`ESP32 test`でパスワードが`hello world`です。

書き込みが完了すると、ESP32がWIFIアクセスポイントになります。`make monitor`を実行して、PCやスマホでWIFI接続すると、ターミナルに以下のようなログが流れます。

```bash
I (1340) wifi_setup: WiFi set up
I (1350) event_handler: Access Point Started
I (1350) led_setup: led is off and ready, 10 bits
I (1360) server_task: server listening
I (1360) server_handle_task: task starting
I (1360) count_task: starting task
I (24050) wifi: new:<1,0>, old:<1,0>, ap:<1,1>, sta:<255,255>, prof:1
I (24050) wifi: station: xx:xx:xx:xx:xx:xx join, AID=1, bgn, 20
I (24080) event_handler: STA Connected, MAC=a4:5e:60:bd:e3:81 AID=1
I (25360) tcpip_adapter: softAP assign IP to station,IP is: 192.168.4.2
I (25360) event_handler: Unregistered event=18
I (28130) tcpip_adapter: softAP assign IP to station,IP is: 192.168.4.2
I (28130) event_handler: Unregistered event=18
```

その後、ブラウザで`http://192.168.4.1/`へアクセスすると、スライダーとテキスト入力エリアのあるWebページが開きます。スライダーを動かしたりテキスト入力・送信をすると、コンソールに値が表示されます。

![run_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603551/9aa4a829-0c2d-d57d-69d6-17442e184412.gif)


なお、monitorを終了する際は`Ctrl + ]`を押すと終了できます。


# おわりに
　ESP-IDFでwebsocketを使う例としてはESP-IDFv4に公式サンプルがあるのですが、今回のサンプルのほうがよっぽど簡単で実用的だと思います。websocketについて調べると、javascriptやpython等でサーバーとクライアントを準備して素のsocket通信と同様の実装をしている例が多く見つかりますが、このライブラリを使う場合は、サーバーはESP32側のプログラム、クライアントはESP32に埋め込むHTML（つまりjs）になり、あまり多くを考えずに済む…ような気がします（やっていることは同じなので、これは気のせいです）。

　今回はサンプルを動かしただけですが、プロトタイピングに使いやすいものができたら、また改めて投稿したいと思います。
『Validate App』時に「Code signing "Alamofire.framework" failed.」エラー

#原因
Frameworkライブラリに署名できない不要なアーキテクチャが含まれているため。

#解決策
##### アーカイブ時に不要なアーキテクチャを削除するスクリプトを追加

1. プロジェクト -> ターゲット -> Build Phrases -> New Runs Script Phrase

2. 以下のスクリプトを追加

```sh
# skip if we run in debug
if [ "$CONFIGURATION" == "Debug" ]; then
    echo "Skip frameworks cleaning in debug version"
    exit 0
fi

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done
```

参考URL
https://github.com/fastlane/fastlane/issues/13401
wikipediaから表を抽出する

```python:easy_read_html.py
import pandas as pd
url = 'http://www.example.com'
df = pd.read_html(url)
```
が上手くいかなったので。
#初めは上手く行っていた
```python:first.py
import pandas as pd
url = 'https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy'
df=pd.read_html(url)
```
これで表が抽出できたので、`pandas`すげーと思って、明日やろうとパソコンを閉じました
#次の日
```
ValueError: invalid literal for int() with base 10: '2;'
```
となり、エラーしかでない。ここでanacondaの再インストールやっても状況が変わらないので、OSの再インストールを実施。
結果は変わらない:cry:
#requestsとbeautiful soup
```python:requests_bs.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
data=soup.find_all('table', {"wikitable mw-collapsible"})
```
最終的には`pandas`にお世話になるとして、WEBから情報を得ないと仕方がないので、[requests](https://note.nkmk.me/python-requests-usage/)と[Beautiful Soup](https://qiita.com/itkr/items/513318a9b5b92bd56185)でスクレイピング
#データフレームにならない
##df = pd.read_html(data)
これで行けるかと思ったら、`TypeError: cannot parse from 'ResultSet'`

`data` で確認してみると

```
[<table class="wikitable mw-collapsible" style="float:left; text-align:right; font-size:83%;">
 <caption style="font-size:116%"><span class="nowrap">Daily COVID-19 cases in Italy by region ...
```
とリストっぽい
##pd.read_html(data[0])
`data[0]`をみると表のHtmlなので上記コマンドをやってみると`TypeError: 'NoneType' object is not callable`
なぜ、こうなるのかわからない:cry:
##ググる
`'nonetype' object is not callable pandas read_html`でググると[stackoverflow](https://stackoverflow.com/)の結果がでるので、やってみたが、全滅した。リストなのがだめなのか
##read_html　リスト　抽出
上のキーワードで検索してみてようやく、上手く行く方法をみつけた
https://teratail.com/questions/188717

###type(data)
_bs4.element.ResultSet_なのでそのまま`read_html`の引数にならなかった(らしい)

##できた
```python:wiki_get.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
data=soup.find_all('table', {"wikitable mw-collapsible"})
df = pd.read_html(str(data), keep_default_na=False)[0]
df=df.iloc[:,0:28]
df.columns=['Date','VDA','LIG','PIE','LOM','VEN','TN','BZ','FVG','EMR','MAR','TOS','UMB','LAZ','ABR','MOL','CAM','BAS','PUG','CAL','SIC','SAR','ConfirmedNew','ConfirmedTotal','DeathsNew','DeathsTotal','ActiveICU','ActiveTotal']
daf=df[df['Date'].str.contains('^2020')]
daf.to_csv('Splunk_COVID19_Italy.csv', index=False)
```
https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy
にある地域別の表を抽出してCSVまで持って行っている。
###df = pd.read_html(str(data), keep_default_na=False)[0]
`str`を使用すると_str型_に変換してもらえるので、`read_html`の引数に使える。
戻りがリストなので、最初の結果を抽出すればいい。
###df=df.iloc[:,0:28]
列を最初から２８行目としている
###daf=df[df['Date'].str.contains('^2020')]
必要な列は_Date_列が_2020_から始まるもの
_DataFrame型_は全体では`str.contains`が使えないので、列名を指定している。
###daf.to_csv('Splunk_COVID19_Italy.csv', index=False)
CSV出力するときindex番号は不要なので削除

#見つけてしまった・・・
https://python-forum.io/Thread-table-from-wikipedia
いつも作った後に・・・:cry:

###もっといい奴
https://qiita.com/Retsuki/items/88eded5e61af200305fb
仕事格好いい:smile:
#まとめ
Splunkの[WebSite Input](https://splunkbase.splunk.com/app/1818/)が上手くいかず、ググると`pandas`の記事
これは簡単/神とやってみたら、いきなりエラーの山でよくわからない
結果的にできましたが、pythonの道は長いです
自己紹介

#自己紹介
・23歳IT企業勤務
・SFC卒業

#現在のレベル

・大学の学部で4年間HTML,CSS,JavaScript,R,Pythonをかじる。
・応用情報技術者試験に2019年の秋に受け、午前試験は合格点に達したものの、不合格

#目標
2021年9月までに
AtCoder黄色、Kaggleのコンペで銅メダル獲得をする！

#目標に到達するためにすること
・週に1回以上Qiitaにアウトプットする
・AtCoder ABCに90%以上出席する
・データ分析、機械学習、プログラミングの本の中で、
　取り組むと決めたものをやり遂げる

#参考)Twitterアカウント
coffee_cup3
Lチカ＆L爆発をWeb上でやってみた（Tinkercad&Arduino）

## はじめに
Arduinoを使って電子回路の勉強を始める方も多いと思います。LEDを点灯させるだけではなく、危険な行為もセットで学べるとより理解が深まると思います。
私は高校生のとき電子回路の授業で9vをLEDに直つなぎして爆発させたことがあります。流石に家でそれを行うのは危険なので今回はweb上でシミュレーションしてみましょう。

## Web上でシミュレーションする方法
[Circuits on Tinkercad]("https://www.tinkercad.com/dashboard?type=circuits&collection=designs") というサービスを使います。
一応、登録する必要がありますが無料です。fritzingも有名ですが、有料化してしまったそうなので使いません・・・

## LEDをチカチカさせる
1.ブレットボードとArduino unoを用意します 
![B074B03A-A4CC-48B4-A8D0-7FA078A5A908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/3b10053d-4cd4-dd9b-b613-a7e7bf7ef46f.png)

2.LEDと抵抗を画像のように配線します
![F9CBC2A2-5DB2-47C5-B1DA-3D6395F8ADF7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/2266acd8-9543-e041-8f7b-7bbf8937cbfb.png)

3.コードを書きます
右上のメニューに「コード」があるのでそちらで記入

```javascript
void setup()
{
  pinMode(2, OUTPUT);
}

void loop()
{
  digitalWrite(2, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(2, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}
```

4.実行
実行するとLEDが点滅します
![48496550-9047-4A20-8D7E-9DCE1D411F3E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/edac715a-5629-1264-6398-d2baff5ca29a.png)


##(おまけ)LED爆発をやってみた
下記のように繋ぐとショートします。私もやったことあります。このようなことがweb上で体験できるとは素晴らしい世界です。
なぜ、LEDが爆発するのかも理解していくと良いですね。そこは私も含めて宿題にしましょう。
![8D296ED3-6496-4184-B248-89F38D57C819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/89b802c1-c7bf-d789-cd53-860ce01810f6.png)
AWS RDSに作成したMySQLに対して外部から接続可能にする

# 概要

今回は初心者向けにAWSのRDSに作成したMySQLのDBに対して外部から接続する方法まで説明します。
外部から接続するにあたり、A5Mk2を使用します。

では、さっそく捌いていくっ！

# データベースの作成

後にも先にもまずは、データベースを作成しましょう。
画像を例に進めてみましょう。

![01_データベースの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222607/0ca4eab7-c361-6168-96c8-16f60a1ff23a.png)

まずは、｢データベースの作成方法を選択」から「標準作成」を選択します。
｢エンジンのオプション」として、今回はMySQLを使用します。
｢バージョン｣は任意で構いません。特に理由がない場合は、最新バージョンを選びましょう。

# テンプレート選択と接続情報設定

「テンプレート」は用途によって選択してください。
筆者は「テンプレート」を「本番稼働用」を選択しました。
※ 欲張ったスペックにすると課金料金が大変な事になるので、しっかり料金を下調べすることを強く推奨します。

｢DBインスタンス識別子｣は何でもいいので、自身がわかる名前を適当につけてください。

｢マスターユーザー名」は、DB接続時に利用するよくある「root｣や｢administrator｣的なやつです。
ありきたりな名前は、個人的にセキュリティよろしくないと思うので、マニアックな名前にしておきましょう。

｢マスターパスワード｣は、｢マスターユーザー｣のパスワードです。
忘れないでね！

ここで設定してた「マスターユーザー名」と｢マスターパスワード｣を後に外からDBに接続するときに利用します。

![02_テンプレート選択と接続情報の設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222607/541f1e7f-c327-a314-059e-5fbe06491670.png)

# 接続関連の設定

AWSのVPCでEC2などに接続するならいいけど、外部のEC２や、自分のPCなどからDBに接続したい場合、よく初心者が設定を忘れる箇所があります。
それは、「パブリックアクセス可能」を「あり」にすること。
大抵、「つながらないな、ポートも開けているのにな」って言うときの原因はここです。

あとは、｢VPCセキュリティグループ｣を画像を参考に設定します。
「VPCセキュリティグループ名」は、適当に付けてください。

はい。
ここでまた重要なところがあります。
それは、「データベースポート」です。
デフォルトのままでも利用は可能ですが、セキュリティを意識するなら最低限ポート番号は変えておきましょう。
ここのポート番号は、後にセキュリティグループで使用します。
セキュリティグループはEC2の時のように自身のグローバルIPアドレスや、EC2のStaticIPアドレスのようなグローバルアクセスだけピンポイントで許可しましょう。

![03_接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222607/608cafd1-b6ad-b916-0910-b9e22a17a3ed.png)

間違っても｢0.0.0.0｣に許可しないように。
「0.0.0.0」のままにすると、全世界からアクセス可能になります。

ホント、セキュリティはシビアになりましょう。
「動けばいいや」は後で命取りになります。
後でGRANTなどでさらにセキュリティを強固にしましょう。
何重にもセキュリティ対策を。

固有名詞は出しませんが、セキュリティ意識を疎かにすると理由は様々ですが
大手コンビニ「6の次のペイ」の事件や、炊飯器やポットで有名な｢エレファントマークのショッピングサイトの個人情報流出」事件になりかねません。

余談ですが、筆者は「エレファントマーク個人情報流出事件」の被害者です。
たまに詐欺まがいなメールや、不審なDM郵便が来て困ったもんです。
僕、炊飯器のフタ買っただけなのに、個人情報悪用されるなんて。。。。

『僕は嫌だ！』

はい、話はズレましたが次！


# データベース認証と追加設定

｢データベース認証｣は、簡単に「パスワード認証」としています。
本当は、IAMを利用した方がいいと思いますが手順が長くなるので割愛。

そして「最初のデータベース名」を任意のデータベース名にしましょう。
これは、「CREATE DATABASE XXXXXX」のXXXXXXの部分にあたります。

先ほどのマスターユーザ、パスワード、ここでのデータベース名で後に外から接続します。

![04_データベース名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222607/90af5f67-83fa-6274-470d-89e1c17ecfbd.png)

他はデフォルトのままです。
セキュリティグループは、各々の環境に合わせて設定しておいてください。

以上、これでDBのインスタンスを作成して起動されるまでしばし待ちましょう。。。

テンテケテケテン♪

# 外部ツールからDBに接続してみる

作成したデータベースの起動がAWS RDS上で確認できた場合、接続先の情報(ホスト名)をコピーしましょう。
東京リージョンの場合は、下記の画像のように｢ap-northest-1.rds.amazonaws.com｣で終わっている長ったらしい文字列の部分です。

そして、さっき設定しておいた「マスターユーザー名」「パスワード」「データベース名」「ポート番号」をツールに入力します。
フレームワークをお使いの方は、設定ファイル的なものに記述しましょう。
スクラッチで開発されているかたは、ソースにぶち込んでください。

あとは「テスト接続」を押下して「接続に成功しました」って出れば完了です。

![0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222607/89badf59-a357-8c53-600a-4b9468ea1f90.png)

この後は、各々CREATE TABLE を実行したり、マイグレーションを実行したり、イジイジしてみてください。

# おまけ

クラウドは便利でどこからでも使えていいのですが、ガチでセキュリティは意識しないと大変なことになります。
最低限今回のサービスに限らず、接続元のIPは絞っておきましょう。

と、言っても個人だと固定グローバルIP持っている人は少ないでしょう。

個人でも固定IPアドレスが持てる方法を一部お知らせします。
固定IP持ってても、ルーターの設定などしっかりやらないと大変な事になります。

## プロバイダ：アサヒネットを利用
オプションで800円～1000円くらい払えば、個人でも固定グローバルIPが付与されます。

## YAMADA SIM
これはモバイルルーターの話ですが、オプションで月80円から100円くらいで固定のグローバルIPが付与されます。

以上！
lambdaの活用(関数を別の関数の引数として渡すとき)

個数の異なる引数を持つ関数をそれぞれ同一関数の引数として渡す場合、lambdaを用いて利用できます。

以下のソースがあるとします。

```python

# 引数なし関数
def print_type1():
    print('print_type1を処理中・・・')
    return '[print_type1]'

def print_com(func):
    print('=== print_comを処理中・・・ ===')
    rtn = func()  # 利用する際、渡す関数には引数なし
    print('{}を処理しました。'.format(rtn))
    print()

print_com(print_type1)  # 問題なく動作します
```
後から引数のある関数をprint_comに代入したいときがあると思います。
例：

```python
# 引数あり関数
def print_type2(day):
    print('print_type2を処理中・・・')
    print('day: {}'.format(str(day)))
    return "print_type2"
```
以下の代入方法では失敗します。

```python
print_com(print_type2)  # →[missing 1 required positional argument: 'day']というエラーがでます"
```

```python
print_com(print_type2(15))  # →['str' object is not callable]というエラーがでます
```
そこで、lambdaで引数なし関数に変更してから、渡せば動作します。

```python
day = 15
print_com(lambda: print_type2(day))
```
または、functoolsのpartialを利用すればいいです。

```python
from functools import partial
day = 15
print_com(partial(print_type2, day=day))
```
自力で解決する場合は、関数の中に関数を定義することで実現できます。

```python
# 内部関数
def print_type3(day):
    def print_type3_inner():
        print('print_type3を処理中・・・')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner

day = 15
print_com(print_type3(day))
```
***
```python:lambda01.py
from functools import partial

# 引数なし関数
def print_type1():
    print('print_type1を処理中・・・')
    return '[print_type1]'


def print_com(func):
    print('=== print_comを処理中・・・ ===')
    rtn = func()  # 利用する際、渡す関数には引数なし
    print('{}を処理しました。'.format(rtn))
    print()


# 引数あり関数
def print_type2(day):
    print('print_type2を処理中・・・')
    print('day: {}'.format(str(day)))
    return "print_type2"


# 内部関数
def print_type3(day):
    def print_type3_inner():
        print('print_type3を処理中・・・')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner


print_com(print_type1)  # 問題なく動作します

# ↓このような代入方法では失敗します
# print_com(print_type2)  # →[missing 1 required positional argument: 'day']というエラーがでます

# print_com(print_type2(15))  # →['str' object is not callable]というエラーがでます

# lambdaで引数なし関数に変更してから、渡せば動作します。
day = 15
print_com(lambda: print_type2(day))

# または
day += 1
print_com(partial(print_type2, day=day))

day += 1
print_com(print_type3(day))
```
実行結果
=== print_comを処理中・・・ ===
print_type1を処理中・・・
[print_type1]を処理しました。

=== print_comを処理中・・・ ===
print_type2を処理中・・・
day: 15
print_type2を処理しました。

=== print_comを処理中・・・ ===
print_type2を処理中・・・
day: 16
print_type2を処理しました。

=== print_comを処理中・・・ ===
print_type3を処理中・・・
day: 17
print_type3を処理しました。
コンバージョン管理のできる申し込みフォームを無料で作成する方法【Formrunが便利説】

コンバージョン管理のできる申込みフォームを作るにはFormrunは便利だなと感じたので背景とその理由をまとめていきます。

#コンバージョン管理のできる申し込みフォームを無料で作成する方法
**【背景】**
プロボノとしてお手伝いしている法人にて、Web広告を使ったセミナー集客をしていまして、申し込みフォームを設置することにしました。

当該法人の自社HP（Movable Typeにて構築）はセキュリティの観点からも、構築元ベンダから限定的な権限しか与えられず、

>- プラグインなどの外部機能を追加できない
- 自社HPの環境の自由度が高くはなく、記事の投稿くらいしかできない（但し、コンバージョンタグは埋め込める）
- 顧客情報は自社HP上で管理をしたくない
- フォーム管理にお金は使いたくない

という状況下で、コンバージョン管理を行えるフォーム設置方法を検討していました。

**【フォーム管理を模索した所感】**
アンケートフォームといえば（主管しか含まないけど）Googleフォームなんですが、申込完了後に意図するサンクスページに飛ばすことができずコンバージョン管理ができないんですよね…

その他、フォーム作成を行うサービスを色々調べてみましたが、

`フォーム入力後に意図するサンクスページに飛ばせて（=コンバージョン管理できて）、無料で使えるサービスが少ない…`という印象でした。

そんな中、今回の要件を満たせる解決方法として[`Formrun`](https://form.run/ja)を発掘することができました！！

#Formrunがおすすめな理由
おすすめな理由は結構あるのですが、抜粋すると以下となります。

>
- フォームのテンプレも豊富でデザインがモダン且つ、レスポンシブデザイン対応
- HTMLページへの埋め込み（iframe）が可能
- フォーム登録完了後のサンクスページへのリンクを指定可能
- 無料枠でも割と使いやすい

**【アンケート画面イメージ】**

テンプレートを使っているだけですが、入力項目なども自由に修正できます。

![form_page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/1cec8e0a-3f8f-34b4-47da-de7442903aba.jpeg)


**【フォームの埋め込み管理】**
フォームの管理ページから、埋め込みコードを取得できます。埋め込みにはiframeを活用しているので、もしWordPressのページに埋め込みを行う場合には別途設定が必要となります。（[こちらのページ](http://lifeworker9.moo.jp/archives/862)をご参照ください。）

下記の通り、フォームを埋め込むURLと、申し込み完了後に遷移させたいサンクスページのURLを指定すれば完了です。

![formrun_setting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/d8e82d86-720e-b0f1-1ea9-3881ea8e6344.jpeg)

**【無料枠でできること】**
当然ながら機能は限られていますが、これらが無料であるのはとてもありがたいと思います。[furmrun公式ページ](https://form.run/ja/pricing)をご確認ください。

以上となります。無料なのでまず使い勝手を確認していただければと思います。大変便利です！！

---
とうことで、Formrunを活用したコンバージョン管理のできる申し込みフォームを無料で作成する方法についての説明でした。

今回のケースに似たようなケースで詰まっている方はぜひ参考にして頂けると幸いです。
IEEE829から学ぶテストドキュメント～①テスト計画編～

#1．概要
テストを実施する上でドキュメントを作成する人は多いと思います。今回その中でもテストの基本となる「テスト計画書」について、以下を中心に説明したいと思います。

- テスト計画書をなぜ作成するのか？
- どうやってテスト計画書を作成すればいいのか？

また、本内容を説明する上でIEEE829をもとに説明したいと思います。
※**IEEE829はテストのドキュメントについてまとめた国際規格**です。テスト系のドキュメントを作成する場合、よく参考にします。

#2．IEEE829のテスト計画書とは？

IEEE829のテスト計画書には、以下2つのドキュメントがあります。
・マスターテスト計画（全体テスト計画書とも呼ばれ、プロジェクトの最初に作成するもの）
・レベルテスト計画（単体テスト計画書、結合テスト計画書等の段階ごとの計画書のこと）

企業によっては、マスターテスト計画書しか作らなかったり、そもそも計画書を作らないこともあるようです。
今回はマスターテスト計画書を基準として説明いたします（マスターテスト計画書もレベルテスト計画書も、案件全体を対象としているのか一部を対象としているかの違いがあるだけで、本質は2つとも同じです。）



#３．なぜテスト計画を作るのか？

ここが私個人の考えになるのですが、テスト計画書は**テスト中にもめごとが起きないように事前に合意しておくこと**をまとめたドキュメントと考えています。
つまり、**過去のもめごとに対する対策**がすべてテスト計画書に入っていれば、それがその案件の正しいテスト計画書となります。

例えば、以下のような問題があったとします。

### ①報告漏れ

Aさん「A機能で不具合が多く出ていることをなぜ報告しないのか！？」
Bさん「え、そういった報告が必要と聞いたことがないのですが…」

### ②急なテスト範囲の増加

Cさん「ごめん！C機能に重大な欠陥が見つかったから、追加でテストを行って！」
Dさん「え！？もう工数残っていませんよ！！！」

### ③テスト結果の判断ミス

Eさん「ここ、期待値と違う結果になっているけど、テストではOKとなっている…」
Fさん「あ、特に仕様上問題ないと思いましたので、OKとしました！」

上記のような問題を起こさないために、事前にもめそうな項目をテスト計画書に記載し、合意しておきます。

- ①報告漏れ　⇒**報告内容を事前に合意する！**
- ②急なテスト範囲の増加　⇒**緊急時の対応を事前に合意する！**
- ③テスト結果の判断ミス　⇒**テストの判断方法を事前に合意する！**



#４．IEEE829-テスト計画書の各項目について

3章をもとにIEEE-829の各項目の意味を簡単にまとめると、以下のようになります。現場の問題と比較しながら各項目が必要不要か判断すれば、自社向けのテスト計画書を作成することができます。
（以下の項目にないものでも、現場の問題から新規に項目を追加してもいいです。）

|起きている問題|対策|IEEE829での項目名      |
|:-----------------|:------------------|:------------------|
|みんなが勝手に資料を更新するので、最新版がわからなくなった！|識別番号を決め、更新のルールを決める|識別番号|
|どの資料を基に計画書が立てられたのかわからない！|計画書のもとになった資料はすべて記載する|参考文献|
|何のためにテストを行うのかわからない！|テストの目的をきちんと共有する|はじめに|
|テスト対象がコードしかない！|テスト対象がわかる資料をまとめる|テストアイテム|
|すべてテストすると時間がかかりすぎる！|テストが必要な部分を決める|テスト対象|
|連携する他社のシステムはテストできない！|テストができないな部分を決める|テスト非対象|
|性能試験を忘れていたので、リリース後に障害となった！|どうテストするのか事前に決めておく|テストアプローチ|
|期待値と違っているのにテストケースでOKとなっている！|OKとする条件を決めておく|テスト合否判定基準|
|機能の開発が遅れ、全くテストできない！|テストを中止する条件を決めておく|テスト中止再開基準|
|納品されると思ったものが納品されない！|納品する成果物を事前に決めておく|テスト成果物|
|予定していた作業をテストチームが実施してくれない！|実施するタスクを決めておく|テスト作業タスクと担当|
|テストに必要な環境がテスト開始時に準備されていない！|いつまでにどんな環境が必要か決めておく|テスト環境|
|別会社の問題を自社に押し付けられた！|誰がどこまで責任を負うのか決めておく|責任範囲|
|必要な人材がテスト開始までにそろわない！|どんな人材が欲しいのか、どう育てるのか決めておく|人員計画・トレーニング|
|予定の期日にテスト結果が報告されない！|いつまでに何を報告するのか決めておく|スケジュール|
|無茶なスケジュールなのに進めようとしている！|起きそうなリスクと、リスクが起きた場合どうするのか決めておく|リスクとその対策|
|テスト計画書に記載したことが守られていない！|きちんと合意したことを記録しておく|承認|

#５．まとめ

テスト計画書はもめごとが起きないように、事前に取り決めをまとめたドキュメントです。裏を返せば、テスト中にもめごとが起きなければ、テスト計画書を作成する必要はありません。

そのため、リリース後でも案外どうにかなるWeb系の案件ではテスト計画書は薄く、逆に基幹系のシステムのような大規模なものは、テスト計画書が厚くなる傾向があります。
（Web系は問題が起きても、「すぐに直してリリースします！」、で何とかなるので。）
Pandasでindexのタイトルのつけ方

```
import pandas as pd
data = {'Column 1'     : [1., 2., 3., 4.]}
df = pd.DataFrame(data)
df.index.name = 'foo'

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/c54f7f76-ecfc-45aa-5d85-524c579d75a6.png)


https://stackoverflow.com/questions/18022845/pandas-index-column-title-or-name
Qiitaの記事をGitHubに移行する

# はじめに
一つのサービスに依存するのは、リスクだと思うのでQiitaの記事をGitHubに移行するスクリプトを書いてみます。

なお、私の記事は以下のようになりました。
https://github.com/mima3/note

(2020/3/29　追記)
WordPressへの移行は以下を参照してください。
https://qiita.com/mima_ita/items/f4beb31c0ba65e6ab409

# 動作環境
Python 3.7.4
Windows10

# 事前準備
Qiitaのアクセストークンを取得します。

(1)設定画面のアプリケーションタブから「新しいトークンを発行する」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/1027591c-3943-b695-c493-615457408997.png)

(2)読み取り権限を付けて「発行」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/cc957b75-91f7-9f5e-7fd8-2be56c38061f.png)

(3)アクセストークンをメモしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/d28c2a4f-19a6-6255-7e30-3d1bbfaf2d42.png)

# 使用方法
(1)以下のリポジトリからスクリプトを取得する
https://github.com/mima3/qiita_exporter

(2)下記の形式でスクリプトを実行する。

```
python qiita_to_github.py [userid] [accesstoken] [保存先フォルダ] [GitHubのブロブのルートURL ex.https://github.com/mima3/note/blob/master]
```

(3)保存先フォルダをGitHubに登録します。

# やっていること
・QiitaAPIを利用してQiita上の指定ユーザが記載した全てのマークダウンを取得します。
・画像をローカルにダウロードして、リンクを書き換えます。
・コードブロック以外の行にて、改行コードの前にスペース2ついれて改行を行います。
・「#タイトル」という記述があったら「# タイトル」に直します。
・コードブロックのタイトル（例：「```python:test.py」）が表示されないので対応します。
・自分の記事へのURLを移行先のURLに修正する


# 課題
・タグとかの表現をどうするか。
・コメントとかの取り扱いをどうするか。
・タイトルをファイル名としているが、使っている文字によっては動かない。タイトルによっては大文字に変換とかの小細工が必要になると思う。
・もしかするとWikiの機能を利用した方がいいかも。。。
・Qiitaで表示できてたTwitterの埋め込みは旨く表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/c95dfc36-1f1c-84d4-b0c6-bb718d0df4f0.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/6c0fae2e-d79e-3e84-6260-6cdab2ac6a0b.png)
・[GitHub Pages](https://help.github.com/en/github/working-with-github-pages)でJekyllが上手く動作しないマークダウンがある。たとえば{%s}とかいうコードが混ざっていると失敗する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/ae6eeab9-db67-c001-4dd9-064fde7f3fe3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/c7a2502c-e9fd-eb2c-6ae4-5b04b5dd4eae.png)
フォーム上にあるコントロールを、右クリックでコンテキストメニューを表示して、フォーム上から動的に削除する（その１）


　フォーム上に配置したコントロール（ここではピクチャーボックス）を動的に削除する方法のソースコードを紹介する。


　　　　　![動作イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/a64ee07a-4c0f-9e22-200d-26a35ec5127f.png)　　　　　　![動作イメージ削除後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/4dcb93d9-42e3-aad6-557c-62c5be9437d6.png)
　　　　　　　　　　　　　削除前　　　　　　　　　　　　　　　　　　　　　削除後
　　　　　（右クリックでコンテキストメニューを　　　　　（コントロールがフォームから消えたところ）
　　　　　　　　　　　　　　　表示させたところ)

　削除する際に、対象となるコントロールの上にマウスポインタを置き、右クリックでコンテキストメニューを表示させ、削除の項目を選択して削除する。

　本動作に必要な主なクラス・メソッドなどは次の通り。
　　ContextMenuStrip クラス
　　ToolStripMenuItem クラス
　　ToolStripMenuItem.Click デリゲート
　　EventHandler() イベントハンドラ
　　Control.ContextMenuStrip プロパティ
　　Control.Remove() メソッド
　　


```:C#
// 参考資料　http://kaitei.net/csforms/menu-strips/#item-67

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TestContextMenu
{
    class Form1 : Form
    {
        PictureBox pictureBox1;

        static void Main()
        {
            Application.Run(new Form1());
        }

        public Form1()
        {
            ContextMenuStrip contextMenuStripOnPictureBox1;

            contextMenuStripOnPictureBox1 = new ContextMenuStrip();    // pictureBox1上で表示するコンテキストメニュー

            // pictureBox1の定義
            pictureBox1 = new PictureBox();
            pictureBox1.Location = new Point(100, 100);
            pictureBox1.Size = new Size(100, 100);
            pictureBox1.BorderStyle = BorderStyle.FixedSingle;
            pictureBox1.Image = Image.FromFile("play100_100.png");
            pictureBox1.Parent = this;          // フォームにpictureBox1を追加する

            // pictureBox1の上で表示するコンテキストメニュー
            ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("削除(&D)");   // コンテキストメニューで表示される項目
            tsmiDelete.Click += new EventHandler(tsmiDelete_Click);            // コンテキストメニューのなかで「削除」を選択した時のデリゲート
            contextMenuStripOnPictureBox1.Items.Add(tsmiDelete);               // コンテキストメニューにtsmiDeleteを追加する
            pictureBox1.ContextMenuStrip = contextMenuStripOnPictureBox1;      // pictureBox1の上で左クリックしたときに、contextMenuStripOnPictureBox1に登録されたコンテキストメニューが表示されるようにする
        }

        // pictureBox1の上でコンテキストメニューを表示させたときのイベントハンドラ
        // 「削除」を選択した時実行される
        void tsmiDelete_Click(object sender, EventArgs e)
        {
            this.Controls.Remove(pictureBox1);  // フォームのコントロールからpictureBox1を消す
        }
    }
}
```


pictureBox1に入れ込む画像例
![play100_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/a27acc13-73db-7e81-42fe-d7bdabd46db1.png)

[（その２：削除したいコントロールが複数ある場合）](https://qiita.com/guijiu/items/988c444655ee2cb83f30)へ続く。
Kotlin hack where kotlinx.serialization supports inlineclass(kotlinx.serializationでinlineClassを使用するハック)

# はじめに
現時点(2020/3/28)では、`kotlinx.serialization`は`inline class`をサポートしていません。(ロードマップにはあるみたいですが...)
https://youtrack.jetbrains.com/issue/KT-28791
なので、コンストラクタを２つ使用すると擬似的に使用できます。
## 環境
Android Studio 4.0 Beta 3

```gradle:build.gradle.kts(Project)
buildscript {
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-serialization:1.3.70")
    }
}
```

```gradle:build.gradle.kts(app)
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0")
}
```
他の依存関係はよしなに


## コード
```kotlin:Tag.kt
inline class TagId(val value: String = "")

@Serializable
data class Tag private constructor(
	@SerialName("tag_id") private val _id: String,
	@SerialName("followers_count") val followersCount: Int,
	@SerialName("items_count") val itemsCount: Int,
	@SerialName("icon_url") @Serializable(URISerializer::class) val iconUrl: URI
) {

	constructor(id: TagId, followersCount: Int, iconUrl: URI, itemsCount: Int) :
			this(id.value, followersCount, itemsCount, iconUrl)

	val id get() = TagId(_id)

	enum class Sort {
		COUNT, NAME;

		val key = name.toLowerCase(Locale.getDefault())
	}
}

object URISerializer : KSerializer<URI> {
	override val descriptor: SerialDescriptor =
		PrimitiveDescriptor("URISerializer", PrimitiveKind.STRING)

	override fun deserialize(decoder: Decoder): URI = URI.create(decoder.decodeString())
	override fun serialize(encoder: Encoder, value: URI) = encoder.encodeString(value.toString())
}
```
## テスト
```HackTest.kt
val tag = Tag(TagId("this is tag"), 101, URI.create("https://example.com"), 4502)
val json = Json.stringify(Tag.serializer(), tag)
println(json)
val parsedTag = Json.parse(QiitaTag.serializer(), json)
println("$tag")
println("id: ${tag.id}"}
```

```kotlin
json = {"tag_id":"this is tag","followers_count":101,"items_count":4502,"icon_url":"https://example.com"}
tag = Tag(_id=this is tag, followersCount=101, itemsCount=4502, iconUrl=https://example.com)
id: QiitaTagId(value=this is tag)
```
## ポイント
・`inline class`が使えないのでプライベートコンストラクタでプリミティブにしてを定義
・セカンドコンストラクタで`inline class`を使用して定義
・プライマリ、セカンド コンストラクタで同じ引数順序は使用できないので入れ替える
・idのgetterを作成する

### おわり
ハックと言われるものではないと思う、、、
将来的にサポートされるので多分、待つのもありかなと。
既出でしたらすみません。見つけられませんでした。
エラー等ありましたらコメントお願いします。
Nuxt.js【Cannot find module '~/components/Footer.vue'  Vetur(2307)】の対処法

Nuxt.jsでコンポーネントを読み込む際に上手く読み込めず、下記のエラーが出る時があります。

```
Cannot find module '~/components/Footer.vue'  Vetur(2307)
```

読み込みコンポーネントにscriptタグが無いとエラーとなるようです。

```vue:Footer.vue
<script lang="ts">
 import Vue from "vue";
 export default Vue.extend({});
</script>
```
上記のように読み込む側のコンポーネントにscriptタグを記載すると、無事読み込めます。
ZabbixのアラートをLINEに送る

# はじめに

[Zabbix](https://www.zabbix.com/)のアラートをLINEに送信する方法について述べる。

# 前提条件

- Zabbixのバージョン: 4.4.6
- LINE Notify APiのバージョン: 2019-06-25版

# LINE Notify設定

LINE NotifyというLINE公式サービスを使うと、自動的にLINEにメッセージを送信できる。

https://notify-bot.line.me/ja/

LINEのアカウントを持っていれば誰でもログインできる。
ログイン後のトップ画面で「トークンを発行する」ボタンをクリック。

**アクセストークンの発行**
![Screenshot from 2020-03-28 09-34-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/482550e6-ef5b-a7e8-bfd6-4199f2e16fcb.png)

通知の際に表示される「トークン名」と通知を送信する「トークルーム」を指定する。
このとき、あらかじめトークルームにLINE Notifyを招待しておくこと。招待されていないと通知の送信に失敗する。

**トークン設定画面**
![Screenshot from 2020-03-28 09-40-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/708b7395-215c-559f-6f10-2f722a65b39d.png)

表示されたトークンは二度と再表示できないので、コピペしておくこと。

設定が完了すると、トップ画面の「連携中サービス一覧」に表示される。

**設定完了**
![Screenshot from 2020-03-28 09-40-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/40d4d65f-cec0-b2d0-e6a9-5973a674d6ca.png)

# Zabbix設定

次にZabbixを設定する。

Zabbixでは通知を送信する単位を**メディア**と呼び、そのメディアの種類をメディアタイプと呼ぶ。デフォルトのメディアタイプは、Email、Slack、SMSなどがある。今回はこのメディアタイプにLINEを追加する。

しかし、LINEをメディアタイプに追加しただけでは、通知は送信されない。メディアを**ユーザ**に追加する必要がある。これにより、そのユーザが管理する**ホスト**の通知がLINEに送信されるようになる。

## メディアタイプを作る

まず、LINEのメディアタイプを作る。

「管理 > メディアタイプ」 を表示し、右上の「メディアタイプの作成ボタン」をクリック。

![media.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/65003eac-f954-4ade-4a34-1f2a9e80c5da.png)

パラメータは以下のとおりとする。

|名前|値|
|---|----|
|名前|Line|
|パラメータ/message|{ALERT.SUBJECT} {ALERT.MESSAGE}|
|スクリプト|下記参照|

```javascript:スクリプト
try {
	Zabbix.Log(4, 'line webhook script value='+value);
 
	var result = {
		'tags': {
			'endpoint': 'line'
		}
	},
	params = JSON.parse(value),
	req = new CurlHttpRequest(),
	resp;
 
        // YOUR_TOKENをLINE Notifyで生成したトークンで置き換える。
	req.AddHeader('Content-Type: application/x-www-form-urlencoded');
	req.AddHeader('Authorization: Bearer YOUR_TOKEN');
 
	resp = req.Post('https://notify-api.line.me/api/notify',
		'message='+params.message
	);
 
	if (req.Status() != 200 && req.Status() != 400 && req.Status() != 401 && req.Status() != 500) {
		throw 'Response code: '+req.Status();
	}
 
	resp = JSON.parse(resp);
	result.tags.status = resp.status;
	result.tags.message = resp.message;
} catch (error) {
	Zabbix.Log(4, 'line issue creation failed json : '+JSON.stringify({"fields": fields}));
	Zabbix.Log(4, 'line issue creation failed : '+error);
 
	result = {};
}
 
return JSON.stringify(result);
```

## ユーザにメディアを割り付ける

次に、ユーザにメディアを割り当てる。

「管理 > ユーザー > Admin > メディア」 を表示し、右上の「追加ボタン」をクリック。

![user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/73925084-1a28-dc70-eda8-d201af981aa9.png)

以下のパラメータを設定して追加ボタンをクリック。

|名前|値|
|---|----|
|タイプ|Line|
|送信先|something(使わないので何でも良い)|
|有効な時間帯|1-7,00:00-24:00|

# LINEに通知が来た！

こんなかんじでLINEに通知が来た。

![Screenshot from 2020-03-28 09-55-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/bde93c83-0624-bad0-9903-d663c0b81629.png)
Blazor WebAssemblyのアプリケーションをVisual Studioでデバッグする

# 概要

Blazor WebAssembly 3.2.0 Preview 3がリリースされ、Visual Studio(とVisual Studio Code)のデバッグに対応したようなので、Visual Studioでのデバッグを試した際のメモです。

[参照元](https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-3-release-now-available/)

# 環境

Windows 10(64bit) 1909
Google Chorome 80.0.3987.149 (64bit)

.NET Core SDK 3.1.300-preview-015048
Microsoft.AspNetCore.Blazor 3.2.0-preview3.20168.3
Visual Studio 2019 Version 16.6.0 Preview 2.0



# セットアップ

## 最新の.NET Core SDK(3.1.201) のインストール

下記から最新バージョンのSDKをインストールします。
[リンク](https://dotnet.microsoft.com/download/dotnet-core/3.1)

## テンプレートの更新

下記のコマンドで最新のBlazor WebAssembly templateをインストールします。

```cmd
dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::3.2.0-preview3.20168.3
```

## Visual Studio 2019 Previewのインストール

下記から最新のプレビュー版のVisual Studioをインストールします。(16.6.0 Preview 2.0)
[リンク](https://visualstudio.microsoft.com/ja/vs/preview/?rr=https%3A%2F%2Fdevblogs.microsoft.com%2Faspnet%2Fblazor-webassembly-3-2-0-preview-3-release-now-available%2F)

私は試していませんが、最新プレビュー版をインストールすると、上記のSDKとテンプレートも合わせてインストールされるとのことですので、Preview版のインストールだけを実施だけでも良いかもしれません。

# Blazor WebAssemblyアプリ作成

## アプリの作成

Preview版のVisual Studioを起動し、新規にBlazor WebAssemblyのアプリを作成します。
(リリース元の説明ですと、ASP.NET Core hostedを使用した場合の説明となっていましたが、チェックをつけない場合でもデバッグできました。)

![v3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149198/16f40e1f-e604-7fa9-9cbb-f13c6c195637.png)

## デバッグ

### デバッグ時のブラウザ指定

私の環境では、Edgeをデバッグ時のブラウザに指定すると、デバッグができませんでした。
(Microsoft Edge 44.18362.449.0)

Choromeを指定することでデバッグ可能になったので、起動ブラウザを変更しました。

![v2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149198/2b77e878-9bf6-ab95-5ea5-305b90d75a9d.png)

### デバッグ実行

あとは、通常通りデバッグ実行を開始します。

ブレークポイントで止まってくれます。
![b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149198/c2b7c4df-26cb-6596-1148-3b7d5f76eb2d.png)

this以下に変数が格納されていてウォッチも可能です。
![b5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149198/bff7a31e-fa67-fb96-a2c8-858a9b91b726.png)

# おわりに

簡単にですが、Visual Studioを用いたBlazor WebAssemblyアプリのデバッグ方法を紹介しました。
まだプレビュー版ですが、使い慣れたVisual Studioでデバッグできるのは嬉しいですね。

説明を見ていた時には今回はASP.NET Core hosted版だけの対応かと思いましたが、未ホスト版でも使えたのは良かったです。
Stripe::InvalidRequestError: Some of the parameters you provided (payment_method) cannot be used when modifying a SetupIntent that was created by Checkout. / Ruby example /  #stripe )

```rb

require 'stripe'

Stripe.api_key = ENV['STRIPE_SECRET_KEY']

checkout_session = Stripe::Checkout::Session.create(
  payment_method_types: ['card'],
  mode: 'setup',
  success_url: 'http://example.com',
  cancel_url: 'http://example.com'
)

payment_method = Stripe::PaymentMethod.create(
  type: 'card',
  card: { number: '4242424242424242', exp_year: 2030, exp_month: 01}
)

# Stripe::InvalidRequestError:
# Some of the parameters you provided (payment_method) cannot be used when modifying a SetupIntent that was created by Checkout.
# You can try again without those parameters.

Stripe::SetupIntent.update(
  checkout_session.setup_intent,
  {payment_method: payment_method.id},
)

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3049








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ラズベリーパイ4冷却ファン


#1. はじめに

ラズベリーパイ４は前機種に対してスペックが上昇した分、CPUの温度が上昇しやすく過度の負荷をかけると温度上限(85℃)に達し、それ以上温度が上昇しないように機能制限がかかります。この機能制限のため、アプリが正常に動作しなかったり動画閲覧時に動画が一時停止することが頻発しました。他の記事にもあるようにファンによりCPUを冷却することはラズベリーパイ4の機能をフル活用する上では必須のようです。

#2. 部材調達

工作することが苦手なので、ファン付きのケースを調達することにしました。Amazonを覗けば色々なファン付きケースがありますが、下記を調達しました。

https://www.amazon.co.jp/gp/product/B07VB24K9W?pf_rd_r=Q8129TB2ET2XY1D8JW7K&pf_rd_p=3d322af3-60ce-4778-b834-9b7ade73f617&th=1

![43.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/05df237d-3bf3-c207-0a82-a1e415a89fbd.jpeg)


#3. 組み立て
組み立て方はいたって簡単です。基本的には説明書に従って作業をすればOKです。

#3-1 梱包箱

写真のような箱に入っています。

![44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/913be58b-80f1-da51-c19d-b740dbda8702.jpeg)


#3-2 開封の儀

![45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/96a101fb-e01a-1f94-68f6-224ea978f5be.jpeg)


#3-3 内容物の確認

冷却ファンとヒートシンクとケースが入っています。あと作業に困らないようにドライバーも
![47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/01b70c15-13a4-2f75-e942-4f0d36ad4443.jpeg)


#3-4 ヒートシンクを装着します。

ヒートシンク装着前
![48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/c5dab3d9-c9e6-4100-abdf-f325b5607e62.jpeg)


ヒートシンク装着後　ヒートシンクの底に両面テープが張ってありますので、保護シートを上手にはがして取り付けてください。
![49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/cff5d57f-d80a-3761-5194-168e6097a727.jpeg)


#3-4 冷却ファンの配線

赤配線を5Vラインに、黒い線をGNDに装着します。
![51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/43c3d653-adec-e891-418d-d0843f4e903c.jpeg)



<font color="red">(注意)当初、赤配線をGPIOピンに取り付けGPIO制御により冷却ファンのON/OFF制御を試みたのですが、GPIOピンの電流ドライブ能力は16mAしかないため無理でした。<b>ファンの定格電圧/電流：DC 5V, 160mA</b> </font>


[GPIO,5Vピンの出力電流スペック(ただしRaspi3のもの,Raspi4も同等)](http://www.minkycute.homeip.net/pukiwiki/index.php?Raspberry%20Pi%203%20%E5%9F%BA%E7%A4%8E%E7%B7%A8)
・GPIOピン1本あたりの最大電流は16mA
・複数本のGPIOピンを使用する場合、同時に流せる電流の合計は50mAまで
・5Vピンは、マイクロUSBの電源 - 1400mA - IOピンの電流　と考えましょう
・3.3Vはレギュレータの本体の余りなので、100mA程度と考えましょう。



冷却ファンの簡潔動作等をしたければ、[こちら](https://qiita.com/sh_o/items/30252850d8353f0f4158)に記載のとおり、電流駆動用のバイポーラトランジスタを調達し、バイポーラトランジスタのBaseをGPIOピンで制御する等の方法をとるのが通常です。

#3-5 完成

完成しました。
![52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/1b2f76c3-5f4e-16ba-9f5a-c58e6ac17696.jpeg)


#4. 効果確認

効果は抜群です。何もしないときはCPUの温度は65℃付近でした。You tube動画閲覧でリミットの85℃に達してしまいました。このファンつきケースではCPU温度は静止時25℃付近、You tube動画閲覧でも30℃付近までしか上昇しませんでした。これで、サーマルリミット85℃に達し機能停止が起きることはなくなりました。

![53.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/b16a203b-85d5-d301-dc59-242c063854de.jpeg)
BuddyPressでユーザにメールが届かないなと思ったときの対処【ユーザ登録後にメールが通知されないケースなど】

WordPressのプラグイン、`BuddyPress`を活用することがあったのですがメールが届かない事象がおきたので対処方法について記載します。

#BuddyPressでユーザにメールが届かないなと思ったときの対処
BuddyPressでユーザ登録をすると、
![buddypress_resistration.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609490/f3d3d049-bb10-a7a8-0465-92fc49ddccec.jpeg)

となってアクティベーション用のURLが記載されたメールが届くようなのですが、いっこうに届かない事象が発生しました。

管理者ページには新規登録があったことは確認できるのですが、登録したユーザに対してのメールだけがどうやら届いていない模様…

#【解決方法】functions.phpにメール設定を追加
ということで解決方法を探していたら、GitHubに同様の課題に関してのスレッドがありましたのでその内容をシェア致します。（参考ページ: [No WP new user emails being sent – buddypress issue](https://github.com/SparkPost/wordpress-sparkpost/issues/32)）

見出しのとおりですが、`functions.php`に以下を追加するだけで解決しました。

```php:functions.php
add_filter('bp_email_use_wp_mail', function () {
    return true;
});
```

改めて試験的にユーザ登録をしてみると、無事アクティベーションコードが送られてきました。

ひとまず一件落着。