OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby でツイートを取得する

何番煎じ？

[twitter gem](https://github.com/sferik/twitter) を使います。Twitter の開発者登録とアプリケーション登録は済ませているものとします。

以下は irb 上で動作確認をしました。

## 認証

APIキーとAPIシークレットによって認証をします。[Example](https://github.com/sferik/twitter/blob/master/examples/Configuration.md#configuration) を読む限り、[bearer token を使っている方の認証](https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0)のはずです。（[他にも認証方法があり](https://developer.twitter.com/en/docs/basics/authentication/overview)、目的によって使い分けます。）

```ruby
client = Twitter::REST::Client.new do |config|
  config.consumer_key    = "YOUR_API_KEY"
  config.consumer_secret = "YOUR_API_SECRET"
end
```

特定のユーザーのツイートは `client.user_timeline` ([ref](https://rdoc.info/gems/twitter/Twitter/REST/Timelines#user_timeline-instance_method)) で取得できます。ユーザーIDかユーザーのスクリーンネームで取得できます。

```ruby
tweets = client.user_timeline(
  user_id, {
    :count => 200,
    :include_rts => false
  }
)
```

`:count` の max は 200 で、Twitter API の制限としては3200個まで取得できるので、 200以上昔のものを取得したい場合はたぶん `:max_id` を指定すればいいと思います。

`:include_rts` を切れば RT を除外できます。

`Array<Twitter::Tweet>` で返ってきます。

[ツイートオブジェクトのメソッド](https://rdoc.info/gems/twitter/Twitter/Tweet)は色々あり、ここではとりあえず本文をみてみましょう。

```ruby
tweets.map do |tweet|
  tweet.text
end
```

てな感じです。
UnityでWindowsストアアプリ

#Unity公式のスタートアップ（古い）
https://unity3d.com/jp/partners/microsoft/porting-guides

#Windowsストア開発者アカウント登録
https://developer.microsoft.com/ja-jp/store/register
[Windowsアプリを公開するための開発者アカウントを登録する](https://qiita.com/taketakekaho/items/972a322bb6ea983bd7a9)

#証明書作成
[コード署名用証明書と Visual Studio での署名設定](https://mseeeen.msen.jp/code-signing-certificate/)
[自己証明書の作成](http://223n.blog.jp/archives/60505495.html)

```
makecert -n "CN=[パッケージ/ID/発行元]" -b 01/01/2000 -e 01/01/3000 -r -sv test.pvk test.cer

* * *
パブリッシャーの表示名 (会社名) = O
Windows 発行元 ID = CN
```
```
pvk2pfx -pvk test.pvk -spc test.cer -pfx test.pfx -f -pi "password"
```

#マニフェスト

パートナーセンターの製品ページ
アプリケーション名 = アプリ表示名
パッケージ名 = 製品 IDページ内の「パッケージ/ID/名前」

ファミリ名は自動で決定上記が何か一つでも間違っているとエラーになる


#ビルド
[プロジェクト右クリック]->[ストア]->[サイドローディング]
x64 Master
pdbファイル含めない
ビルドバージョン自動更新しない

#提出
## `enterpriseAuthentication` は使用しない
> かなり限定された状況を除き、一部の制限付き機能が Microsoft Store に提出されるアプリで承認されることはほとんどありません。 これらの機能は、次の表で言及されています。 Microsoft Store で配布する予定の場合、アプリでこれらの機能を宣言しないことをお勧めします。

とあるので外しましょう。提出の際に`enterpriseAuthentication`がついている理由を記述しなければならなくなります。[参照:アプリ機能の宣言](https://docs.microsoft.com/ja-jp/windows/uwp/packaging/app-capability-declarations)

#参照
マスタービルドをすること
https://forum.unity.com/threads/windows-app-certification-kit-fails.360182/

#TAX ID
https://ja.111capitalusa.com/real-estate-faq/itin/
Swift: Menu Bar ScrollView作成（UIStackView, UIScrollView, SnapKit)

#スクロールできるMenu Bar

Youtube: https://youtu.be/F_Z56qILurE

![MenuBarScrollView.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166098/ced74400-8d8f-a90e-de07-661761005602.jpeg)
統計学入門 東京大学出版会 ２章練習問題

#第２章練習問題

これらの計算はすでにある関数を用いればすぐ求められるようなものばかりではありますが,中身の勉強という意味で一から実装していくものとします。

###2.2平均差・ジニ係数

A : 0, 3, 3, 5, 5, 5, 5, 7, 7, 10
B : 0, 1, 2, 3, 5, 5, 7, 8, 9, 10
C : 3, 4, 4, 5, 5, 5, 5, 6, 6, 7

のデータについて平均差とジニ係数を計算せよ。

ここで平均差とジニ係数はそれぞれ以下の式で定義されます。

```math
\frac{Σ_iΣ_j|x_i-x_j|}{n^2}
```

```math
\frac{Σ_iΣ_j|x_i-x_j|}{2n^2 \bar{x}}
```

ゆえに以下のようにプログラムを書きました。

```py
import numpy as np
A = np.array([0,3,3,5,5,5,5,7,7,10])
B = np.array([0,1,2,3,5,5,7,8,9,10])
C = np.array([3,4,4,5,5,5,5,6,6,7])
#平均差
def ave_diff(x):
    n=len(x)**2
    result = [np.abs(x[i]-x[j])/n for i in range(len(x)) for j in range(len(x))]
    return sum(result)


"""
print(ave_diff(A))
print(ave_diff(B))
print(ave_diff(C))

2.76
3.7599999999999976
1.2000000000000008
"""
```

```py
#ジニ係数
def get_gini(x):
def get_gini(x):
    n=len(x)**2
    x_bar=x.mean()
    result = [np.abs(x[i]-x[j])/(2*n*x_bar) for i in range(len(x)) for j in range(len(x))]
    return sum(result)
"""
print(get_gini(A))
print(get_gini(B))
print(get_gini(C))

0.2760000000000002
0.3760000000000002
0.12000000000000008
"""

```

###2.3エントロピー

p_i=f_i/nとした時

```math
H(p_1, p_2, ...., p_n) = -Σp_iilog(p_ii)
```
で定義されます。
この量をエントロピーといい、Hが大きいほど分布は一様となり、小さいほど集中性が見られます。

例題
100人の学生に出身地を尋ねた。10年前と本年に対して以下の結果を得た。集中性という見地からこの出身地の分布を比較せよ。

|地域|A |B| C| D| E| 計|
|---|---|---|---|---|---|---|
|本年|32|19|10|24|15|100|
|10年前|28|13|18|29|12|100|


```py
import numpy as np
a=np.array([32, 19, 10, 24, 15])
b=np.array([28,13,18,29,12])

def entropy(x):
    H=0
    n=sum(x)
    
    H=[x[i]/n*np.log10(x[i]/n) for i in range(len(x))]
#     for i in range(len(x)):
#         p=a[i]/n
#         H.append(p*np.log10(p))
    return -sum(H)

"""
print(entropy(a))
print(entropy(b))

0.667724435887455
0.6704368955892825
"""
```


###2.4標準得点・偏差得点
データBについて標準得点、偏差値得点を計算せよ

標準得点・標準化

```math
z_i = \frac{xi-\bar{x}}{S_x}
```

ですので、

```py
def standard_score(x):
    x_bar = x.mean()
    s=np.sqrt(x.var())
    z = [(x[i]-x_bar)/s for i in range(len(x))]
    return z

"""
standard_score(B)

[-1.5214515486254614,
 -1.217161238900369,
 -0.9128709291752768,
 -0.6085806194501845,
 0.0,
 0.0,
 0.6085806194501845,
 0.9128709291752768,
 1.217161238900369,
 1.5214515486254614]

"""
```

偏差値得点については

```math
T_i = 10z_i * 50
```

ですので上の関数を少し変更し、


```py
def dev_val(x):
    x_bar = x.mean()
    s=np.sqrt(x.var())
    T = [(x[i]-x_bar)/s*10 +50 for i in range(len(x))]
    return T

'''

def_val(B)


[34.78548451374539,
 37.82838761099631,
 40.87129070824723,
 43.91419380549816,
 50.0,
 50.0,
 56.08580619450184,
 59.12870929175277,
 62.17161238900369,
 65.21451548625461]

'''
```

となります。
LaravelでMySQLの接続エラー

##マイグレーションを実行するとエラーがでる
MAMP環境です:blush:
```php artisan migrate```を実行すると以下のエラーが出る

```sh
Illuminate\Database\QueryException

  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel_task and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675|
```

##原因
私の場合は、.envファイルの記述ミスでした。
**ポート番号**をデフォルトのままにしていたのがエラーの原因です。

##MAMPのポート番号を確認
1. MAMPの「Open WebStart page」を押下
<img width="518" alt="スクリーンショット 2020-05-10 21.02.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435447/2b6e9282-8077-80fa-e8a3-f46061e87dcd.png">

2. 開いたページにポート番号が載っています。
<img width="461" alt="スクリーンショット 2020-05-10 21.03.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435447/3a44e01c-40c1-bda5-918d-21b1b7aeda92.png">

3. ポート番号を修正後再度マイグレーションを実行。

```sh
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.03 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
```
無事実行できました:heart_eyes:
【グラフ描画】複数系列の棒グラフをmatplotlibとseabornで書いてみた

# はじめに
複数系列の棒グラフの描画をmatplotlibとseabornで比較してみました。

結論から言うと、**seabornは便利ですね**という記事です

- 環境
  - Windows-10-10.0.18362-SP0
  - Python 3.7.6
  - pip 19.3.1
  - pandas 1.0.3
  - matplotlib 3.1.2
  - seaborn 0.10.0
  - numpy 1.18.1

# 描画するグラフ
左側がmatplotlib,右側がseabornです。グラフだけ見ると同じですが、これらを描画するまでがseabornは楽です。
棒の色は同じ色を指定していますが、seabornのほうがちょっと淡いですね。こういうのももしかしたら設定がどこかにあるんでしょうか・・・
![グラフを描画してみた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635079/5370f02a-0aaa-8cc1-aac2-00aadf693da4.png)



# 描画の流れ
上の棒グラフを描画するまでの流れです。

### ライブラリをインストール

```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from io import StringIO
import numpy as np
```
```python
%matplotlib inline
```


### DataFrameを作成する

```python
data = ('人数,性別,年齢\n'
       '58,男性,18歳\n'
       '25,男性,19歳\n'
       '42,男性,20歳\n'
       '60,女性,18歳\n'
       '42,女性,19歳\n'
       '70,女性,20歳\n' 
       )
df = pd.read_csv(StringIO(data), dtype={'人数':'int32'})
```
```python
print(df)
```
↓

| 人数 | 性別 | 年齢 |
|:-:|:-:|:-:|
|  58 | 男性  |  18歳 |
|  25 |  男性 |  19歳 |
| 42  |  男性 |  20歳 |
|  60 |  女性 |  18歳 |
|  42 | 女性  |  19歳 |
|  70 |  女性 |  20歳 |


### グラフを描画する


```python
plt.rcParams['font.family'] = 'Yu Gothic' #Yu Gothicをデフォルト設定で日本語文字化けを回避
plt.rcParams['font.size'] = 20 #デフォルトのフォントサイズを設定

fig,ax = plt.subplots(1, 2, figsize=(24,10)) #1行､2列で横24インチ、縦10インチの描画スペースを作成


#matplotlibでの棒グラフ描画はdfのデータをちょっと分けます
labels = list(df['年齢'].unique()) #X軸のラベルに相当する場所をdfからリスト化
number_male = list(df['人数'].loc[0:2]) #dfの上から3行の人数の数値（男性の数値）をリスト化
number_female = list(df['人数'].loc[3:5]) #dfの下から3行の人数の数値（女性の数値）をリスト化
left = np.arange(len(number_male)) #X軸のラベルを貼り付ける座標を指定する用
print(left) #leftの中身は [0 1 2]
width = 0.4 #複数系列のグラフの場合はX軸ラベルの座標がleftのみだとずれるので、補正分


#matplotlibで棒グラフ
ax[0].bar(x=left, height=number_male, width=width, align='center', color='royalblue') #男性部分の棒グラフを追加
ax[0].bar(x=left+width, height=number_female, width=width, align='center', color='tomato') #女性部分の棒グラフを追加
ax[0].set_xticks(left + width / 2) #18歳、19歳、20歳部分の軸の位置を指定
ax[0].set_xticklabels(labels=labels) #"18歳、19歳、20歳"を描画するように指定
ax[0].set_xlabel('年齢') #X軸のラベル
ax[0].set_ylabel('人数') #Y軸のラベル
ax[0].legend(list(df['性別'].unique()), title='性別', loc='upper right') #凡例の男性、女性、タイトルを性別、位置を右上へ設定
ax[0].set_title('matplotlibで棒グラフ', size=30) #タイトルを設定


#seabornで棒グラフ
sns.barplot(data=df, x='年齢', y='人数', hue='性別', ax=ax[1], palette={'男性':'royalblue','女性':'tomato'}) #data=dfと指定して、XとYを設定、hue='性別'とすることで性別別で分けてくれる
ax[1].legend(loc='upper right', title='性別') #凡例のタイトル、位置を右上へ設定
ax[1].set_title('seabornで棒グラフ', size=30) #タイトルを設定


plt.savefig('グラフを描画してみた.png', bbox_inches='tight', pad_inches=0.3) #描画した画像を保存
plt.show() #描画
```


これで[こちらの棒グラフ](#描画するグラフ) が描画されます。

|  | 行数 |
|:-:|:-:|
| matplotlib  | 8  |
|  seaborn |  3 |

seabornのほうが見るからに楽に描画できます！コードは凡例とタイトルで2行なので、1行だけで複数系列の棒グラフを書けますね。
～ない頃には二度と戻れない～クリップボードの履歴アプリが便利すぎる

#はじめに
PCで作業するときに最もよく使う機能の一つに「コピペ」が挙げられると思います。
ただこのコピペ、直前にコピーしたものにしかペーストすることができません。

以前コピーしたテキストが履歴として残っていて、すぐコピーできるとすごーく便利だと思いませんか。
そんなクリップボードの履歴管理を可能にするアプリがこいつです！！

”[clibor](https://www.vector.co.jp/soft/winnt/util/se472890.html)”


「クリボー」と読みます。
アプリの導入は、上記サイトからダウンロードした「clibor.exe」をクリックするだけです。

#使い方
使い方はめっちゃ簡単です。
「ctrl」を２回素早く押すだけです。
２回押すと下のようなウィンドウが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/a7f6073e-2bea-fce8-9aba-e62561972172.png)

コピーしたテキストが随時このリストに追加されていきます。

あとはペーストしたいテキストを選択して、「Ctrl + P」で貼り付けすることができます。

#発展
１.「clibor.exe」をシャットダウンするたびにクリックするのはめんどうなので、
スタートアップに入れておきましょう。
https://qiita.com/kira4845/items/509bcdc4f25740400997

２.cliborはクリップボードの履歴だけでなく、定型文も登録することができます。
qiitaのマークダウンやメールのテンプレートなど登録すると非常に便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338998/bd6570f1-8511-948b-974c-bf3f8b2d8031.png)

#最後に
製作者様のサイトがあるので、詳しい操作などはこちらは参考にしてください。
https://chigusa-web.com/clibor/


以上です～。知ってしまったあなたはもう虜です。
社会人エンジニアがatcoderで茶色を目指す#5

##先人達が残してくれた資料
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-10-%E5%95%8F)

「ここまで解いたら」から挑戦していきます。

##[B - Minesweeper](https://atcoder.jp/contests/abc075/tasks/abc075_b)
問題文はAtcoderを参照してください。
この問題をみた時、

- H,Wは50以下なのでint型
- 全探索

```python
H, W = map(int,input().split())
s=[]

for i in range(0, H):
    s.append(input())

for y in range(0, H):
    for x in range(0, W):
        c=0
        for dx in range(-1, 2):
            for dy in range(-1, 2):
                xx = x + dx
                yy = y + dy
                if 0<xx and xx<W and 0<yy and yy<H:
                    if s[yy][xx]=="#":
                        c+=1

        if s[y][x]=="#":
            print("#", end='')
        else:
            print(c, end='')
    print("")
```
WAでエラーです。30分ほど止まりました。

```python
if 0<=xx and xx<W and 0<=yy and yy<H:
```

デバッグ手法におけるリミットチェックは大事です。

##[C - Grid Repainting 2](https://atcoder.jp/contests/abc096/tasks/abc096_c)
問題文はAtcoderを参照してください。

- H,Wは50以下なのでint型
- 全探索

```python
H, W = map(int, input().split())
s=[]

for i in range(0, H):
    s.append(input())

ans="Yes"
for y in range(0, H):
    for x in range(0, W):
        if s[y][x]==".":
            continue

        c=0
        for d in range(-1, 2, 2):
            xx = x + d
            if 0<=xx and xx<W:
                if s[y][xx]=="#":
                    c+=1
            yy = y + d
            if 0<=yy and yy<H:
                if s[yy][x]=="#":
                    c+=1
        if c==0:
            ans="No"
print(ans)
```

問題文が過去最低の文章でした。
最高に分かりにくいです。

##[B - Two Switches](https://atcoder.jp/contests/abc070/tasks/abc070_b)
問題文はAtcoderを参照してください。

- BとC、AとDの関係、重なっているか
- 最大値と最小値の距離

```python
A, B, C, D = map(int, input().split())

ans=0

if A<C: A=C
if D<B: B=D

if B<C or D<A:
    ans=0
else:
    ans=abs(A-B)

print(ans)
```

##[B - Training Camp](https://atcoder.jp/contests/abc055/tasks/abc055_b)
問題文はAtcoderを参照してください。

最後に余りを計算するとTLEになります。
最後に余りを計算しても事前に計算しても同じ回答になることが分かります。

```python
N = int(input())
sum=1

for i in range(1, N+1):
    sum=(sum*i)%1000000007

print(sum)
```

##[B - AtCoDeerくんとボール色塗り](https://atcoder.jp/contests/abc046/tasks/abc046_b)
問題文はAtcoderを参照してください。

- 最初のボールはK通り
- 次のボールから同じ色を選べないのでKー1通り
- 上記の掛け算

```python
N, K = map(int, input().split())

sum=K
for i in range(1, N):
    sum=sum*(K-1)

print(sum)
```

##[B - Between a and b ...](https://atcoder.jp/contests/abc048/tasks/abc048_b)
問題文はAtcoderを参照してください。

- b以下のxの倍数から　a未満のxの倍数を引くことで計測できる

```python
A, B, X = map(int, input().split())

ans=(B//X) - ((A-1)//X)

print(ans)
```
go langの文字列操作 決定版？


```
package main

import(
"fmt"
"strings"
"sort"
)

func main() {
	integer := "12345"
	str := "abcd"

	//取得
	fmt.Println(integer[0]) //rune番号
	fmt.Println(string([]rune(str)[0])) //a
	fmt.Println(str[0:1]) //a
	fmt.Println(str[0:2]) //ab
	str += ""
	str += "e"
	fmt.Println(str) //abcde
	fmt.Println(len(str)) //5  空文字はlengthには加算されない

	//最後の要素
	fmt.Println(str[len(str)-1])  //rune 101
	fmt.Println(string([]rune(str)[len(str)-1])) //e
	fmt.Println(str[len(str)-1:]) //e
	fmt.Println(str[len(str)-2:]) //de
	fmt.Println(str[:len(str)-1]) //abcd

	//sort
	str += "b"
	fmt.Println(str) //abcdeb
	s := strings.Split(str,"") //[]sliceになる
	fmt.Println(s) //[a b c d e b]
	sort.Strings(s)
	fmt.Println(s) //[a b b c d e]
	str = strings.Join(s,"")
	fmt.Println(str) //abbcde

	//削除
	//基本空文字を入れると消える + 一度 []stringへ変換する
	s= strings.Split(str,"")
	s[len(str)-1] = ""
	str = strings.Join(s,"")
	fmt.Println(str) //abbcd

	//置換
	s= strings.Split(str,"")
	s = append(s[:len(str)-1],"h")
	fmt.Println(s) //[a b b c h]
	s = append(s[:len(str)-2],"d")
	fmt.Println(s) //[a b b d]

    //初めの要素から入れ直す
	s = append(s[:0],"e")
	fmt.Println(s) //[e]
	s = append(s[0:],"x")
	fmt.Println(s) //[e,x]
	str = strings.Join(s,"")


	str = "abcde" 	//一度戻す
	fmt.Println(str) //abcd
	s = strings.Split(str,"")
	s = s[:len(s)-1] //末尾削除
	fmt.Println(s) //[a b c d]
	s = append(s[:1],s[2:]...) 	//bのみ削除
	fmt.Println(s) //[a c d]
}

```
実行中のCloudFormationのスタックをマネコンっぽく表示するスクリプト

CloudFormationでいろいろ試行錯誤しているとマネコンからポチポチしてるのがいい加減面倒になってきて、CLIでcreate-stackとかdelete-stackしたくなる。でも結果をいちいちコマンド叩いてJSON読んだりするのも面倒だし、そこだけマネコン見てポチポチリロードボタン叩くのもなぁ、なので、サクッと作成。pythonはこれが30step以内に書けちゃうお手軽さがいいね……。

boto3, tabulateあたりは標準では入っていないので```pip install```しておくこと。
boto3については[この辺](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-python3-boto3/)のサイトも参考に。

```python
import os
import sys
import time
import boto3
import pprint
from tabulate import tabulate

args = sys.argv

client = boto3.client('cloudformation')

stackstatus = ""

while stackstatus != 'CREATE_COMPLETE':
  os.system('clear')

  response = client.describe_stacks(StackName=args[1])
  stacks = response['Stacks']
  stackstatus = stacks[0]['StackStatus']

  response = client.describe_stack_events(StackName=args[1])
  events = response['StackEvents']
  events.sort(key=lambda x:x['Timestamp'])

  rows = []
  for keys in events:
    cols = []
    cols.append(keys['Timestamp'])
    cols.append(keys['LogicalResourceId'])
    cols.append(keys['ResourceStatus'])
    rows.append(cols)

  headers = ['Timestamp', 'LogicalResourceId', 'Status']
  table = tabulate(rows, headers)
  print(table)

  if stackstatus != 'CREATE_COMPLETE':
    time.sleep(10)
```

実行してみると、↓この画面が…
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/2c564873-462c-881d-6e2e-7d8a1e98af2f.png)

こうだ！コンソールだと、上に新しいレコードが来ると流れてしまうから、表示を逆順にしている。

```
Timestamp                         LogicalResourceId           Status
--------------------------------  --------------------------  ------------------
2020-05-10 10:47:57.928000+00:00  ApigwTest-issue01-Pipeline  CREATE_IN_PROGRESS
2020-05-10 10:48:02.269000+00:00  CODEBUILDLOGGROUP           CREATE_IN_PROGRESS
2020-05-10 10:48:02.699000+00:00  S3BUCKET                    CREATE_IN_PROGRESS
2020-05-10 10:48:02.789000+00:00  CODEBUILDLOGGROUP           CREATE_IN_PROGRESS
2020-05-10 10:48:03.178000+00:00  CODEBUILDLOGGROUP           CREATE_COMPLETE
2020-05-10 10:48:04.363000+00:00  S3BUCKET                    CREATE_IN_PROGRESS
2020-05-10 10:48:25.539000+00:00  S3BUCKET                    CREATE_COMPLETE
2020-05-10 10:48:27.772000+00:00  CODEBUILDIAMROLE            CREATE_IN_PROGRESS
2020-05-10 10:48:29.158000+00:00  CODEBUILDIAMROLE            CREATE_IN_PROGRESS
2020-05-10 10:48:45.746000+00:00  CODEBUILDIAMROLE            CREATE_COMPLETE
2020-05-10 10:48:49.115000+00:00  CODEBUILD                   CREATE_IN_PROGRESS
2020-05-10 10:48:51.445000+00:00  CODEBUILD                   CREATE_IN_PROGRESS
2020-05-10 10:48:52.222000+00:00  CODEBUILD                   CREATE_COMPLETE
2020-05-10 10:48:54.622000+00:00  PIPELINE                    CREATE_IN_PROGRESS
2020-05-10 10:48:55.360000+00:00  PIPELINE                    CREATE_IN_PROGRESS
2020-05-10 10:48:55.853000+00:00  PIPELINE                    CREATE_COMPLETE
2020-05-10 10:48:57.646000+00:00  ApigwTest-issue01-Pipeline  CREATE_COMPLETE
```
C++の文字列処理が酷いので、なんとかした案件

#c++の文字列処理酷くないですか？

##最初の過ち
char配列に格納された文字列をstringに変換する処理を書いていました。
char配列に入れる文字列は、shortの配列に格納されたbit列を、reinterpret_castで持ってきたものです。

```hoge.cpp
int num = 32;

//文字を入れるための、可変長のデータ領域を確保
char *char_array1 = new char[num]{0};
char *char_array2 = new char[num]{0};

//配列に文字を格納する
for(auto i = 0; i < num; i++) {
    char_array1[i] = '0' + i; //
}
for(auto i = 0; i < num; i++) {
    char_array2[i] = '0' + i; //
}

// char_array1をstring型に変換したい
std::string output_string = char_array1;

//char_array1だけを出力したい
std::cout << output_string << "\n";
//出力：　0123456789:;<=>?@ABCDEFGHIJKLMNO0123456789:;<=>?@ABCDEFGHIJKLMNO
```
こちらのソースコードを実行すると、char_array1の内容だけを出力したいにもかかわらず、char_array2の内容も出力されてしまう。

原因は、char_arrayにNULL終端が無いために、stringに変換する時に次の領域まで見てしまっています。

多くのC言語のchar配列文字の関数は、NULL終端をデータ列の最後と認識します。


```
std::string output_string = char_array1;
```
2つの配列の領域が連続しているため、char_array2の内容まで出力処理が走ってしまいます。

##二つ目の過ち

それならばと、下記のコードのように、stringに変換する時に配列に対して十分に大きい要素数を指定するようにしました。

```
std::string output_string(char_array1,100);
```

```
#出力結果
0123456789:;<=>?@ABCDEFGHIJKLMNO0123456789:;<=>?@ABCDEFGHIJKLMNOU\220U
```
何か変なものが出力についてきます。
これは、要素数を指定した事で、char配列にNULLが入っていたとしても、それがそのままNULLを含んだ文字が出力されていました。


##考察
そもそも、char[]にはサイズを持っていないので、NULL終端をつけるにも、終端を見つけるのができない？
Cでは、配列を扱うときはサイズも一緒に扱うのは常識だが、文字列扱うたびに、配列サイズも同時に受け渡すのは少し面倒。
あと、newした配列をdeleteしないといけないのも、よくよく考えると面倒。

##私が考えた最強の文字配列

```
std::vector<char> vsting;
```
vectorで管理すればいいじゃーん
配列長を管理しなくてもいいし、
new使わないから解放しなくてもいいしー

Stringでも同じことができるけど、メモリー領域が連続している保証は無いし、NULL文字の扱いがちょっと危険だなと思ったので

vectorで書き直すと、下記のようになります。

```hoge.cpp
int num = 32;

//文字を入れるための、可変長のデータ領域を確保
std::vector<char> char_array1(num);
std::vector<char> char_array2(num);

//配列に文字を格納する
for(auto i = 0; i < num; i++) {
    char_array1[i] = '0' + i; //
}
for(auto i = 0; i < num; i++) {
    char_array2[i] = '0' + i; //
}

// char_array1をstring型に変換したい
//要素数の入力不要！！
std::string output_string(char_array1.begin(),char_array1.end());

//char_array1だけを出力できる。
std::cout << output_string << "\n";
//出力：　0123456789:;<=>?@ABCDEFGHIJKLMNO
```
## 参考文献
- [vectorで表現するstring。 - erio_nk://memo](https://erio-nk.hatenadiary.org/entry/20090702/1246547140)
- [vector配列](http://7ujm.net/stl/vector.html)
- [std::vector<char>をstd::stringやchar*に変換する - 銀の人のメモ帳](https://gin0606.hatenablog.com/entry/2013/12/12/162218)
- [文字列はNULL終端させる　――C/C++セキュアコーディング入門（3）：CodeZine（コードジン）](https://codezine.jp/article/detail/4644)
WSLの標準出力の内容をWindowsのクリップボードに流し込む

Windows 標準の `clip` コマンドを使う

たとえば、以下のように `ls` コマンドの実行結果をパイプで `clip.exe` コマンドに渡す。

```bash
ls | /mnt/c/Windows/System32/clip.exe
```

## 参考

* [【Windows 10対応】コマンドラインからクリップボードへデータを受け渡しする：Tech TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/1903/14/news060.html)
PMP試験に出てくるProcurement Documentationを覚えよう

# Procurement Documentationとは
調達用のドキュメントのこと

## PMBOKのどこにでてくるのか

PMBOKガイドの`485ページ`の`12.2.1.3 Procurement Documentation`にでてくるよ

# どんなドキュメントがあるのか

## RFI (Request For Information)
- 情報提供依頼書
- RFIテンプレート例
    - https://rfp360.com/rfi-templates-examples/

## RFP (Request For Proposal)
- 提案依頼書
- RFPテンプレート例
    - http://templatelab.com/request-for-proposal/

## RFQ (Request For Quotation)
- 見積依頼書
- RFQテンプレート例
    - http://templatelab.com/request-for-quote/

## SOW (Statement of Work)
- 作業範囲記述書
- SOWテンプレート例
    - https://www.wordtemplatesonline.net/statement-of-work-sow-templates/


----

よかったよかった
【Gradle】をWindows10にインストール

#gradleをWindows10にインストールする手順を紹介します。

#目次
*  [1. ダウンロード](#1ダウンロード)
*  [2. フォルダ格納](#2フォルダ格納)
*  [3. 環境変数登録](#3環境変数登録)
*  [4. コマンド確認](#4コマンド確認)

#1.ダウンロード
以下のサイトからダウンロードします。
https://gradle.org/install/

Installing manually ->  Completeをダウンロードします。
※2020/05/10時点での最新はgradle-6.4でした。140Mbと結構重いです。。

#2.フォルダ格納
公式サイトによると、以下の手順で行うようです。
　2-1.Cドライブに「Gradle」フォルダを作成します。
　2-2.ダウンロードして解凍したフォルダを格納します。
　※イメージは「C:\Gradle\gradle-6.4」となります。

#3.環境変数登録
　3-1.環境変数設定を開きます。
　※「コントロール パネル->システムとセキュリティ->システム->システムの詳細設定->環境変数」

　3-2.システム設定変数にgradleを新規登録します。
　　変数名：GRADLE_HOME
　　変数値：C:\Gradle\gradle-6.4


　3-2.システム設定変数のPathにgradleを追加登録します。
　　変数値：%GRADLE_HOME%\bin

#4.コマンド確認
コマンドプロンプトを起動し、「gradle -version」をコマンド操作します。

```
rem gradle バージョン確認コマンド
gradle -version

------------------------------------------------------------
Gradle 6.4
------------------------------------------------------------

Build time:   2020-05-05 19:18:55 UTC
Revision:     42f7c3d0c3066b7b38bd0726760d4881e86fd19f

Kotlin:       1.3.71
Groovy:       2.5.10
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          1.8.0_181 (Oracle Corporation 25.181-b13)
OS:           Windows 10 10.0 amd64

```

gradleのバージョンが確認できれば、OKです。
※サンプルのバージョンは6.4
ネストしているモデルに対するform_withの書き方

#ネストしているモデルに対するform_withの書き方

ネスト関係にある投稿記事(Postモデル)とコメント(Commentモデル)でcommentを投稿するformファイルでエラーが発生した際の対処法をまとめます。

```ruby:routing
resources :posts do
     resources :comments
  end
```
```ruby:問題のコード_form
<%= form_with(model: comment) do |form| %>

  <div class="field">
    <%= form.label :content %>
    <%= form.text_field :content %>
  </div>

  <%= form.hidden_field :post_id, value: post.id %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

```
comments_pathというパスが見つからないというエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526570/f195cb12-b168-8a30-da8c-9ddbe0292e3a.png)





## 目次
* [動作環境](#動作環境)
* [結論](#結論)
* [学んだこと](#学んだこと)
* [参考サイト](#参考サイト)

## 動作環境
`OS : macOS Mojave 10.14.6`
`ruby : 2.6.3p62`
`rails : 5.2.4`

##結論

form_withにネストとされている親子関係のモデルを複数書きます。
今回のケースだとpostとcomment

```ruby:_form
<%= form_with(model:[post,comment]) do |form| %>

  <div class="field">
    <%= form.label :content %>
    <%= form.text_field :content %>
  </div>

  <%= form.hidden_field :post_id, value: post.id %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

```
このように書くことで以下のようにhtmlタグが`posts/:post_id/comments`とネスト構造になります。

```html

<form action="/posts/15/comments" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="authenticity_token" value="VYYDGENgBUvhCfkdZ0cISyrVi+O9nm+9/4LLwBKk4oHqE4njwC5UDXGrsCNsfYGrEOFBkfXDW+vNcasczK+yVw==">
```

## 学んだこと

今回の件で以下のことを学びました。
__1. (基本)form_withのmodelには登録対象となるmodel名を入れる__
コントローラーで作成したインスタンスがnewメソッドで新たに作成されて何も情報を持っていなければ自動的にcreateアクションへ、findメソッドなどで作成され、すでに情報を持っている場合はupdateアクションへ自動的に振り分けられます。
__2. ネストされているルーティングの場合は親子それぞれのモデルを記述する__

## 参考サイト
以下のサイトで詳しく解説されていました。
https://pikawaka.com/rails/form_with
LaravelでJSONを返す

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

# Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにjson1メソッド、json2メソッドを追記

```
    public function json1(Request $request)
    {
        return view('sample.json');
    }

    public function json2(Request $request)
    {
        $data = [
            'a' => $request->input('a'),
            'b' => $request->input('b')
        ];
        return $data;
    }

```

配列をreturnするようにします


(2) /sample/routes/web.phpに下記を追記
`Route::get('sample/json1', 'SampleController@json1');
Route::post('sample/json2', 'SampleController@json2');`


# viewの作成
/sample/resources/views/sample/json.blade.phpファイル作成

```json.blade.php
<html>
    <head>
        <title>sample</title>
        <script type="text/javascript">
            function ajax(){
            	var form = document.getElementById("sampleForm");
            	var req = new XMLHttpRequest();
            	req.open(form.method, form.action);
            	req.responseType = 'json';
            	req.send(new FormData(form));
            	req.onload = function () {
            		var json = req.response;
            		alert("a:" + json['a'] + "\n" + "b:" + json['b']);
            	}
            }
        </script>
    </head>
    <body>

        <form id="sampleForm" action="{{ url('sample/json2') }}" method="post"  onsubmit="ajax(); return false;">
            @csrf
            <input type="text" name="a" >
            <input type="text" name="b" >
            <input type="submit" >
        </form>

    </body>
</html>

```

# 動作確認
`http://localhost/laravelSample/sample/json1`

インプットフォームに値を適当に入力して送信ボタンをクリック
インプットフォームに入力した値がalertで表示された

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238103/68fd4f6a-dab3-dce0-d66c-8afc2a09db78.png)
iOS 13以降 iPadのUserAgentに注意 (WKWebView)


Xcode 11 でビルドしたWebViewのUserAgentのデバイスごとの比較です。
注目したいのは iOS 13.0 iPad 9.7 インチ以上のUserAgentで、iPadではなくMacintoshとなっています。


## UserAgent

iOS 13.0 iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 13_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

iOS 13.0 iPad mini 5
Mozilla/5.0 (iPad; CPU OS 13_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

__iOS 13.0 iPad 9.7 インチ以上__
__Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)__


iOS 12.4 iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

iOS 12.4 iPad mini
Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

iOS 12.4 iPad 9.7 インチ以上
Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

## 問題
このMacintosh UserAgentを2020年5月時点でいまだに認識していないサイトがあります。
`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)`

### Twitter

![Screen Shot 2020-05-10 at 19.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/39b9414d-bfab-f141-925f-01ad235ef2b2.png)

### YouTube

![Screen Shot 2020-05-10 at 19.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/17e072c0-12c4-d9e9-9bff-65b635f3d55c.png)

一応、iPad版SafariのUserAgentで上書きすると上記の警告を消すことができます。

```swift
webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15"
```


## 原因
iPad mini以外のiPadがMacintoshのUserAgentとなる原因がiOS 13から追加された `WKWebpagePreferences` です。

```swift
@available(iOS 13.0, *)
open class WKWebpagePreferences : NSObject {
    @available(iOS 13.0, *)
    open var preferredContentMode: WKWebpagePreferences.ContentMode
}

extension WKWebpagePreferences {
    @available(iOS 13.0, *)
    public enum ContentMode : Int {
        case recommended = 0
        case mobile = 1
        case desktop = 2
    }
}
```

WKWebpagePreferences.ContentModeの
`recommended` はiPad mini以外のiPadを `desktop` として認識し、それ以外のデバイスを `mobile` として扱うようです。

## 対策

もしiPad mini以外のiPadを `mobile`として認識させたい場合は以下のようにします。

```swift
    @available(iOS 13.0, *)
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) {
        // preferences.preferredContentMode デフォルト値は .recommended
        preferences.preferredContentMode = .mobile
        //decisionHandler(.cancel, preferences)
        decisionHandler(.allow, preferences)
    }
```


iOS 13.0 iPad 9.7 インチ以上
`preferences.preferredContentMode = .mobile`
Mozilla/5.0 (iPad; CPU OS 13_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

iOS 13.0 iPhone
`preferences.preferredContentMode = .desktop`
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)


早くTwitterとYouTubeがサポートしてくれるといいな。
Swift：乱数の備忘録


##バージョン

・Xcode11.4.1
・Swift5

##概要
ランダムな数字を出力する

##コード

```swift:test.swift
//ランダム関数で0〜4のうちひとつを出力する
let imageNumber = Int.random(in: 0...4)
print(imageNumber)
//出力結果
//0or1or2or3or4のどれかひとつ
```

##参考にさせて頂いた記事
[【Swift】乱数を生成する方法](https://capibara1969.com/2033/)
PMP試験に出てくるProcurement Termsを覚えよう！

# Procurement Termsとは
調達系の用語のこと

## PMBOKのどこにでてくるのか
PMBOKガイドの`482ページ`の`12.2 Conduct Procurements`と調達系の一般用語が試験にでるぞ

# どんな用語がでるのか

## Contracts（契約）

- 契約の５つの成立要件
    - 申込（Offer）
    - 承諾（Agreement）
    - 約因（Consideration）
    - 契約能力（Capacity）
    - 合法性（Legitimacy）

## Cost reimbursable contracts
コストプラスフィー契約（実費償還契約）

## Fixed-price (lump-sum contracts)
ランプサム契約（一括請負契約）

## Time and materials contract
タイム・アンド・マテリアル契約（T＆M契約）
単価のみが確定している契約

## Purchase order
発注書（注文書、購買指示書など）

## Letter of intent
- LOI（Letter Of Intent）基本合意書
- MOU（Memorandum of Understandings）予備的合意書と同じ

## Letter contract
単価など未決定な状態で正式契約前に作業開始できるよう緊急に使われる

## Bidder conference
入札者会議

----

よかったよかった
【対策まとめ】 「/tmp/mysql.sock' (2)」「ERROR! The server quit without updating PID file」

#参考文献
- [「ERROR! The server quit without updating PID file」となり、MacOSでmysqlにアクセスできない。](https://qiita.com/furafura_nau/items/7d8f5370899df125d459)
- [mysqlが起動できない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）](https://qiita.com/carotene4035/items/e00076fe3990b9178cc0)
- [mysqlがどうしても起動しない](https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc)
- [mysql起動で「The server quit without updating PID file」](https://qiita.com/mogetarou/items/e34ca51d3756d55d7800)
- [MySQL起動できなくなった　The server quit without updating PID file](https://qiita.com/yuki0208/items/1d5554d98e9ec76084bd)
- [MacでHomebrewを使ってinstallしたMySQL5.6とMySQL5.7を切り替えて使う](https://qiita.com/t_oginogin/items/76ca2b6ce18d53988dc3)

#Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

####【原因】 mysql.sockファイルがない

```
$ sudo touch /tmp/mysql.sock
```

#Can't connect to local MySQL server through socket '/tmp/mysql.sock'(38)

####【原因】 ディレクトリ権限 + MySQLサーバ起動が必要
```
$ sudo chown mysql:mysql /tmp
$ sudo mysql.server start
```

#ERROR! The server quit without updating PID file

####【ケース１】 権限不足パターン
```
$sudo chown -R _mysql:_mysql /usr/local/var/mysql
```

####【ケース２】 PIDファイル生成パターン
```
$ /usr/local/var/mysql/mysql > touch /usr/local/var/mysql/****.local.pid
```

####【ケース３】PID削除/MySQLサーバ再起動パターン
```
$ ps -ef | grep mysql
$ sudo kill -9 PID 
$ sudo mysql.server start
```

####【ケース４】シンボリックリンク再設定パターン
```
$ brew unlink mysql       
$ brew install mysql       #バージョン指定も可
$ brew link mysql
```

####【ケース５】local配下削除 + MySQL再インストール + PATH指定  ※１番有力説

####１. local配下全削除
```
sudo rm -rf /usr/local/mysql
sudo rm -rf /Library/StartupItems/MYSQL
sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
sudo rm -rf /Library/Receipts/mysql-.pkg
sudo rm -rf /usr/local/Cellar/mysql*
sudo rm -rf /usr/local/bin/mysql*
sudo rm -rf /usr/local/var/mysql*
sudo rm -rf /usr/local/etc/my.cnf
sudo rm -rf /usr/local/share/mysql*
sudo rm -rf /usr/local/opt/mysql*
sudo rm -rf /usr/local/mysql*
sudo rm ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
```

####２. MySQL再インストール
```
$ brew install mysql
```

####３. PATH指定
```
$ echo 'export PATH="/usr/local/opt/mysql@X.X/bin:$PATH"' >> ~/.bash_profile   
```

####４. PATH位置でMySQL再起動　　
```
$ /usr/local/opt/mysql@X.X/bin/mysql.server start
```
Visual StudioでPythonの標準ライブラリをデバッグする方法

Visual StudioでPythonの標準ライブラリをデバッグする方法が分かりましたので、メモ書きしておきます。

##手順
※Visual Studio Community 2019で確認しました。

1.メニューから「デバッグ⇒オプション」を選択。
オプションダイアログを開く。

2.ツリーの「Python⇒デバッグ」を選択。

3.「Pyhton 標準ライブラリのデバッグを有効にする」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493607/0c33dd35-447b-7fd9-44b8-f2bbe45b6046.png)
Seleniumを使って自動でツイートをしてみる。

twitterのbotを作ってみたいなぁと思い色々調べてみました。
twitter APIを取得するのは面倒なのでseleniumによって自動ツイートすることを目指します。

### 参考サイト
- [Selenium公式](https://www.selenium.dev/)
- [【Python】Seleniumを使ってTwitterを自動化してみる。](https://mahimahironron.hateblo.jp/entry/2020/04/01/%E3%80%90Python%E3%80%91Selenium%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6Twitter%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82)

### 方法
以下のようなスクリプトを書いて実行するだけ。
アカウントとパスワードは適宜自分のもので書き換えてください。

```python
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

# アカウント情報
account = 'xxxxxxxxxxx'
password = 'xxxxxxxxxxx'

# ツイートしたい文字列
text = "テストツイート"

# Twitterログイン実行する処理
def login_twitter():
    # ログインページを開く
    driver.get('https://twitter.com/login/')
    time.sleep(2)  # 待ち
    # account入力
    element_account = driver.find_element_by_name("session[username_or_email]")
    element_account.send_keys(account)
    time.sleep(2)  # 待ち
    # パスワードを入力する
    element_pass = driver.find_element_by_name("session[password]")
    element_pass.send_keys(password)
    time.sleep(3)  # 動作止める
    # ログインボタンクリック
    element_login = driver.find_element_by_xpath('//*[@data-testid="LoginForm_Login_Button"]')
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    element_login.click()
    time.sleep(3) # 待ち

def send_tweet(text):
    element_text = driver.find_element_by_class_name("notranslate")
    element_text.click()
    element_text.send_keys(text)
    tweet_button = driver.find_element_by_xpath('//*[@data-testid="tweetButtonInline"]')
    tweet_button.click()

# seleniumを起動
options=Options()
driver=webdriver.Chrome(chrome_options = options)

# ログイン処理
login_twitter()
# ツイートする
send_tweet(text)
time.sleep(10)
# seleniumを終了
driver.close()
driver.quit()

```
Ubuntu20.04でログインループにハマッたときの対処方法

①ログイン画面で「Ctrl+Alt+F3」
②CUIで自分のアカウントでログイン
③「sudo vi /etc/gdm3/custom.conf」
④AutomaticLoginEnableを「true」から「false」に変更し保存
⑤「reboot」
⑥手動ログインできるはず
[ハッシュ]**を使ったハッシュの展開





技術書でハッシュについての学習をする中で、
ハッシュの展開方法を学んだのでまとめてみました。


***
```
#下準備として、rails consoleのsandbox環境を開く
rails c --sandbox
```


```
＃ズームインのアイドル、そらじろうの特徴をハッシュにして、変数sorajiroに代入

pry(main)> sorajiro　= { color: 'blue', type: 'animal', nationality: 'japan' }
=> {:color=>"blue", :type=>"animal", :nationality=>"japan"}
```
```
#sorajiroのキーと値を**で展開させる

pry(main)> { sex: 'male',**sorajiro }
=> {:sex=>"male", :color=>"blue", :type=>"animal", :nationality=>"japan"}
```
ハッシュsorajiroを展開することができた。

```
#sorajiroのキーと値を**_なし_で展開させる

pry(main)> { sex: 'male',**sorajiro }
SyntaxError: unexpected '}', expecting =>
{ sex: 'male',sorajiro }

                       ^
```

上記のように** **を付けない場合は、構文エラーになります。**


###**の代わりにmergeメソッドを使っても同じ結果になる

```
pry(main)> sorajiro= { color: 'blue', type: 'animal', nationality: 'japan' }
{sex: 'male'}.merge(sorajiro)
```
***



Rubyの式展開の形は、#{sorajiro}の文字列の展開しか知らなかったので、一つ知見が増えました。



>プロを目指す人のためのRuby入門
P5.js 日本語リファレンス(getURLParams)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の getURLParam関数を説明します。

## getURLParams()

### 説明文

現在のURLパラメータをオブジェクトとして取得します。

### 構文

getURLParams()

### 戻り値

オブジェクト：URLパラメータ


### 例

```javascript
//例：http://p5js.org?year=2014&month=May&day=15

function setup(){
   let params = getURLParams();
   text(params.day, 10, 20);  // "15"
   text(params.month, 10, 40); // "May"
   text(params.year, 10, 60);  // "2014"
}
```



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
【機械学習】Kullback-Leibler Divergence とは?


２つの確率分布を比較するのに使われる、「**Kullback-Leibler Divergence (カルバック・ライブラー情報量)** 」について勉強してみました。


あるクラスの生徒の身長データを例とします。
下の図で、青い棒グラフが計測された生徒の身長の分布、オレンジのラインが推測モデルをそれぞれ表しているとします。
では、この測定データの分布と推測モデルでどれくらいズレがあるのでしょうか？
このズレ(error)を図るのに、**それぞれの情報量の差**を計算することができます。ここで **Kullback-Leibler Divergence (KL Divergence)** が登場します。

![download (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/35c6c625-b108-ee51-bffa-060039dd791d.png)

### 情報エントロピー
KL divergence を計算するためには **Entropy (エントロピー)** の概念を知る必要があるので、軽くおさらいします。

情報エントロピーは以下の式で定義されます。

```math
H=-\sum_{i=1}^{N} p\left(x_{i}\right) \cdot \log p\left(x_{i}\right)
```

```math
=\sum_{i=1}^{N} p\left(x_{i}\right) \cdot \log 1/p\left(x_{i}\right)

```
p(x) をある事象が起こる確率とした時、1/p(x) はその事象が起きた時に得られる情報量を表します。例えば、ある生徒の身長は 150cm、160cm、170cmのいずれかであり、それぞれ確率が 1/2, 1/4, 1/4 だとします。この時、その生徒の身長が150cmであるとわかった時に得られる情報量は 1/(1/2) = 2となります。160cmであるとわかった時は、1/(1/4) = 4となります。このように、起こる確率が低い事象ほど、得られる情報量が大きくなります。エントロピーではこの情報量のlog2をとることで、その**情報を表すために何ビット必要か** という形に置き換えます。これを全ての事象に対する平均、つまり期待値をとったのが情報エントロピーになります。

### エントロピーの損失
KL divergence では 観測データの分布 p(x)のエントロピーから と推定モデル q(x) のエントロピーを引くことで、**どれくらい情報が失われたか** を計算します。

```math
D_{K L}(p \| q)=\sum_{i=1}^{N} p\left(x_{i}\right) \cdot\left(\log p\left(x_{i}\right)-\log q\left(x_{i}\right)\right)
```

```math
=\sum_{i=1}^{N} p\left(x_{i}\right) \cdot \log \frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}

```


身長の例を使うと、

```math
D_{K L}(Original \|Estimated ) = 0.3
```
だった時、推定モデルでは、観測分布よりも 0.3 情報の損失があると言えます。

### divergence は距離ではない

divergence は一見距離行列とも考えられそうですが、$D_{K L}(p \| q)$ と $D_{K L}(q \| p)$ では違う値をとるので、厳密には距離ではありません。

### 機械学習での応用
KL divergence は **Variational Autoencoder (VAE)** などで損失関数としてモデルの最適化に利用されています。

----
#### 参照:
* https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained
* https://towardsdatascience.com/the-intuition-behind-shannons-entropy-e74820fe9800
P5.js 日本語リファレンス(getURLPath)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の getURLPath関数を説明します。

## getURLPath() 

### 説明文

現在のURLパスを配列として取得します。

### 構文

getURLPath() 

### 戻り値

- String[]：パスコンポーネント



### 例1

```javascript
function setup() {
   let urlPath = getURLPath() ;
   for(let i = 0; i <urlPath.length; i ++){
     text(urlPath [i], 10, i * 20 + 20);
   }
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/q2WohyJ_O


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(getURL)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の getURL関数を説明します。

## getURL() 

### 説明文

現在のURLを取得します。

### 構文

getURL() 

### 戻り値

String：URL


### 例

```javascript
let URL;
let x = 100;

function setup() {
   fill(0);
   noStroke() ;
   url = getURL() ;
}

function draw() {
   background(200);
   text(url, x, height / 2);
   x-- ;
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/lr_vJRg0j

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(displayDensity)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の displayDensity関数を説明します。

## displayDensity() 

### 説明文

スケッチが実行されている現在のディスプレイのピクセル密度を返します。

### 構文

displayDensity() 

### 戻り値

Number：ディスプレイの現在のピクセル密度


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(pixelDensity)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の pixelDensity関数を説明します。

## pixelDensity() 

### 説明文

高ピクセル密度ディスプレイのピクセルスケーリングを設定します。デフォルトでは、ピクセル密度はディスプレイ密度と一致するように設定されています。これをオフにするには pixelDensity(1) を呼び出します。引数なしで pixelDensity() を呼び出すと、スケッチの現在のピクセル密度が返されます。

### 構文

pixelDensity(val)

pixelDensity() 

### パラメタ

- val  
Number：ピクセルスケーリング値

### 例

```javascript
function setup() {
  pixelDensity(1);
  createCanvas(100, 100);
  background(200);
  ellipse(width / 2, height / 2, 50, 50);
}
```

### 実行結果
![pixelDensity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/46395e6f-96d1-bc06-a17e-ab6b925ff463.png)




### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
リレーの仕組みと動検をやってみる

# リレーとは
リレーとは、外部から電気信号を受け取り、電気回路のオン/オフや切り替えを行う部品のこと。
https://www.omron.co.jp/ecb/product-info/basic-knowledge-series/basic-knowledge-of-relays/part1/basics

つまり、スイッチのことである。一般的なスイッチとの違いは、入力を手動で行うか、電気信号で行うかどうかだ。

# リレーの仕組み
リレーにも、物理的な接点（スイッチ）をもつ「有接点リレー」と、「無接点リレー」があるが、有接点リレーのみ説明する。

有接点リレー（メカニカルリレー）は、以下の仕組みで動作する。
<img width="186" alt="リレー.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/91533308-5d1b-f089-e4cc-5eff9b2b9931.png">
[ON]
①端子A～端子Bに電流が流れる。
②コイルに電流が流れることで、電磁力により鉄片(「可動接点」と書かれた箇所)がコイルに吸引され、スイッチがONされる。

[OFF]
③端子A～端子Bに電流を流さない。
②コイルの電磁力がなくなることで、鉄片が離れ、スイッチがOFFされる。

#リレーのメリット
## ①スイッチの保護・感電防止	
操作スイッチに大きな突入電流が流れ、スイッチが発熱したり焼損するのを防ぐ。
そのようなスイッチを操作者から遠ざける。
## ②電力ロスの軽減	
バッテリーと電装品の間にリレーを置くことで、大電流の流れるコードを短くできる。
## ③異なる種類の電気信号の伝達	
DC電源でAC負荷も電気制御（開閉）できる
## ④1つの信号で複数の出力を出す
コイル部への１つの入力信号で、いくつもの独立した回路を同時に開閉（制御）できる

# リレーを使ってみる
実際のリレーを使って。動きを確認してみる。以下のリレーを使用した。
リレー：Ｙ１４Ｈ－１Ｃ－９ＤＳ
http://akizukidenshi.com/catalog/g/gP-02003/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/c443f8d7-b7e9-31bd-51d5-9f68ab27c15f.png)
青い枠の導線に電気を流すと、離れている赤い枠同士が導通する。

実験してみた。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">リレーの実験。カチッと音がなってるから成功だけど、想像より音が小さくてあまり気持ちよくない。 <a href="https://t.co/CGjUCZzWIH">pic.twitter.com/CGjUCZzWIH</a></p>&mdash; ダンブル扉 (@danburutobira) <a href="https://twitter.com/danburutobira/status/1256255940170412034?ref_src=twsrc%5Etfw">May 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

青枠の部分に電流を流して、リレー内のスイッチがカチッと鳴ることを確認した。

おわり。
P5.js 日本語リファレンス(fullscreen)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の fullscreen関数を説明します。

## fullscreen() 

### 説明文

引数を指定した場合、引数の値に基づいてスケッチを全画面表示にするかどうかを設定します。引数が指定されていない場合、現在のフルスクリーン状態を返します。ブラウザの制限により、これはユーザー入力時にのみ呼び出すことができることに注意してください。たとえば、以下の例のようにマウスを押したときだけです。

### 構文

fullscreen([val])

### パラメタ

- val  
Boolean：スケッチを全画面モードにするかどうか(オプション)

### 戻り値

- Boolean：現在の全画面の状態

### 例

```javascript
//ボックスをクリックすると, 全画面表示のオンとオフが切り替わります。
function setup() {
  background(200);
}

function mousePressed() {
  if(mouseX> 0 && mouseX <100 && mouseY> 0 && mouseY <100){
    fs = fullscreen() ;
    fullscreen(！fs);
  }
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/LrWK_FSOc


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(height)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の height関数を説明します。

## height

### 説明文

描画キャンバスの高さを格納するシステム変数。 この値は createCanvas() の2番目のパラメータによって設定されます。 たとえば関数呼び出し createCanvas(320, 240) は height 変数を値240に設定します。createCanvas() がプログラムで使用されていない場合、高さの値はデフォルトで100になります。

### 構文

height


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(width)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の width関数を説明します。

## width

### 説明文

描画キャンバスの幅を格納するシステム変数。 この値は、createCanvas() の最初のパラメータによって設定されます。 たとえば createCanvas(320, 240) は、width変数を値320に設定します。createCanvas() がプログラムで使用されていない場合, widthの値はデフォルトで100になります。

### 構文

width


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
puts, print, pメソッド

ターミナルへの出力で多用される、puts, print, pメソッドのちがいについて、あやふやなところがあったので、
ここでそれぞれのちがいをまとめておきます。

|メソッド |出力後の改行|配列の表示|呼び出すメソッド|戻り値|
|------|----------|--------|-----------|-----|
| puts | あり      | 要素ごとに改行| to_s  | nil  |
| print | なし    | 改行しない| to_s     | nil  |
| p     | あり    | 改行しない | inspect | 引数のオブジェクト |

##putsメソッド
putsメソッドは改行を加えて、変数の内容やメソッドの戻り値をターミナルに出力します。
putsメソッド自身の戻り値はnilになります。

```console
irb(main):001:0> puts 123
123
=> nil

irb(main):002:0> a = [1, 2, 3]
=> [1, 2, 3]

irb(main):003:0> puts a
1
2
3
=> nil
```
##printメソッド
printメソッドは、改行を加えません。

```console
irb(main):004:0> print 123
123=> nil
```

##pメソッド
改行を加えて出力します。文字列を出力すると、その文字列がダブルクォーテーションで囲まれます。
また、引数で渡されたオブジェクトそのものがメソッドの戻り値になります。

```console
irb(main):005:0> p 'abc'
"abc"
=> "abc"

irb(main):006:0> a = [1, 2, 3]
[1, 2, 3]
=> [1, 2, 3]
```

## 参考にした文献

[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/4774193976/ref=cm_sw_em_r_mt_dp_U_shaUEbXSFD416)
UbuntuにPython3.xを入れる

UbuntuでPython環境を作る際の備忘録です。
Python3.x（投稿時点では3.8）のインストールコマンドです。

`$ sudo apt install python3.8`
Python3.8本体のインストール。
python3.8コマンドが使えるようになる。
.pyファイルを実行するのに必要。

`$ sudo apt install python3-pip`
Pythonのパッケージ管理ツールのインストール。
pip3コマンドが使えるようになる。
pythonの多種多様なライブラリをインストールするのに必要。
P5.js 日本語リファレンス(windowResized)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の windowResized関数を説明します。

## windowResized() 

### 説明文

windowResized() は、ブラウザウィンドウのサイズが変更されるたびに1回呼び出されます。これはキャンバスのサイズを変更したり、新しいウィンドウサイズに合わせてその他の調整を行ったりするのに適した関数です。

### 構文

windowResized() 

### 例1

```javascript
// ブラウザのウインドウサイズを変更すると、それに合わせて円のサイズが変わります。
function setup() {
  createCanvas(windowWidth, windowHeight);
}

function draw() {
  strokeWeight(windowWidth/20);
}

// ブラウザのウインドウサイズを変更すると、この関数が呼ばれます。
function windowResized() {
  resizeCanvas(windowWidth, windowHeight);
  ellipse(100, 100, windowWidth / 5);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/ah9gktG1U


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
マルチディスプレイ環境下でのDisplayFusionとペンタブの併用でペンタブが大幅に遅延する（XP-PEN）

表題の通りです。めちゃくちゃハマったので共有します。海外でも同様の症状があったようでフォーラムに投稿がありました。

ペンタブ自体が大きく遅延するので、ClipstudioだろうがPhotoshopだろうが関係ありません。ハイパーファッキン。

DisplayFusionは複数モニターでウィンドウを移動させたり、タスクバーを全てのモニターに表示できるwindowsの便利ツールです。

<a href="https://store.steampowered.com/app/227260/DisplayFusion/?l=japanese" target="_blank">Steam：DisplayFusion</a>

で、これがペンタブに悪さします。特にClipstudioやphotoshop使用時にバリバリ邪魔してきます。描写がめちゃくちゃ重くなる感じ。マウスはスムーズなのでスペックの問題ではありません。これが私だけの問題なのか、他環境でも再現するかは不明ですが、同症状での投稿がフォーラムにありました。

ペンタブに関しても、XP-PENのDECO01を使用していますが、他のペンタブがないのでペンタブが原因かどうかはわかりません。

<a href="https://www.displayfusion.com/Discussions/View/displayfusion-renders-clip-studio-unuseable/?ID=e1027235-63a1-437e-bd4d-13205eb839c1" target="_blank">DisplayFusion Renders Clip Studio Unuseable • Discussions • DisplayFusion by Binary Fortress Software</a>

で、この対処方法で直ったのでメモがてらおいておきます。

DisplayFusionの設定＞高度な設定＞Disable Application Hooks　を Disabledします。アプリケーションの監視を緩める設定らしい。

これで今のところ快適です。最悪、お絵かきしてるときはDisplayFusionを落とすことでも対応できると思います。