OmniAICreator/Qiita-1.07M huggingface dataset:
githubで公開レポジトリに設定したものを非公開に

非公開に変更したいレポジトリにいき
[Settings]タブの中の[Options]を選択し
一番下までスライド
![スクリーンショット 2021-04-20 18.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344089/5bc6ef1c-270f-50ea-fd07-c30ff97b989b.png)
Danger ZoneのChange visibilityをクリックし
![スクリーンショット 2021-04-20 19.01.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344089/7f3208fc-10f6-1eb9-a43d-59f4c3e82d2e.png)
Make privateを選択し、最後に確認のレポジトリの名前を入力して完了
![スクリーンショット 2021-04-20 19.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344089/70c1b89e-a1f6-2d14-5dc5-2043ed49ced8.png)

過去にqiitaで上がっていた非公開に変更する方法と変わっていたので、投稿しました
「ノギザカクエスチョン」の成功確率について計算してみた

先日、テレビ東京の番組「乃木坂工事中」にて、ノギザカクエスチョンという企画がありました。
確かめてみたいことがあったので、少々計算してみました。
#企画内容
この企画は、ランダムに選出されたメンバーが、自分以外のたった一人(回答人数は $17$ 人)が当てはまる質問を出せるか？というものです。番組内での結果は以下の通りです。

|メンバー|質問内容|該当者数|
|:-:|:-|:-:|
|賀喜|東京23区を全て言うことができる|1
|松村|お母さんの名前がマサコである|1
久保|昨日、美容院に行った|1
梅澤|去年プライベートでメンバーに遭遇した人|5
高山|「となりのトトロ」を観たことがない|1
大園|実家に桜の木がある|0
日村|実家にみかんの木がある|1
生田|焼き魚の皮を必ず残す|3
筒井|今年のバレンタインに手作り菓子を作った|2
田村|家にこたつがある|0
星野|今まで一度もゆで卵を食べたことがない|0
設楽|今まで一度も卵かけご飯を食べたことがない|1
齋藤|憧れのメンバーが一回も変わっていない|7
岩本|枕を使わないで寝る|1
岩本|今朝 収録前に料理をしてきた|4

成功割合は $7/15\simeq46.7 \%$ となっており、見た目の難易度の割に成功率がかなり高いように思えます。
#成功確率の計算
さて、ここでは、チャレンジの成功確率について検討してみます。
以下では、一般に一人の参加者がある質問に関して該当する確率を $p$ で一定とし、各メンバーの回答に関して独立性を仮定します。企画に参加していたメンバーは $18$ 人なので、回答者数は $n=17$ 人です。すると、該当人数 $X$ に関する確率分布は二項分布 $B(n,p)$ に従います。

```math
{\rm Prob}(X=x)={_n}C_xp^x(1-p)^{n-x}
```
式の右辺は「該当人数が $x$ 人となるような確率」を表しています。
さて、成功可能性(該当人数が1となる確率 ${\rm Prob}(X=1)$)を最大化するような $p$ について考えてみましょう。

```math
{\rm Prob}(X=1)={_n}C_1p^1(1-p)^{n-1}=np(1-p)^{n-1}(=f(p)とする)\\
f'(p)=\cdots=n(1-np)(1-p)^{n-2}
```

$f(p)$ が最大となるような点での傾きの条件 $f'(p)=0$ より、成功可能性が最大となるのは $p=1/n$ の時となります。つまり、「$n$ 人に 1 人当てはまるような質問をすると上手くいきやすい」ということです。これは妥当に感じられますね。
この時のチャレンジ成功可能性ですが、

```math
f(1/n)=\cdots\left(1-\frac{1}{n}\right)^{n-1}\simeq 37.9\,\%\:(n=17の時)
```

つまり、最適な $p$ を取るような質問を提示しても成功確率は3分の1程度しかないわけです。ちなみに、 $n$ が増えてゆくとこの値は $1/{\rm e}\simeq36.8\,\%$ に収束します。また、$f(p)$ のグラフは以下の通りです。
![チャレンジ成功確率.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713550/a4316e16-ab09-72ef-fa89-e3053cfe9fe7.png)



結局のところ、番組内での成功割合 $7/15=46.7\,\%$は、理論上の値($\leq36.8\%$)をある程度上回っているようです。メンバーの運が良かったのかもしれませんし、ひょっとすると✂️があったのかもしれません。

#統計的仮説検定にかけてみる
せっかくなので、「✂️があったのではないか?」という仮説を検定してみましょう。
今までの結果を踏まえ、各チャレンジの成功確率を $p_0=1/3$ (全員が最適な質問をできるわけではないので、最大値より少し低い値に設定した)とします。
成功すると $1$ (確率 $p_0$), 失敗すると $0$ (確率 $1-p_0$)を取る(このような確率分布をベルヌーイ分布 $Ber(p_0)$ と言います)ような確率変数 $Y$ を考えます。
$Y$ を独立に $m=15$ 回試行する場合、期待値 $E(Y)=p_0$, 分散 $V(Y)=p_0(1-p_0)$ に注意して、その標本平均 $\bar{Y}$ は中心極限定理より、近似的に正規分布 $N(p_0,p_0(1-p_0)/m)$ に従います。よって、$\displaystyle \frac{\bar{Y}-p_0}{\sqrt{\frac{p_0(1-p_0)}{m}}}$ は標準正規分布 $N(0,1)$ に従います(この値が0から離れるほど✂️の可能性が強まる)。今回、有意確率(✂️があった訳ではないのに✂️があったと誤認してしまう確率)は $5 \%$ に設定します(これにより判定基準が決まる)。すると、

```math
\left|\frac{\bar{Y}-p_0}{\sqrt{\frac{p_0(1-p_0)}{m}}}\right|\simeq 1.10\leq z_{0.025}=1.960
```
となるので、今回の結果は自然な範囲に収まっていることがわかりました(つまり、最初の仮説は棄却)。

どうやら、少し運が良かっただけのようです。

ちなみに、今回紹介した推定方法は選挙の当選確実の決定などにも利用されています。

#最後に
ここまでご覧いただきありがとうございました。
さて、前置きが長くなりましたが、当該企画の放送後、27thシングルの選抜メンバーが発表されました。
早川聖来さん、初の選抜入りおめでとうございます👏
(これが言いたかっただけかもしれない)
[python] 辞書型(dict)のフィルタ方法 (特定の複数キーのみに絞る)

### 背景
大きな辞書から、複数の特定のキーのみに絞った小さな辞書を作りたい、というケースがあった。

```python
foo = {1:1, 2:2, 3:3, 4:4, 5:5}
# ↓ key_to_get = [1,2,5]
foo_filtered = {1:1, 2:2, 5:5}
```

### 結論
調べるとどうやらこうするのがいいらしい。

```python
foo = {1:1, 2:2, 3:3, 4:4, 5:5}
key_to_get = [1,2,5]
foo_filtered = {key: val for key, val in foo.items() if key in key_to_get}
print(foo_filtered)
# {1: 1, 2: 2, 5: 5}
```

### 追記
@kfjt さんが指摘してくださいました！
以下のほうが簡潔ですね。

```python
foo_filtered = {key: foo[key] for key in key_to_get}
```
key_to_getに、fooに存在しないkeyが入っているとKeyErrorがRaiseされると思うので、バグが入りこみにくいという点でもこっちのほうがいいかもしれないです。
ご指摘ありがとうございます！

ちなみに、辞書のkeyが存在しないときにデフォルト値を格納しておく方法も教えていただきました！
仕様に応じて使い分けですね。

```python
foo_filtered = {key: foo.get(key, 0) for key in key_to_get}
```

### ~~文句~~ こういうことができると思っていた
pandas.DataFrameみたいに、こうできたらいいのになぁ。
foo_filtered = foo[[1,2,5]]

以上！
pandasの単一値Seriesから値のみを取り出す & Series/DataFrameのデータをリストとして取得する

# 単一値Seriesから値のみを取り出す
### 背景

DataFrameから特定のデータを絞ったとき、Series型になる。この生のデータが欲しい。

```python
some_df = pd.DataFrame([[1.0,2.0],[3.0,4.0]], columns=['foo', 'bar'])
baz = some_df['foo'][:1]
print(baz)
# 0    1.0
# Name: foo, dtype: float64
```
たとえば、この数値`1.0`を取り出したい。

### 結論
以下で取得できる。

```python
baz.iloc[-1]
```

### 備考・注意
`baz.iloc[-1]`は、"最後の1行を取り出す"というメソッドの呼び方だが、bazに複数Columnが含まれればSeries型として取り出され、単一Columnの場合は値になるので、これを利用している。

注意として、bazに複数indexが含まれる場合は最終行のみしか出力されないので、バグが入り込みうる。

```python
some_df = pd.DataFrame([[1.0,2.0],[3.0,4.0]], columns=['foo', 'bar'])
baz = some_df['foo'][:2]
print(baz)
# 0    1.0
# 1    3.0
# Name: foo, dtype: float64

baz.iloc[-1]
# 3.0
```

# Series/DataFrameのデータをリストとして取得する
### 背景
pandasの並んだデータ(Series/DataFrame)をリストにしたい時がある。
### 結論
`baz.values.tolist()`メソッドを使う。



#### Seriesの場合

```python
some_df = pd.DataFrame([[1.0,2.0],[3.0,4.0]], columns=['foo', 'bar'])
baz = some_df['foo']
print(baz)
# 0    1.0
# 1    3.0
# Name: foo, dtype: float64
baz_list = baz.values.tolist()
print(baz_list)
# [1.0, 3.0]
```

#### DataFrameの場合

```python
some_df = pd.DataFrame([[1.0,2.0],[3.0,4.0]], columns=['foo', 'bar'])
baz = some_df[:1]
print(baz)
#    foo  bar
# 0  1.0  2.0
baz_list = baz.values.tolist()
print(baz_list)
# [[1.0, 2.0]]
```
※Seriesは必ず1列だが、DataFrameはm行n列を格納できるので、1行のデータでも二重リストが出てくる！

### 備考
`baz.values`でnumpyのndarrayに変換できるので、ndarrayのtolist()メソッドを使っている。
STM32L010と内蔵ADCで電圧を測る 330xmVまで 電圧の100倍　3V->300


STM32L010用に軽量コンパクト

xリビジョンは、125

1. 10の割り算のシフト演算化　-44バイト

```c++
//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

```
2.errorの無効化 -2452バイト

```c++
void error(const char* format, ...){}

```

構成
STM32L010F4P6
AQM0802A

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

説明

main関数の外で初期化

  AnalogIn adc_vbat(A3); //PA_4

main関数の中で読み出し

  s = (adc_vbat.read_u16()>>4);

参考
https://os.mbed.com/users/okini3939/notebook/AnalogIn_jp/

今までなぜSTM32L010内蔵ADCを使ていなかったと言えば容量がなかった。
必要もなかった。

デファイン DVI10(n) ((n*205)>>11)
電圧変換　p = (s*165) >> 11; 
には、各まる一日かけていた。
必要精度が出るように調整した。
基本、小数点以下は、切り捨て
理由は、シフト演算で行っている為
M0は、掛け算のハードは、あるが割り算のハードは、ないので
そこを工夫した。有効桁数が決まれば計算数を減らせるので
がんばってみた。　すべては、容量削減のため
計算量も上がるけど精度も上がるよ
考え方 1000*819.2/8192=100

```c++
#define DVI10(n) (((n*819)+(n>>2))>>13)
```

忙しい人よう
https://os.mbed.com/users/caa45040/code/i2c_lcd_adc_010_1/


ソース

```c++

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

AnalogIn adc_vbat(A3); //PA_4

#define ADDR        (0xD0)   //  address
#define ADDR_LCD    (0x7C)   //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
I2C i2c(PA_10, PA_9); //010

char    data_read[8];   //i2cバッファー

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

    b=DVI10(l_num);
    c=l_num-(b*10);
    l_num=b;
    a=DVI10(l_num);
    b=l_num-(a*10);

    ch_hex_a_b[0] = '@';
    ch_hex_a_b[1] = '0' + a;
    ch_hex_a_b[2] = '0' + b;
    ch_hex_a_b[3] = '0' + c;
    ch_hex_a_b[4] = 0;

    return(ch_hex_a_b);
}

int ii;     //ループカウンタ

int main()
{
    //液晶の初期化
    for(ii=0;ii<11;ii++){
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);wait_ms(2);
    } //for

//    i2c.write(ADDR, "\230", 1); //16bit 15sps PGA x1

    int p,s;
    while (1) {
        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);wait_ms(2);

    //adcの読み込み
        s = (adc_vbat.read_u16()>>4);

    //  (4096*165)/2048=330 電圧の100倍に変換
    //s = 13;
    p = (s*165) >> 11; 

//        //データの読み込み
//        i2c.read(ADDR | 1, data_read, 2);
//        
//        s = (data_read[0] * 256 ) + data_read[1];
//        //s = 32767;
//        //printf("-s=%d\r\n",s); //767
//        //printf(" h=%d\r\n",data_read[0] * 256 );
//        //printf(" l=%d\r\n",data_read[1]);
//
//        // 32768/(163.84/2)=400 luxに変換
//        p=( ((s>>5)*6)  + (s>>7)  ) >> 4;
//        //printf(" p=%d\r\n",p); //767
        
        i2c.write(ADDR_LCD, ch_hex_a( p ) ,4);

        wait_ms(1000);
    }//while

}//main

void error(const char* format, ...){}


```

![mcp3425_010_lux_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2ba7e643-d0c0-20f5-93e1-782771323a1e.jpeg)
Interop Tokyo2021のSTMの感想

今年度、STMとしてInterop2021に参加してきたので、学生目線でのそこでの体験や次に生かしたいことをまとめていきたいと思います。
ちなみに私は普段、セキュリティイベントなどのネットワークや仮想化基盤の設計・構築・運用に携わっています。

## Interop Tokyoとは？
Interop Tokyoは幕張メッセで開催されているインターネットテクノロジーのカンファレンス/展示会イベントです。今年は4月開催でしたが普段は6月中旬に開催しています。カンファレンスや展示会だけでなく、マルチベンダー間の相互接続検証等も行なっています。様々なメーカーやサービスベンダー、通信キャリア、大学などがあつまり、最先端のインターネットの技術やクラウドサービス等の紹介やデモを行っています。

## ShowNet
ShowNetは、Interop Tokyoの会期中、イベント会場である幕張メッセにおいてネットワークを構築し、出展ブース、来場者、カンファレンス会場などにインターネットへの接続性を提供するプロジェクトです。ShowNetでは最先端の技術や機器を用いてネットワークを構築されています。

## STM
STMは、NOCチームメンバーやコントリビュータメンバーと協力して、ShowNetを実際に構築、運用する作業を行います。具体的には企業に提供するネットワークの品質確認（ドロップチェック作業）、イベントで用いるネットワークのケーブル配線作業、イベント来場者向けのShowNetサービスカウンターでの対応など様々なことを行います。

## 体験してみて・・・
今回参加してみて多くのことを学べましたが特に感じたのは、自分はもっと色々なことを勉強する必要があるということを強く感じました。STMの活動では、NOCやSTM HotStage組といった豊富な知識を持つ人と触れ合う時間が多く、色々と話をすると自分の理解できない部分の話題が出てきます。こういった自分に知識が足りないことを強く学べたのが今回もっとも意味のあった経験だと思っています。そのため私はなるべくわからない言葉や単語が出てきた際にはその場でメモをしあとで調べると言ったことをしていました。
また、ネットワークという重要インフラを提供する大切さを学ぶことができました。私が今まで作ってきたネットワークでは監視システムでの監視作業はしていましたが、疎通確認作業は２、３回程度しか行なっていませんでした。しかしShowNetの準備を行う期間では何度もドロップチェック作業のような疎通確認作業を有線、無線問わず行なっており、ネットワークを提供し続ける大切さを感じました。

## まとめ
今回の経験を通し私は、また来年度参加してみたいと思えるような良い体験になりました。STMでは普段体験できないことを体験できる上、ShowNetのネットワークの理解出来ない部分などを、NOCやSTMの方に質問できるため、STMは自分の知識、コミュニティを広げるのにとても良い機会になると思います。
python 条件分岐について

## 初めに
初学者です。間違った表現などありましたらご指摘ください。

###if文について

`if文`とは条件分岐に使用する文です。条件分岐と`True (真)`の場合の条件の時はXの処理が実行される。`Flase（偽）の場合`の条件の時はYが実行されると言ったように条件が分岐する文のことです。
`Python`でのif文は、一般的な他のプログラミング言語と同様に、`if...elif...else`で構成されています。
簡単な書きかたは以下のようになります。

```python
if 式や関数などの条件式:
    実行する処理
```

elifやelseを使い、詳しく書くと以下になります。

```python
if 条件式A:
    条件式AがTrue（真）の場合に実行する処理
elif 条件式B:
    条件式AがFlase(偽)で条件式BがTrue(真)の場合に実行する処理
else:
    すべての条件式がFlase(偽)の場合に実行する処理
```
では簡単な例文を作っていきましょう。

###ifを使った例文

では年齢をif文を使って分けていきたいと思います。

```python
num = input('あなたの年齢は？')
age = int( num )
if age < 20 :
    print('未成年')
elif age < 65 :
    print('大人')
else :
    print('高齢者')
```
上記の文を詳しく読んでみます。
1行目〜文字列「あなたの年齢は？」を表示させ、年齢を入力させ`変数num`に紐付けます。
2行目〜`変数num`を整数化してから`変数age`と紐付けます。
3行目〜もし`変数age`が20より小さい場合が`True(真)`であれば以下を実行せよ
4行目〜文字列`未成年`を表示せよ
5行目〜そうではなく`変数age`が６５より小さい場合が`True(真)`であれば以下を表示せよ
6行目〜文字列`大人`を表示せよ
7行目〜それ以外であれば以下を実行せよ
8行目〜文字列`高齢者`を表示せよ

上記のように条件を分岐させて`真の場合`のみ処理をおこなうことができます。
Microsoft FormsにLaTeX数式を挿入する方法

##はじめに
組織全体でOffice365を導入している場合は，Microsoft Formsも何かと便利です．そこで，Microsoft Formsのアンケートフォームやクイズに$\LaTeX $の数式を挿入する方法についてのメモです．（しばらく使わない間に一度忘れてしまっていたので，自分用の備忘録です．）

##手順
1. 質問を「新規追加」
2. 選択肢，テキストなどから適切なものを選択
3. 右下の三点リーダー$\ldots$をクリック
4. サブタイトルにチェックを入れる
5. 数値演算にチェックを入れる
6. サブタイトルボックスの右端の$\fbox{T}$をクリックして「テキストに切り替える」
7. LaTeX形式で数式を入力(この際$で挟んでもよいが，挟まないでも通るので不要）
8. 入力後，サブタイトルボックス右端の$f_{x}$をクリックして「数式に切り替える」

これでめでたく，サブタイトルボックスに数式が表示されました．


![Forms_LateX_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/15a51904-4af8-969c-8254-e89a1733cbcb.gif)


##補足
選択肢タイプの設問では，数値演算にチェックを入れることで，同様に選択肢にもLaTeXの数式を挿入できます．
LaTeXiTなどで数式の画像を準備して挿入するというやり方もありますが，Formsに直接タイプできるものについては，直接タイプの方が楽かと思います．
今のところ，質問タイトル部分にはLaTeXの数式は入れられない模様です．
また，テキスト形式の回答の場合，回答も数値演算に限定されてしまいます．
Which is the Cheapest WordPress Hosting Plan for Beginners?

Bluehost is one of the best WordPress hosting providers, founded in 1196 with a focus on best yet inexpensive WordPress hosting for web designers and developers.

Since then, they have grown to hosting provider over 2 million websites all over the world making themselves a industry-leading web/WordPress hosting provider. Learn more about Bluehost here: www.updatedreviews.in/hosting-reviews/bluehost-india

<b>Shared WordPress Hosting Plans</b>

Bluehost offers three shared WordPress hosting plans, all of which include unlimited bandwidth, SSD storage, and email accounts, as well as a free domain name for 1st year and SSL certificate.

These hosting plans also contains access to the premium Cloudflare CDN. A CDN includes a collection of servers stored all over the world, which enhance the performance for your visitors.

<b>Basic Hosting Plan</b>

The cheapest plan is Basic, which is available for as low as Rs.199/month. It offers standard level of performance, which we have found to be adequate for most websites/blog. .

One of biggest restriction this plan is that you can only host single website with this hosting plan. But for newbies those who are just beginning, that should be fine.

<b>Plus Hosting Plan</b>
The Plus WordPress plan is available for as low as Rs.299/month. It offers amazing level of performance, which we have found to be adequate for most of the growing websites/blog. 

<b>Choice Plus Hosting Plan</b>
The Choice Plus WordPress hosting plan is also available for as low as Rs.299/month. It offers outstaning level of performance, which we have found to be adequate for all websites/blogs. 

These plans are managed by Bluehost, which means that they will take care of the tasks such as:

Automatic WordPress Installation
Automatic WordPress Updates
Secure Configuration
WordPress Staging Environment
Free Automatic Daily Malware Scan

With Bluehost your website/blog is also isolated from other websites hosted on the shared server environment for increased security, and you get access to 24*7 support.

<b>Uptime Guarantee</b>
Bluehost has a guarantee of 99.9% uptime. You can be sure that your website is acccessible all time without any intruption.

<b>Speed</b>
Bluehost has invested in the equipment/hardware needed to provide high-performance web hosting solution, such as LiteSpeed server, and SSD storage drives. They have excellent response time.

<b>Pros:</b>
Fast servers
World-class security
Automated backups
Free domain & SSL
Officially recommended by WordPress

<b>Cons:</b>
No Free Backups

All in all, Bluehost is one of the best hosting option for WordPress websites. You must give them a try: <a href="https://www.updatedreviews.in/go/bluehost-india" target="_blank" rel="nofollow noreferrer noopener">Visit Bluehost Now</a>
iCloudのバックアップからiPadを復元する方法

皆さんのご存知用に、iCloudバックアップを使って、新しいiPhone、iPad、iPod touchの設定や既存のデバイスの復元を実行できます。 iCloudバックアップの代わりに、コンピュータに保存されているバックアップからiOSデバイスまたはiPadOSデバイスの情報を復元することもできます。

ここでiCloudのバックアップからiPadを復元する方法をご紹介します。

パート１：Mac上のバックアップからiPadを復元する方法：
１、USBを使用して、新しいiPadまたは完全に消去したiPadと、バックアップが保存されたコンピュータを接続します。
２、次のいずれかを行います:
MacのFinderのサイドバーの場合: iPadを選択してから、「信頼」をクリックします。
注記: Finderを使用してバックアップからiPadを復元するには、macOS 10.15以降が必要です。それより前のバージョンのmacOSでは、iTunesを使用してバックアップからiPadを復元します。

パート2：Windows PCのiTunesアプリケーションの場合:
１、PCに複数のデバイスが接続されている場合は、iTunesウインドウの左上付近にあるデバイスアイコンをクリックしてから、リストで新しいiPadまたは完全に消去したiPadを選択します。
２、ようこそ画面で、「このバックアップから復元」をクリックし、リストでバックアップを選択してから、「続ける」をクリックします。
３、バックアップが暗号化されている場合は、ファイルと設定を復元する前にパスワードを入力する必要があります。
注記：
Apple IDの入力を求められます。Apple IDを忘れてしまった場合は、Apple IDの復元ウェブサイト（https://iforgot.apple.com/password/verify/appleid#）を参照してください。

ちなみに、もし上記の方法で復元できない、またはバックアップを取っていない場合、iMyFone D-Back（https://jp.imyfone.com/iphone-data-recovery/）というソフトを利用することをお勧めます。
Python による画像特徴の抽出（エッジ検出，HoG特徴，SIFT特徴）

#画像特徴とは
画像は，縦（ピクセル）×横（ピクセル）×色の次元数からなる情報を持っている．例えば，縦 100 ピクセル，横 100 ピクセルで 3 色のカラー画像だと，100 × 100 × 3 の 3 万次元の情報でデータが構成されている．日頃，こうした低次元ではない情報を扱う際，3 万次元のデータから 1 次元ずつの値を確認し，何かしらの判断を行うことはあまりなく，画像の特徴をうまく抽出して情報を扱っている．
ここで特徴の抽出には，全体特徴と局所的特徴の大きく 2 つあるが，今回，画像特有の局所特徴に絞って，特徴抽出の手法とその Python でのコーディングについて記載する．
※全体特徴については，統計的なデータの記事として別途記載する．

# 局所特徴の種類と概要
## エッジ検出
画像の明るさが鋭敏に変化している箇所を検出する．また，データの特徴では，ピクセル値が不連続に変化している箇所を特定する．ここでは，不連続な箇所を検出するための代表的な微分フィルタとして，Sobel フィルタを用いた実装をする．

## HoG特徴：Histograms of Oriented Gradients
輝度の勾配を角度ごとにヒストグラム化したもので，物体の形状を捉えるのに用いられる特徴量である．

## SIFT特徴：Scaled Invariance Feature Transform
特徴点の検出と特徴量の記述の2段階の処理を行う．特徴点の検出では，スケールの異なる平滑化画像の差分から画像特徴と思われるキーポイントを決定し，各キーポイントの周りで周辺の画像の勾配情報を用いることで情報を記述する．
※特許が取得されているので利用する際には注意が必要．

# 各画像特徴を抽出する Python コード
入力に用いるデータ img_color は ndarray 型であることを前提とする．

```
img.shape = ( 画像の縦のサイズ, 画像の横のサイズ, 色の次元数（RGB（赤、緑、青）の順） ) 
```

まず前処理として，このカラー画像をグレイスケールに変換する．

```
from skimage import io
from skimage.color import rgb2gray

img_color = skimage.io.imread(Inputfilename)
img_gray = rgb2gray(img_color)

```

## エッジ検出
エッジ処理の代表的な手法のひとつである Sobel フィルタを実装する．
Sobel フィルタの処理は sckit image の中に sobel という関数があるので，こちらを活用する．

```
# sobelフィルタ
from skimage.filters import sobel

sobel_img_gray = sobel(img_gray)
sobel_img_gray = sobel_img_gray.astype(np.uint8)
```

フィルタ処理後の画像を見たい場合には可視化することで確認できる．

```
io.imshow(sobel_img_gray)
```

ここで，何も表示されず，真っ暗な画面が表示される場合には，下記のようにフィルタ処理後の値を大きくしてやることで，見ることができる．ここで掛ける値については，いろいろと試してみて，ちょうどよい値を取るのが良い．

```
# 例：1000 倍してみる
sobel_img_gray = sobel(img_gray)*1000
```

## HoG特徴
HoG 特徴を抽出する処理についても sckit image の中に feature という関数があるので，こちらを活用する．

```
from skimage import feature
from skimage import feature
fd, hog_image = feature.hog(img_gray,
                           orientations = 8,
                           pixels_per_cell = (8, 8),
                           cells_per_block = (2, 2),
                           visualize = True,
                           multichannel = False,
                           feature_vector = False)

hog_image = hog_image*100
hog_image = hog_image.astype(np.uint8)
```

HoG では，特徴量の値が入った fd と描画のための hog_image が出力される．
fd のデータ構造は次のようになっている．

```
print(fd.shape) = ( (img_gray[0] / pixels_per_cell[0]) - 1, (img_gray[1] / pixels_per_cell[1]) - 1, cells_per_block[0], cells_per_block[1], orientations)
```

HoG特徴について，画像を見たい場合には可視化することで確認できる．

```
io.imshow(hog_image)
```

## SIFT特徴
SIFT特徴に関しては，OpenCV を用いて特徴抽出を行う．SIFT特徴では，カラー画像を扱うため，sckit image で画像を読み込んでいる場合には，BGR2RGB の変換を行わなければならない．

```
img_color= cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)
```

次に，SIFT特徴を抽出する処理を行う．

```
import cv2
import numpy as np

sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
img_sift = cv2.drawKeypoints(img_gray, keypoints, None, flags=4)
```

SIFT特徴について，画像を見たい場合には可視化することで確認できる．
```
cv2.imshow('imgSIFT', img_sift )
cv2.waitKey(0)
cv2.destroyAllWindows()
```

各画像特徴の抽出方法について，Python コードを載せてまとめたが，細かなパラメタなどの調整についてはいろいろと試しながら使いこなせるようにしていきたい．
rails sができない！！

#発端
Railsの開発環境を構築した後、その環境で１発目のrails sを実行したとき以下のようなエラーがでました。

```
=> Booting Puma
=> Rails 6.1.3.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
sh: yarn: command not found


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).





Exiting
```
　　

エラーメッセージ通り"yarn isntall --check-files"を実行しましたが、yarnというコマンドが見つからないと言われてしまいました。

#原因

環境構築の段階でyarnのインストールを忘れていたようです(笑)
凡ミス(笑)

#解決

Homebrewがインストールしてある場合は以下のコマンドでyarnがインストールできます。

```
$ brew update
$ brew install yarn
$ yarn install --check-files
```

これでrails sが無事実行できるようになりました！！
backlogからforkでリモートリポジトリをクローンしようとして詰まった件。

#backlogでGitをcloneするときに気をつけるべき点

##結論は「SSH」ではなく「HTTP」にするということ

![スクリーンショット 2021-04-20 17.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/b4021e39-d548-044f-b076-6457753912a0.png)
BacklogではGitをcloneするURLを取得する際に上記のようにHTTPとプルダウンでSSHが切り替えられる。
ここをSSHの状態でURLをコピーしてしまうとforkやターミナルでクローンしようとした際に
forkの例）

```
git@backlog.hoge.jp: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
```

ターミナルの例）

```
 Permission denied (publickey).
fatal: Could not read from remote repository.
```

のようなエラーになり公開キーの設定などをしないとクローン出来ない。

その為クローンする時はHTTPを選択する。


forkの画面でcloneを選択すればOK
![スクリーンショット 2021-04-20 17.50.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/fb75b3dd-c374-4d8e-83ef-018e23c590dc.png)
フォークでクローンする際にURLの記述がhttpから始まることを確認する
Scikit-learn Breast Cancer datasetを使ってみる



https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html

まずは、ロードしてみる。。

<pre>
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

#データの読み込み
cancer = load_breast_cancer()
</pre>

ざっくりと、データの形状を見てみる。。。

<pre>
cancer.data.shape
</pre>

(569, 30)

なんとなく、説明変数が３０だとわかる。。

説明変数を見てみる。。

<pre>
print(cancer["feature_names"])
</pre>

<pre>
['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']
</pre>

被説明変数（ラベル）を見てみる。。。

<pre>
print(cancer["target_names"])
</pre>

ガンか、そうでないか

<pre>
['malignant' 'benign']
</pre>

<pre>
print(cancer.target)
</pre>

<pre>
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0
 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1
 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1
 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0
 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1
 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1
 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0
 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1
 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1
 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1
 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0
 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 0 0 0 0 0 0 1]
</pre>

上の列は569個ある。

ロジスティック回帰をしてみる。。

<pre>
#学習用データとテスト用データに分割
X_train, X_test, Y_train, Y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=10)

# ロジスティック回帰
clf = LogisticRegression(max_iter=10000, random_state=10) 
clf.fit(X_train, Y_train)

#結果
print("学習用データの精度：{:.3f}".format(clf.score(X_train, Y_train)))
print("テスト用データの精度：{:.3f}".format(clf.score(X_test, Y_test)))
</pre>

<pre>
学習用データの精度：0.967
テスト用データの精度：0.944
</pre>

https://github.com/RuoAndo/time-series-analysis-with-Python/blob/master/logistic/loading_breast_cancer.ipynb
【TypeScript x Express】クエリパラメータ(req.query.~)に型をつける

Expressのrouterで取得できるクエリパラメータにはデフォルトで
`string | QueryString.ParsedQs | string[] | QueryString.ParsedQs[] | undefined`
という型がつく。

```ts
import express from 'express';

const router = express.Router();

router.get('/', (req, res, next) => {
    const userId = req.query.id;
    // const userId: string | QueryString.ParsedQs | string[] | QueryString.ParsedQs[] | undefined
    const userName = req.query.name;
    // const userName: string | QueryString.ParsedQs | string[] | QueryString.ParsedQs[] | undefined
}
```

これを `string | undefined` に変更したい。

## 方法1 型アサーション

```ts
import express from 'express';

const router = express.Router();

router.get('/', (req, res, next) => {
    const userId = req.query.id as string | undefined;
    // const userId: string | undefined
    const userName = req.query.name as string | undefined;
    // const userName: string | undefined
}
```

`req.query.` で補完されないので微妙


## 方法2 Request型を継承して新しい型を作る

```ts
import express, { Request } from 'express';

const router = express.Router();

interface ExRequest extends Request {
  query: {
    id: string | undefined
    name: string | undefined
  }
}

router.get('/', (req: ExRequest, res, next) => {
    const userId = req.query.id;
    // const userId: string | undefined
    const userName = req.query.name;
    // const userName: string | undefined
}
```
### インデックスシグネチャを使うとかっこいいかも？

```ts
import express, { Request } from 'express';

const router = express.Router();

type queryKeys = 'id' | 'name';

interface ExRequest extends Request {
  query: { 
    [key in queries]: string
  }
}

router.get('/', (req: ExRequest, res, next) => {
    const userId = req.query.id;
    // const userId: string | undefined
    const userName = req.query.name;
    // const userName: string | undefined
}
```

### ファイル分割するともっとかっこいいかも？

```ts:routes/types/index.d.ts
import { Request } from 'express';

type queryKeys = 'id' | 'name';

export interface ExRequest extends Request {
  query: { 
    [key in queries]: string
  }
}
```

```ts:routes/hoge.ts
import express from 'express';
import { ExRequest } from './types'

const router = express.Router();

router.get('/', (req: ExRequest, res, next) => {
    const userId = req.query.id as string | undefined;
    // const userId: string | undefined
    const userName = req.query.name as string | undefined;
    // const userName: string | undefined
}
```

## 方法3 Request型の定義を拡張する

```ts:routes/types/index.d.ts
export declare module 'express' {
  // ↑と書くとこの{}の中は@types/express/index.d.tsの名前空間eになる

  type querykeys = 'id' | 'name' ;

  interface Request {
    query: { [key in querykeys]: string | undefined }
  }
}
```

```ts:routes/hoge.ts
import express from 'express';
import { Request } from 'express';

const router = express.Router();

router.get('/', (req: Request, res, next) => {
    const userId = req.query.id;
    // const userId: string | undefined
    const userName = req.query.name;
    // const userName: string | undefined
}
```
【初心者向け】”最上部へ飛ぶ”ボタンの作り方【Discord】

# はじめに
本記事では、
・Bot開発者
・非Bot開発者
の二つのタイプに合わせて別々の解説をしています。
適した方を参考にしてください。
また、両タイプに共通の要素として
・EmbedもしくはWebhookを使用する
・必ずBotを使用しなければならない
・最上部のメッセージリンクが必要
という三つの要素があります。
この三つは覚えておいてください。

ただ、Webhookを使用するのはあまり推奨できないため、解説を省かせていただきます。

Webhookを使用するとこうなります：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701137/e8c34ced-b199-20ea-2f02-5e6c338bddf2.png)

一応埋め込みを削除すれば下の埋め込みを消すことができますが、おそらくPC限定の操作なので説明を省きます。

urlとするメッセージのリンクを変更することでほかのチャンネルの特定のメッセージへ飛ぶボタンを作成したり特定のジャンルへ飛ぶボタンを作成することもできます。

<details><summary>Bot開発者はこちら</summary><div>

※例ではdisocrd.pyの記法を使用しています。

最上部へ飛ぶボタンを作る場合、二つのやり方があります。
一つは、「titleとurlを指定する」、
二つ目は、「ハイパーリンクを使用する」
です。

## titleとurlを指定する
まずは一つ目のtitleとurlを指定する方を解説していきます。
開発者であればだれでも知っていると思いますが、Embedを作成する際にtitleとurlの二つを指定することができます。
その二つを指定することで最上部へ飛ぶボタンを作ることができます。

例：

```py
discord.Embed(
    title='最上部へ飛ぶ', 
    url='https://discord.com/channels/123/456/789/'
)
```

結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701137/d365e7ea-3ca4-8b44-57ab-25af03383020.png)


## ハイパーリンクを使用する
つぎはハイパーリンクを使用する方を解説していきます。
ハイパーリンクがわからない方向けに説明すると、ハイパーリンクは、`[表示するテキスト](リンク)` という形で記述することで、表示されているテキストをタップ・クリックすることによってリンク先に飛ぶことができるというものです。
ハイパーリンクを使用する場合はdescriptionを指定します。
※titleを指定すると記述したままの状態でEmbedが作成されます

例：

```py
discord.Embed(
    description='[最上部へ飛ぶ](https://discord.com/channels/123/456/789/)'
)
```

結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701137/2557e19c-7465-db0e-148f-bceda972a72a.png)


</div></details>

<details><summary>非Bot開発者はこちら</summary><div>

はじめに解説した通り、最上部へ飛ぶボタンを作成するにはBotが必須です。
そのため、
・Embedを作成できるBot
が必須となります。ここは各自Embedを作成できるBotを探してください。

また、Embedを使った最上部へ飛ぶボタンの作り方にも２パターンあります。
一つは、「titleとurlを指定する」、
二つ目は、「ハイパーリンクを使用する」
です。

一応両方とも解説してあるので、お好きな方を使用してください。

## titleとurlを指定する
Embedを作成する際に指定できる要素の一部として、「title」と、「url」の二つがあります。
この二つを指定することで最上部へ飛ぶボタンを作成することができます。
勘のいい人ならこの二つの単語を見ればわかると思いますが、
・titleに表示するテキストを指定
・urlに最上部のメッセージリンクを指定する
こうすることで最上部へ飛ぶボタンを作成することができます。
titleやurlの指定方法はBotによって変わると思うので、指定方法の解説は省略します。

作成結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701137/d365e7ea-3ca4-8b44-57ab-25af03383020.png)

## ハイパーリンクを使用する
ハイパーリンクを使用する場合は、Embedを作成する際に指定できる要素の一つの、「description」を使用することで最上部へ飛ぶボタンを作成できます。
ハイパーリンクがわからない方向けに説明すると、ハイパーリンクは、`[表示するテキスト](リンク)` という形で記述することで、表示されているテキストをタップ・クリックすることによってリンク先に飛ぶことができるというものです。
この通りにdescriptionを指定してあげることで、最上部へ飛ぶボタンを作成することができます。
descriptionの指定方法はBot依存のため指定方法の解説は省略します。

作成結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701137/2557e19c-7465-db0e-148f-bceda972a72a.png)

</div></details>
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.というエラー

#発端
パソコンを買い換えたので新しくRailsの環境を構築している中でbundle updateを実行すると

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```
このエラーメッセージの後に長々とエラーメッセージが続く、壮大なエラーが出てしまいました。

#原因

どうやらMySQL2のGemのインストールがうまくいっていないようでした。
翻訳してもよくわからなかったので、エラーメッセージでググってみました。
するとパスがうまく通っていないことが原因だったようです。

#解決

以下の通りに入力してパスを通すことでbundle updateができるようになりました。

```
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/
```

パス関係のエラーは本当ややこしいですね。(笑)

##参考記事

https://qiita.com/Ushinji/items/dc79f12f03fabdb7a7a6
【Command】エラー対処法：permission denied: unknown

Dockerでコンテナを起動した時に`permission denied: unknown`が発生した時の原因と対処法。

##エラー内容と原因
以下のようなエラーが発生。エラーの原因はファイルへのアクセス権がないこと。

```
ERROR: for ファイル名  Cannot start service unpacker: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "ファイル名": permission denied: unknown
```


##対処法
ファイルのアクセス権を変更する。

```
chmod [オプション] [パーミッション] ファイル/ディレクトリ
```

###実例

```
chmode 755 test/docker/entrypoint.sh
```

**755** 
所有者： rwx
グループ： rw
その他： rw

**777**
所有者： rwx
グループ： rwx
その他： rwx



<br>
###ディレクトリの中のファイルを一括で変更する方法
ディレクトリの中のファイルを指定した場合は`-R`オプションをつける

```:ディレクトリの場合
chmode -R 755 test/docker
```

`-R` --recursiveの略。再起的に変更する。
UE4.25以降のAndroidビルド環境の共存

#CodeWorks for AndroidとAndroid Studioのパスの共存

https://docs.unrealengine.com/ja/SharingAndReleasing/Mobile/Android/Setup/AndroidStudio/index.html

環境によって異なるかもしれませんが、
プロジェクト設定＞AndroidSDKのJDKやNDKのパスを上書きすると、
C:¥Users¥[User]¥AppData¥Local¥Unreal Engine¥Engine¥Config¥UserEngine.ini
というファイルが作成されて、このファイルが優先されて全てのエンジンの設定として共有されてしまいます。
なので、これを作成しないようにして（作られたら削除）、エンジンごとにパスを設定するようにしなければなりません。

##BaseEngine.iniによる書き換え

他の設定ファイルでも可能かもしれませんが、私はエンジンのBaseEngine.iniをそれぞれ書き換えました。
公式のページには"JDKPath"となってましたが、ソースを見ても"JavaPath"となっていたので、そのように設定しました。

```[エンジンインストール先]¥UE_4.24¥Engine¥Config¥BaseEngine.ini
[/Script/AndroidPlatformEditor.AndroidSDKSettings]
SDKPath = (Path="C:/NVPACK2/android-sdk-windows")
NDKPath = (Path="C:/NVPACK2/android-ndk-r14b")
JavaPath = (Path="C:/NVPACK2/jdk1.8.0_77")
SDKAPILevel=latest
NDKAPILevel=android-19
```


```[エンジンインストール先]¥UE_4.25¥Engine¥Config¥BaseEngine.ini
[/Script/AndroidPlatformEditor.AndroidSDKSettings]
SDKPath = (Path="C:/Users/[User]/AppData/Local/Android/Sdk")
NDKPath = (Path="C:/Users/[User]/AppData/Local/Android/Sdk/ndk/21.1.6352462")
JavaPath = (Path="C:/Program Files/Android/Android Studio/jre")
SDKAPILevel=matchndk
NDKAPILevel=latest
```
Docker + PHPでエラー：Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in ~の対処方法

`PHPのバージョンアップに伴い、mysqli_connect()がエラーに！！ `

```
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in ~
```
書き方はあっているはず。
なのにどうして！！？？

**「mysqliをインストールしてないんですよ」**
「え、それだけ。。。」
「Dockerにmysqliをインストールしてごらん」


# Dockerfileを編集しよう

「PHPのDockerfileに下記を追加してみ」

````yml:Dockerfile
  RUN docker-php-ext-install mysqli && \
  docker-php-ext-enable mysqli 
````

「追加しました」
「じゃあ、あとは$docker-compose build し直して」

````:コマンド
$ docker-compose build
$ docker-compose up -d
````

**おおおおお!! エラーがなくなりました✨**


嘘です、別のエラーが表示されました。。。

````
mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known
````

つづく。
Linux - sedコマンドの基本的な使い方


##sedコマンドとは？
・ファイルの中身を指定した条件で表示することができる。
・非対話型のエディタである。
・編集結果を、標準出力に出力するので、元のファイルを変更しない。
・文字列を置換するために用いられることが多い。

上記が主な特徴だと思います！

今回の記事では、よく使われると思われる
行を削除して表示する d　
行を表示する　p
行を置換する　s
について、説明していきます！
## 前提条件

シェルには、bushを使用しています。
bushのバージョンは、3.2.57です。
ちなみに、bashのバージョンは、以下のコマンドで確認することができます。

```
$ bash --version
```

##今回使うファイル
以下のような内容のファイルにsedコマンドを使用していきます。

```txt:test.txt
shinji
shinjishinji
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka
```

##基本的なコマンド形式
sedコマンドは、以下の形式で実行をします。

```
$ sed [オプション] <スクリプト> <対象ファイル>
```
スクリプトとは、コマンドとアドレスを組み合わせたような文字列のことです。
言葉だけだとよくわからないので、実際に書いていくとなんとなくわかってくると思います！

##「d」コマンドの使い方（行を削除して表示する）

```
$ sed 3d test.txt
shinji
shinjishinji
ayanamiiiiiiii!!!
asuka
shikinami asuka
```
上記の例だと、「3d」というスクリプトで、３行目の「ayanami」という行を削除して表示しています。
また、「1,3d」のように、数字を「,」でつなげると、1行目から3行目までを削除することができます。

```
$ sed 1,3d test.txt
ayanamiiiiiiii!!!
asuka
shikinami asuka
```
他にも、正規表現を用いて行を指定することもできます。
正規表現を使う際には、以下のように/^a/dのように、正規表現の部分を//で囲む必要があります。
下記の例では、aから始まる行を全て削除して表示しています。

```
$ sed /^a/d test.txt   #aから始まる行を削除して表示
shinji
shinjishinji
shikinami asuka
```

##「p」コマンドの使い方（指定した行を表示する）
「d」コマンドと同様に、表示させたい行をスクリプトで指定して実行することができます。
しかし、何もオプションを付けずに実行すると以下のようになってしまいます。

```
$ sed 1p test.txt
shinji    #１行目にあったshinjiが、二つに増えている。
shinji
shinjishinji
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka
```
これは、sedコマンドの特徴であり、何もオプションを付けずに「p」コマンドを実行すると
「元のファイルの内容」+「pコマンドで指定した行」を表示させるので、結果的に指定した行がひとつ増える表示をさせてしまいます。なぜそうなるかはパターンスペースが関係しているのですが、今回は置いといて、、、
この現象を防ぐには、以下のように「-n」オプションを付けます。
「-n」オプションをつけることによって、パターンスペースの出力をさせなくするオプションです。

```
$ sed -n 1p test.txt 
shinji
```

##「d」コマンドの使い方(行を置換して表示する)

sedコマンドの基本的な書式は、以下になります。

```
sed [オプション] 's/置換前文字列/置換後文字列/フラグ' <ファイル名>
```
例えば、 「shinji」を「mari」という文字列に置換するコマンドを実行してみると、以下のようになります。

```
$ sed 's/shinji/mari/' test.txt 
mari     #置換されている
marishinji　　#「shinjishinji」が「marishinji」になっている。
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka
```
フラグを何も付けずにsコマンドを実行すると、指定した文字列が行に複数あった場合、ひとつ目に見つかった文字列しか置換しないという特徴があります。
フラグに「g」をつけることで、全ての文字列を置換することができるようになります。

```
$ sed 's/shinji/mari/g' test.txt 
mari
marimari
ayanami
ayanamiiiiiiii!!!
asuka
shikinami asuka
```
この他にも「s」コマンドのフラグには、
置換が発生した行だけを表示させる「p」フラグ
があります。

##最後に
今回は、sedコマンドの基本的な使い方を紹介しました。
他にも正規表現を使ったり、後方参照を使った置換方法もありますので、興味があったら調べてみると面白いと思います！

##参考文献
以下の本で勉強させてもらってます。とてもわかりやすくて、プログラミング勉強してるけどちょくちょく出てくるLinuxってなんやねん！！って人におすすめです！！

[新しいLinuxの教科書-著者：三宅英明さん、大角祐介さん]
(https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Vueプロジェクトでechartsを使う方法

# Vueプロジェクトでechartsを使う方法

データの重要性はみんな知っていると思う。小さいプロジェクトでもいくつかのグラフを使って展示することがあります。最近はプロジェクトを開発する時でもグラフを使う必要があります、echartsというグラフライブラリを選択しました。なぜechartsを選択しましたか？使いやすい、グラフ種類多い、デザインがきれいためです。

## 1：直接echartsをインポートする

### echartsプロジェクト依存をインストール

```shell
npm install echarts --save
```

或いは

```shell
npm install echarts -S
```

インストールが完了したら、mail.jsにechartsを導入する

```javascript
import echarts from "echarts";

Vue.prototype.$echarts = echarts; 
```

### グラフを作成

src\App.vueに下記内容を切替する。

```html
<template>
  <div id="app">
    <div id="main" style="width: 600px;height:400px;"></div>
  </div>
</template>

<script>
export default {
  name: "app",
  methods: {
    drawChart() {
      // domを基づいて， echartsインスタンスを初期化
      let myChart = this.$echarts.init(document.getElementById("main"));
      // グラフの配置とデータ
      let option = {
        title: {
          text: "ECharts Sample"
        },
        tooltip: {},
        legend: {
          data: ["数量"]
        },
        xAxis: {
          data: ["本", "CD", "携帯電話", "パソコン", "プリンタ", "テレビ"]
        },
        yAxis: {},
        series: [
          {
            name: "数量",
            type: "bar",
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      };
      // 指定された配置とデータよりグラフを表示する
      myChart.setOption(option);
    }
  },
  mounted() {
    this.drawChart();
  }
};
</script>
```
![vue01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209998/8d9e7646-cc51-7b57-1ec0-b7a86ea2c73c.png)
## 2：Vue-EChartsコンポネントを利用する

### コンポネントをインストール

```shell
npm install vue-echarts -S
```

### コンポネントを使う

```html
<template>
  <div id="app">
    <v-chart class="my-chart" :options="bar"/>
  </div>
</template>
<script>
import ECharts from "vue-echarts ";
import "echarts/lib/chart/bar";
export default {
  name: "App",
  components: {
    "v-chart": ECharts
  },
  data: function() {
    return {
      bar: {
        title: {
          text: "ECharts サンプル"
        },
        tooltip: {},
        legend: {
          data: ["数量"]
        },
        xAxis: {
          data: ["本", "CD", "携帯電話", "パソコン", "プリンタ", "テレビ"]
        },
        yAxis: {},
        series: [
          {
            name: "数量",
            type: "bar",
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      }
    };
  }
};
</script>
<style>
.my-chart {
  width: 800px;
  height: 500px;
}
</style> 
```
![vue02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209998/0dd9eba1-6f9e-5df2-caa8-860f9c7d7847.png)
Atcoder用にVSCode環境を作る（C++編）

## はじめに
みなさん、AtCoderしてますか？自分は少し前に茶色コーダーになった初心者のMurabitoです。 
AtCoderはプログラミングスキルだけでなく時間との勝負でもあります。なので、入力部分のコーディングや、テストにかける時間を減らして、問題を解くのに集中したいですよね？
なので今回は`atcoder-tools`という入力部分のコードの自動生成、テストや提出の自動化をしてくれる便利なツールを`vscode-powertools`を使ってAtcoder用にVSCode環境を整えたいと思います。 
また、`ac-library`というmodintなど便利なAtCoder公式神ライブラリをインストール及びインクルードする方法も説明します。
今回は、C++でAtcoderをより効率的に解けるようにしますが、Nimなど他の言語でも使う方法も他の記事で説明します。

## コード

さきにGitHubにコードをあげておきます。
https://github.com/forest1102/atcoder-vscode-template
templateとして作ったので、`Use this template`から使えます。

## 想定環境

今回、環境を作るにあたり、Python3、Node.JSが入っている前提で話を進めます。 
インストールされてない場合は、以下を参考にしてください
Mac:

https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b

https://qiita.com/okhrn/items/935cf187aec5cf144558

Windows 10:

https://qiita.com/Masayuki-M/items/840a997a824e18f576d8

https://qiita.com/New_enpitsu_15/items/ee95bde0858e9f77acf0

## インストール

まず、`atcoder-tools`と`vscode-powertools`をインストールします。

### atcoder-tools のインストール方法

```bash
pip install atcoder-tools
```

VSCode

- [Power Tools](https://marketplace.visualstudio.com/items?itemName=ego-digital.vscode-powertools)

### Power Tools のインストール方法

VSCode の `Extensions` から`vscode-powertools`を探してインストール

# 各種設定

デフォルトでは c++用になっています  
設定は`.vscode/settings.json` を開いて、`ego.power-tools` の中で行えます

例えば、`atcoder.gen`, `atcoder.test`, `atcoder.submit` の中にある `params`を変更して atcoder-tools に渡す引数を変更できます。  
なお、`${activeFile}` には実行するファイル名、 `${workspaceRoot}`にはワークスペースの絶対パスが入ります。
ワークスペースとは今開いて作業しているフォルダのことです
他の変数は[こちら](https://github.com/egodigital/vscode-powertools/wiki/Values)を参照してください

`atcoder.test` や `atcoder.submit` のなかにある `compiler`を変更してコンパイラを変更できます

## AC-Library のインストール

github からインストールしてインクルードパスに入れて、`#include<atcoder/all>`のようにインクルードすると使用できます。
インストールは`git submodule add` を使います。

```bash
cd (ワークスペースへのパス)
git submodule add https://github.com/atcoder/ac-library.git ac-library
```

そして`ac-library` がワークスペースにインストールされているのが確認できたら以下のファイルを変更します。
`.vscode/c_cpp_properties.json`の`configurations.includePath`に`"./ac-library/**"`を追加して以下のようにします。

```json
{
  "configurations": [
    {
      "name": "Mac",
      "includePath": ["/usr/local/include/**", "./ac-library/**"],
      "defines": [],
      "macFrameworkPath": [],
      "compilerPath": "/usr/bin/g++",
      "cStandard": "gnu17",
      "intelliSenseMode": "gcc-x64"
    }
  ],
  "version": 4
}
```

そして`.vscode/settings.json` の`ego.power-tools`にある`atcoder.test`と `atcoder.submit`の`options.compiler`を`g++ -std=c++17 -fsanitize=address -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -I${workspaceRoot}/ac-library ${activeFile}`に変更することで使えます。
[ドキュメント](https://atcoder.github.io/ac-library/production/document_ja/)
大量の動画ファイルを読み込みつつ、サイトを軽くする実装について


##はじめに
この記事では、videoタグを用いて、大量のmp4ファイルを読み込みつつ、
サイトの読み込み速度を改善させる方法について考察しています。
（約50秒の動画ファイルを、25個設置しています。）

##実装編

videoタグの**preload属性**を使用し、動画の読み込み設定を行えるようです。

|        値        |        特徴        |
|:------------------:|:------------------:|
|            auto            |            初期値（ファイルを事前に取得）            |
|           metadata           |           ファイルのサイズや再生時間など、メタデータのみを取得           |
|            <font color="Red">none</font>            |            <font color="Red">事前のファイル取得を禁止</font>            |


noneを使用することで、動画ファイルの事前読み込みを禁止できます。
（→動画のファイル容量が大きくても、ページ読み込み時の遅延を防ぐことができます。）
<br>

```html
//preload属性を設定する
<video src="hoge" preload="none"></video>
```

<br>
##計測方法について
サイトの速度検索について、以下のサイトがメジャーのようです。

・[page speed insights](https://developers.google.com/speed/pagespeed/insights/?hl=JA)
![スクリーンショット 2021-04-20 16.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/7201020e-1b38-d689-6b16-807d3228acc0.png)
ただ、今回はローカル環境で手軽に計測を行いたかったため、デベロッパーツールで測定を行いました。
<br>
###デベロッパーツールでの計測方法について
1)　デベロッパーツールより、Networkのタブに切り替える。
![スクリーンショット 2021-04-15 9.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/be6cdcb5-3dd8-81be-e7f7-92941ecd1fb4.png)

2)　右下にFinishと表示されている項目をチェックする。
![スクリーンショット 2021-04-15 9.47.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/0be8af42-9a99-75e6-c767-687408483c22.png)

この部分を確認することで、そのページの読み込み時間の計測を行うことができます。

※より正確に計測を行うためには、赤ワクの箇所よりキャッシュの削除を行って下さい。
![スクリーンショット 2021-04-15 9.54.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/ff2ca82a-fb36-2d0e-3818-92d312f17e39.png)

##結果
約50秒の動画を、25個設置した場合のページ速度を計測しています。

**1) auto（初期値）の場合**
![スクリーンショット 2021-04-20 16.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/7f80d32f-a3be-4f5a-4c59-33fb5c09e033.png)
動画ファイルの合計が約60MBくらいあり、読み込みが完了するまでに約7秒ほどかかりました。
<br>
**2) none（事前のファイル取得を禁止）の場合**
![スクリーンショット 2021-04-20 16.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/bf8a0c19-6e74-b704-b3d5-5541f0c13f21.png)
事前のファイル読み込みを禁止したことで約200kbまで減り、読み込みも約0.4秒ほどにまで抑えられています。
（autoと比べたときに、約17倍も早く読み込めています。）

<br>
##終わりに
1つ懸念点があるとすれば、preload="none"を設定してしまうと、サムネイルが真っ暗になってしまうようです。
![スクリーンショット 2021-04-20 16.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211427/a9312e24-7c42-123f-061d-7ed62e065a1c.png)

poster属性を設定することでサムネイルで使用する画像を指定することができるので、そちらを検討しても良いかも知れません。

```html
//poster属性を設定する
<video src="hoge" preload="none" poster="hoge"></video>
```

<br>
##参考サイト
[videoタグリファレンス](http://www.htmq.com/html5/video.shtml)
未経験者が面接で聞かれそうな技術質問まとめ

# この記事について
良く聞く技術ワードをまとめていきます。私が思う大体こんな感じのという回答と参考のURLを記載します。


## MVCモデルを説明してください
MVCモデルとは、アプリケーションの設定を整理する考え方、概念の1つだと考えています。

- Modelは処理、ロジックを記載するところ
- Viewは画面の表示をするところ
- ControllerはModelとViewの橋渡しをするところ

それぞれ役割をもたせて、管理することで可読性、保守性が高いコードが書けると思います。

参考：https://book.cakephp.org/2/ja/cakephp-overview/understanding-model-view-controller.html


## JavaScriptのクロージャーについて説明してください

関数の中に関数(中の関数)を書く。中の関数から外側の関数にある変数にアクセスできる。(自分を囲むスコープにある変数を参照できる関数)

厳密な定義は違うかも、、。

参考：https://qiita.com/takeharu/items/4975031faf6f7baf077a

↓↓↓↓↓↓↓ あなたの記事の内容
##HTTPリクエストメソッドのGETとPOSTの違いを教えてください
───────
##HTTPリクエストのGETとPOSTの違いを教えてください
↑↑↑↑↑↑↑ 編集リクエストの内容

Get：なにか情報を検索したいときに使われる。読み取り専用
Post：登録処理や更新処理のときに使われる。書き込み権限。Bodyを含めることもできる

参考：https://qiita.com/kanataxa/items/522efb74421255f0e0a1


## クラスとインスタンスの説明をしてみて

クラス：設計図。ある実態を生成するために定義された概念のようなもの
インスタンス：クラスを元に作成された実体

車を例にすると
車というクラス(設計図)からベンツやBMWのようなインスタンス(実体)を製造します。

具体と抽象の関係に近いと認識しております(ドヤ顔)

参考：https://qiita.com/komo_ta/items/a5b4b5ea43cb8db2db2a


## https化とは、メリットは？

SSLサーバ証明書を発行して、通信を暗号化する。
第3者が通信の中身、ユーザ情報を見れないようにする。

参考：https://japan.norton.com/what-is-https-8564


## 公開鍵暗号方式とは
みんなにばらまく鍵(公開鍵)と自分だけが持ってる鍵(秘密鍵)の2つの鍵を使ってやり取りする暗号化方式のこと
暗号化とは　”元のデータ”を”ぐちゃぐちゃのデータ”にすること

ユーザがサーバに情報を送る。このときに公開鍵(暗号鍵)を使って暗号化して情報を送信。
サーバ側は秘密鍵(複合鍵)を使ってユーザから送られた情報を複合して読み取れるようにします。

こうすることで安全に情報のやりとりができます。



---
よく聞かれそうだなーと思ったことを纏めました。
かなりざっくりな説明で私の認識が間違っていることもあります！

### 「複業クラウド」について
弊社Another worksでは複業マッチングプラットフォーム「複業クラウド」を開発しています！

▼複業でスキルを活かしてみませんか？複業クラウドの登録はこちら！
https://talent.aw-anotherworks.com/?login_type=none
Amazon Linux に 他の Linux から SSH でアクセスしたらエラー① - pem ファイルの permission-

### pem ファイルの permission が開きすぎ得て ssh エラー
```
# 実行コマンド
[ec2-user@ip-10-7-0-106 tmp]$ ssh -i ./xxx_keypair.pem ec2-user@10.7.1.218
```

```
# エラー
The authenticity of host '10.7.1.218 (10.7.1.218)' can't be established.
ECDSA key fingerprint is SHA256:OxZAzo+x6ixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
ECDSA key fingerprint is MD5:34:e4:5a:aa:1b:34:e4:5a:aa:1b:34:e4:5a:aa:1b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.7.1.218' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0664 for './xxx_keypair.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "./xxx_keypair.pem": bad permissions
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[ec2-user@ip-10-7-0-106 tmp]$
```

Permissions 0664 for './xxx_keypair.pem' are too open.
It is required that your private key files are NOT accessible by others.
とのことで、指定した pem ファイルが許可されすぎ。Othersからアクセスできちゃだめとのことで

```
#permission を確認
[ec2-user@ip-10-7-0-106 tmp]$ ls -l
total 20
-rw-rw-r-- 1 ec2-user ec2-user 1734 Aug 12  2018 xxx_keypair.pem
```
たしかに other にも permission がついているので

```
#permission の変更
[ec2-user@ip-10-7-0-106 tmp]$ chmod 600 xxx_keypair.pem
[ec2-user@ip-10-7-0-106 tmp]$

#permission を再確認
[ec2-user@ip-10-7-1-218 tmp]$ ls -l
total 20
-rw------- 1 ec2-user ec2-user 1734 Apr 16 03:36 xxx_keypair.pem
[ec2-user@ip-10-7-1-218 tmp]$
```

再接続

```
[ec2-user@ip-10-7-0-106 tmp]$ ssh -i ./xxx_keypair.pem ec2-user@10.7.1.218
Last login: Mon Apr 19 11:50:52 2021 from ip-172-31-1-202.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-7-1-218 ~]$
[ec2-user@ip-10-7-1-218 ~]$
[ec2-user@ip-10-7-1-218 ~]$
```

めでたしめでたし。
Apple Silicon M1で R が動いて14.3倍速い件 (Dockerコンテナ編)

#前回こちらの記事を書いてから、

https://qiita.com/taiyodayo/items/ae8faa9fab6ad287bb9e

「Apple SiliconのRはまだまだ最適化されるのでは」の感想を持ちました。


#結論から言うと「さらに速くなりました」

Dockerコンテナの r-base が、aarch64ネイティブ対応となって最適化が進んでいるようです。
(gcc11が標準になったりしていました)

前回のベンチマーク vs dockerコンテナ版で、速度を比較してみました：
(コードは前回の記事をご参照下さい)

```
"brew install R" したバイナリ
2021/4 時点(R4.0.5)
Unit: milliseconds
          expr       min        lq     mean   median       uq      max neval
            lm 49.051744 50.826265 52.95558 51.80733 52.80433 65.09148   100
 pseudoinverse 11.956379 14.711989 17.91940 16.34217 18.85711 34.07059   100
 linear system  8.523859  9.505297 11.80922 10.88540 12.43758 60.45782   100

"docker run -ti --rm r-base" したバイナリ"
Unit: milliseconds
          expr       min        lq      mean    median        uq      max neval
            lm 51.804542 53.859188 57.193025 55.334729 57.685460 84.83871   100
 pseudoinverse  8.373584  9.421521 11.997803  9.928709 11.798813 27.51638   100
 linear system  5.743792  5.938064  7.182378  6.749313  7.698855 17.39467   100

```

比較用に、他環境でのスコアです：

```
# Intel MacBook Pro 16 inch (2019) Core i9 (8-core) @ 2.3GHz
Unit: milliseconds
          expr       min        lq      mean    median       uq      max neval
            lm  97.25333 106.07812 110.52555 109.50081 113.4430 133.7976   100
 pseudoinverse 126.66369 137.49634 143.64142 141.95922 148.4088 173.3653   100
 linear system  66.99625  75.51475  80.96854  79.02423  85.9040 123.8282   100

# Linux マシン (GPUホスト)
# model name    : Intel(R) Core(TM) i9-7900X CPU (14-core) @ 3.30GHz
# Linux 5.4.0-65-generic #73-Ubuntu SMP
Unit: milliseconds
          expr       min        lq      mean    median        uq       max neval
            lm  82.07969  84.43838  88.18862  87.02851  89.37451 108.46766   100
 pseudoinverse 110.66148 113.61129 116.64092 115.37820 117.84845 139.03118   100
 linear system  58.79841  61.27981  64.23350  62.86225  65.15092  83.25834   100
```


# 結論として、インテルMBPの「14.3倍」速い
ことがわかりました。
（pseudoinverse - 擬似逆行列 のスコアです）

対 Intel(R) Core(TM) i9-7900X CPU (14-core) 比でも「11.6倍」...

...これホントにノートパソコンのCPUだよね...？
...爆速にも程がある...!!!