OmniAICreator/Qiita-1.07M huggingface dataset:
【SQL】LEFT JOIN の使い方（複数指定の方法も）

##LEFT JOINとは？

FROMで指定したテーブルのレコードを全て取得する。外部キーがNULLのレコードもNULLのまま実行結果に表示される。

###JOINとの違い

```JOIN```はFROMで取得したカラム、レコードを表示しない。対して```LEFT JOIN```はFROMで表示したレコード（外部キーを持つ子テーブル）を全て取得する。

要するにFROMで取得したカラムを表示するか、しないかの問題です。



###例題

playersテーブルにteamsテーブルに結合させて、playersテーブルのnameカラム、teamsテーブルのnameカラムを取得する。

テーブルは以下の通り。レコードは省略。


**playersテーブル**

|         id         |        name           |    goals    |   height     |  country_id      |     previous_team_id   |
|:-----------------|------------------:|:------:|:------:|:------:|:------:|
|                  |                   |        |        |        |        |
|                  |                   |        |        |        |        |
|                  |                   |        |        |        |        |


**teamsテーブル**

| id      |       name|       
|:-----------------|------------------:|
|              |               |
|            |             |
|              |               |



playersテーブルにteamsテーブルを結合させるので、playersテーブルが子テーブルで外部キーを持つ。
そしてteamsテーブルが親テーブルで主キーを持つ。

したがってSQL文にすると以下のようになる。


```
SELECT カラム名, カラム名
FROM 外部キーを持つ小テーブル 
left join 主キーを持つ親テーブル
on 小テーブル.外部キーのカラム = 親テーブル.主キーのカラム ;
```
カラム、テーブルを適合させると、

```
SELECT players.name , teams.name 
FROM players
left join teams
on players.previous_team_id = teams.id ;
```

となります。




##JOINとLEFTJOINを掛け合わせる方法


###例題

playersテーブルにcountriesテーブルとteamsテーブルを結合して、データを取得する。

テーブルは以下の通り。レコードは省略。

**playersテーブル**

|         id         |        name           |    goals    |   height     |  country_id      |     previous_team_id   |
|:-----------------|------------------:|:------:|:------:|:------:|:------:|
|                  |                   |        |        |        |        |
|                  |                   |        |        |        |        |
|                  |                   |        |        |        |        |


**teamsテーブル**

| id      |       name|       
|:-----------------|------------------:|
|              |               |
|            |             |
|              |               |

**countriesテーブル**

| id      |       name    |  rank |    
|:-----------------|------------------:|----:|
|              |               |           |
|            |             |
|              |               |         |

各テーブルの関係性を整理すると
playersテーブルにcountriesテーブルを結合させる
→playersテーブルは外部キーを持つ子要素、countriesテーブルは主キーを持つ親要素。

playersテーブルにteamsテーブルを結合させる
→→playersテーブルは外部キーを持つ子要素、teamsテーブルは主キーを持つ親要素。


となります。

日本語に置き換えると、

```
SELECT *
FROM 外部キーを持つ子テーブル
join 主キーを持つ親テーブル
on  子テーブル.外部キーを持つカラム名 = 親テーブル.主キーであるカラム名
left join 主キーを持つ親テーブル
on 子テーブル.外部キーを持つカラム名 = 親テーブル.主キーであるカラム名
```
となります。

SQL文にすると以下のようになります。

```
SELECT *
FROM players
join countries
on players.country_id  = countries.id
left join teams
on players.previous_team_id = teams.id;
```

teamsテーブルはleft joinを使っているので取得したデータの一番左側がteamsテーブルのデータになります。
React　メモ

#React.js
Reactの導入とメモ

## 環境構築
まずはNode.jsのインストール
次にnpmのインストール(yarnを使いたければインストール)

```
npmの場合
//Reactのプロジェクト作成　
$ npx create-react-app 作成したいディレクトリ名
```

```	
yarnの場合
//Reactインストール 
$ yarn global add create-react-app
//Reactのプロジェクト作成
$ create-react-app 作成したいディレクトリ名
```

```
//yarnで起動
$yarn start
//npmで起動
$npm start
```

## 1. React.jsとは
Facebook社が公開したUI構築のためのjsライブラリ
全てのReactコンポーネントは、自己のprops に対して純関数のように振る舞わねばならない


## 2.JSXとは
React.createElement関数
javaScriptの機能を全て備えた構文の拡張の為テンプレート言語とは異なる
ReactDOMはHTMLの属性ではなくキャメルケース (camelCase) のプロパティ命名規則を使用
※class→className
 
```js
class App extends React.Component{
  render() {
  //jsを書ける範囲
    return (
       <div>  { '中括弧内ならjsを書ける' } </div>
    );
  }
}
```
利点
インジェクション攻撃を防ぐ
jQueryと比べてDOMの管理が楽になる

## 3.props
properties(プロパティ)の略称
財産、性質と言う意味を持つ

読み取り専用で外部から注入される変数の事

## 4.stat　
状態と言う意味を持つ

props に似ているが、コンポーネントによって完全に管理されるプライベートなもの
そのコンポーネントが内部的に持っている状態のことで外部から注入できない


```js

//こんにちは と表示されるコード
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {name: ‘こんにちは’};
  }
  
  render() {
    return (
    	<div>
    	  <h1>{ this.state.name }</h1>
      </div>
    );
  }
}
```

## 5.Redux
ReactJSが扱うUIのstate(状態)を管理をするためのフレームワーク
ReduxはFluxの概念を拡張してより扱いやすく設計されもの

Reduxの基本設計3つの原則

- Single source of truth
アプリケーション内でStoreは1つのみとし、Stateは単独のオブジェクトとしてStoreに保持される
- State is read-only
Stateを直接変更することはできず、actionをStoreへdispatchすることでしかStateは変更できない。
- Mutations are written as pure functions
Stateを変更する関数(Reducer)はpureな関数にする

## 6. hooks
コンポーネントの中で呼び出されるHooksは
いつなんどきでも必ず同じ順番で同じ回数呼び出されること
python3.7でwebページ取得

#最初に
環境：macOS Catalina
　　　python3.7
　　　pipが使えるように。

会社の新人研修以来ほぼ１年ぶりにpythonでwebページ取得をやってみました。
2020年1月にpythonのサポートが切れたようで、最初の環境構築に非常に時間がかかりました。

今回は、東京電力の電力需要がCSV形式でサイト上に載っており、非常に簡単な内容でした。
スクレイピングをやるまでの練習としてぜひご利用ください。

環境構築の部分は省いて、完成した部分だけを記載します。

##今回のゴール
ゴール：[東京電力の過去の電力使用実績データ](https://www.tepco.co.jp/forecast/html/download-j.html)に記載のCSVファイルの取得
CSVファイルには、毎日、データが更新され、年ごとのファイルにデータがまとめられています。

こちらのCSVファイルは「juyo-20XX.csv」と年ごとに名前がつけられており、URLも年ごとにcsv名が違うだけでした。
そのため、以下の３点をfor文で回すように作りました。

1. datetimeの情報を取得して2016年から今年までの年ごとのCSV名をURLに代入
2. requestsを使ってURLからwebページを取得
3. 取得した情報をファイルに保存

#準備
##モジュールのインポート
最初にモジュールを２つインポートします。
requests：webページの取得
datetime：日付を取得

```python
#モジュールのインポート
import requests
import datetime
```

##for文で使うデータの準備

```python
#今年の西暦取得
today = datetime.date.today()
```

```python
#2016年から今年まで
year = list(range(2016, today.year+1, 1))
```

```python
#西暦を入れてURL取得準備
url_1 ='https://www.tepco.co.jp/forecast/html/images/juyo-' 
csv = '.csv'
```


#本番
```python
#for文回す
for i in year:  #年ごとに
    print(i)    #何年のデータを取得しているかわかるように
    url = url_1+str(i)+csv  #url
    r = requests.get(url)   #urlの内容取得
    f = open('juyo'+str(i)+csv,'w') #ファイルを年の名前をつけて新規作成（既に同じ名前がある場合はそのファイルを開く）
    f.write(r.text)        #ファイルにwebページの情報を上書き
    f.close()   #ファイルを閉じる
    print('OK') #取得で来たことを確認できるように

print('END')
```

#最後に
ここまでのコードを拡張子「.py」で保存し、ターミナルで実行すると実行したディレクトリにファイルが作られます。

###ターミナルでの実行例

今回はtelco.pyにここまでのコードを保存したことにします。
tepco.pyがあるディレクトリに移動するか、tepco.pyで指定する際にディレクトリの情報もつけましょう。

```terminal

python tepco.py

```


せっかく毎日定時更新されるデータなので、ここからcrontabやlaunchedで定期実行までやろうかと思いましたが、それはまたいつか。
WORKSPACESでPsEXECを使った話

# WORKSPACESでPsEXECを使う
はい皆さんこんにちは

結論から言うとこの記事は
Microsoftが無料提供しているPsEXECツールを使ってAmazonWorkSpacesの間でコマンドを実行する話です。

・WORKSPACESのFW穴あけ
・ログを取得するための共有設定
・PsEXECの実行
について語ります

# 詳細


環境：AmazonWorkSpaces
OS：WIN10

サーバーA・・・PsEXEC実行
IP：192.168.10.11
user:serverA
pass:passwordA

サーバーB・・・処理専用サーバ
IP：192.168.10.12
user:servserB
pass:passwordB

注意事項：
WORKDOCSを利用してPsEXECツールをサーバーAに格納します。

##PsEXECツールをWorkSpacesに配置します

PsEXEC：
https://docs.microsoft.com/en-us/sysinternals/downloads/psexec
WORKDOCS：
https://amazonworkdocs.com/ja/clients

転送ツールはWORKDOCSを利用する想定で、私はブラウザ経由で配置しました。
（AWSコンソール＞WORKDOCS＞利用中のURLをクリック）

##PsEXECツールのFW穴あけをします

デフォルトではWorkSpaces同士の通信は塞がっているため、以下の対応をします。

AWSのコンソール＞EC2＞セキュリティグループ＞説明が「Amazon WorkSpaces Security Group」のグループを選択します。

右下ペインのインバンドを選択し、編集から以下の３つを登録します。
・TCP 135番
・TCP 445番
・TCP 1025～65535番

画像のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/410e235f-6304-3afc-3e16-36c166f25f65.png" width=50%>


##サーバーBでバッチファイルの準備
今回は以下のファイルを作ります。
C:\ASD\ASD.bat
デフォルトではDドライブが見えているかと思いますが、どこでも良いです。

バッチファイルのサンプル：
echo %COMPUTERNAME% %DATE% %TIME% >>C:\ASD\ASD.txt

##共有フォルダ設定

今回はサーバーBのC:\ASDに対して共有フォルダを作ります。
フォルダ右クリック＞プロパティの共有タブから設定してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/01f817f6-0cd7-9f0a-b683-8e8b0a5f2e23.png" width=50%>

続いて、アクセス権限（読み取り/書き込み）も付与します。
この画像の例ではローカルにバッチユーザーを作っていますが、
[ディレクトリ名￥接続元のユーザー名]　を使ってもいいです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/371be808-d0a7-666f-fc4e-c217f83edcfa.png" width=50%>


##では試してみましょう
PsEXECを配置したサーバーAにログインします。
今回はコマンドプロンプトで行いますが、管理者権限で起動してください。

サーバーBのIPとアカウント情報を指定して、サーバーBのC:\ASD\ASD.batを起動します。
**PsExec.exe -u "bachuser" -p "passwordB" \\\\192.168.10.12 C:\ASD\ASD.bat**

ドメインアカウントで実行する場合はこうなります。
**PsExec.exe -u "workspace.local\serverB" -p "passwordB" \\\\192.168.10.12 C:\ASD\ASD.bat**
※ドメイン部分はご利用の「ディレクトリのDNS名」を確認してください。

初回起動時はこの画面になるのでAGREEしてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/67804aae-4632-eed0-11cb-fded3588d324.png" width=50%>

無事完了するとexited on IP ADDRESS with error code 0と表示されます。


##結果ファイルをサーバーAから開きます
先ほどの共有フォルダに繋ぎます。
サーバーAでエクスプローラーを立ち上げて
**\\\\192.168.10.12\asd**
を入力し、認証を済ませると利用できます。

こんなファイルが出来ていたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532987/648e6dfa-8bad-0c7d-41ff-4b3121920520.png)


##感想
やってる事一つ一つは大した事無いんですが、記事にすると結構大変で
自分の中で風化する前に書けて良かった。


**ありがとうございました。**
modelの保存と読み込みの覚書

モデルをJSON形式で保存
 
```python
# JSON形式
json_string = model.to_json()
```

モデルをも見込み再構築

```python
from keras.models import model_from_json
model = model_from_json(json_string)
```

重みの保存、読み込み

```python
fro mkeras.models import load_model
# HDF5形式のファイルを作成
model.save('model.h5')

#モデルの読み込み
model = load_model('model.h5')
```
AWSを使用するWebアプリケーションをデプロイして、アクセスするとBad Requestが出た時の対処

#この記事について
とあるDjango入門本を読んで、デプロイしてみたものの、アクセス時に躓いたので、後学のために残します。

##環境
####開発環境
OS : Windows10 pro
Python : 3.8
Django : 3.0.4
####本番環境
PostgreSQL : 11.5
EC2インスタンスへSSH接続ツール : PuTTY
Nginx
Gunicorn

##前提条件
デプロイ済みで、作成したWebアプリの稼働状況確認の段階とします。

##ソース
###settings.py
#####デプロイ時
```python

DEBUG = False
ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS')]
```
##環境変数
###.bash_profile
```
(…略…)
export ALLOWED_HOSTS=<Elastic IP> ←AWSのインスタンス情報から確認できます。
```
##実行
http://(Elastic IP)/ でアクセス... Bad Requestと表示される。

##対処法
自分の環境では、どうやら環境変数のALLOWD_HOSTSが読み込まれないようなので、settings.pyに直接記入しました。


```python

ALLOWED_HOSTS = ['127.0.0.1', '(Elastic IP)', '(EC2インスタンスのパブリックDNS(IPv4))']
```

おまじない程度にsourceコマンドで.bash_profileを更新後、Gunicornを再起動。
http://(Elastic IP)/ でアクセスすると行けました。

尚、独自ドメイン名でも、.bash_profile と settings.py のElastic IPの部分を独自ドメインに変更することでアクセスできました。

settings.pyを変更した際は、Gunicornの再起動を忘れないで下さい。

###参考文献
この記事は以下の情報を参考及び一部引用して執筆しました。

- [動かして学ぶ Python Django開発入門](https://www.shoeisha.co.jp/book/detail/9784798162508)
仕事で役に立った技術系ブログ記事

仕事柄いろいろな製品を使用した検証を行う。Google検索して見つけた、（私の）仕事に役に立った技術系ブログ記事のURLとそのエッセンスを抜粋した個人的備忘録。
#Windows系
#Linux系
##network系
###nmcli
とってもよくまとまっていて苦手意識が少し減った。
https://endy-tech.hatenablog.jp/entry/2018/09/08/140950#Device-%E3%81%A8-Connection

##ログ系
###rsyslog&logrotate

rsyslogを使用してCentOS上でログサーバを構築。
IPアドレス毎に保存先ファイルを分ける。
logrotateを使用してログを自動的にローテートする。

https://tech-mmmm.blogspot.com/2017/12/rsyslog-logrotate.html
https://nageyari.dig-it-all.jp/2008/02/logrotate.html

rsyslog設定ファイル : /etc/rsyslog.conf

```
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
$ModLoad imudp　　　　　←UDPによるSyslogメッセージ入力を許可
$UDPServerRun 514　　　←UDPの待ち受けポートを514に設定
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
:fromhost-ip, isequal, "192.168.33.31" -/var/log/t3031vy11.log
& ~
↑送信元IPアドレスに対して、出力先のログを指定。"& ~"を付けることで、直前の条件に一致したログを破棄する
```

以下のようなファイルを作成 /etc/logrotate.d/<ファイル名、名前は何でもOK>
中身

```
/var/log/<ローテート対象のログファイル> { ←ファイル名の指定にはワイルドカード使用可能
    missingok　　　　　　←ログファイルが存在しない場合でもエラーとしない
    notifempty　　　　　←ログファイルが空ならローテーションしない
    daily　　　　　　　　←日次で実行
    compress　　　　　　←圧縮。デフォルトではgzを圧縮コマンドとして利用
    rotate 5　　　　　　←5世代の過去ファイルを保管
    postrotate　　　　　←ローテーション後コマンド(次行～endscriptまで)を実行
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript　　　　　　←コマンドの終わり
}
```



#Mac系
#VMWare系
#その他
##PKI
###DERとPEM
https://qiita.com/kunichiko/items/12cbccaadcbf41c72735
DER:バイナリ
PEM:Base64でテキスト
##Qiita
###Qiitaマークアップチートシート
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
emacs dotinstallメモ

# Emacs入門
ドットインストールの[Emacs入門](https://dotinstall.com/lessons/basic_emacs)のメモです。
よく使われるテキストエディタです。

# 起動([#2](https://dotinstall.com/lessons/basic_emacs/10702))
```
$ emacs
$ emacs filename.txt
```

# ファイル操作([#3](https://dotinstall.com/lessons/basic_emacs/10703))
C-xから始まる

|説明|コマンド|
|:---|:---|
|**終了**|**C-x C-c**|
|**開く**|**C-x C-f**|
|**保存**|**C-x C-s**|
|名前をつけて保存|C-x C-w|

# ファイル内の操作([#4](https://dotinstall.com/lessons/basic_emacs/10704),[#5](https://dotinstall.com/lessons/basic_emacs/10705),[#6](https://dotinstall.com/lessons/basic_emacs/10706))
|説明|コマンド|
|:---|:---|
|→(カーソル)|C-f|
|←|C-b|
|↑|C-p|
|↓|C-n|
|行頭|C-a|
|行末|C-e|
|ファイル先頭|Esc-<|
|ファイル末尾|Esc->|

|説明|コマンド|
|:---|:---|
|範囲指定開始|C-@|
|**コピー**|**Esc-w**|
|**カット**|**C-w**|
|**貼付け**|**C-y**|
|行末までカット|C-k|
|削除|C-d|
|**Undo**|**C-x u**|

|説明|コマンド|
|:---|:---|
|前検索|C-s|
|後検索|C-r|
|置換|Esc-% target text y(, n, !(all), q)|

# ウィンドウレイアウト([#7](https://dotinstall.com/lessons/basic_emacs/10707))

|説明|コマンド|
|:---|:---|
|上下分割|C-x 2|
|左右分割|C-x 3|
|**閉じる**|**C-x 0**|
|分割全解除|C-x 1|
|**移動**|**C-x o**|

# Buffer([#8](https://dotinstall.com/lessons/basic_emacs/10708))

`C-x C-b`でバッファリストを開きます。

|説明|コマンド|
|:---|:---|
|閉じる|d|
|保存|s|
|Undo|u|
|実行|x|

# 設定([#9](https://dotinstall.com/lessons/basic_emacs/10709))
`~/.emacs.d/init.el`を編集します。
編集行の行末で`C-x C-e`をすると変更が即反映されます。

# 今後
あまり頑張らずに移行するために最低限覚えたコマンドだけ**太字**にしておきました。
代用キーがあったり個人的に使用頻度が低いと思ったものは後回しにしています。
例えば方向キーはカーソルキーで代用できますし、もしHHKBキーボードを使っているのであれば覚える必要もないように見えます。
残りのコマンドは覚えたくなったときに覚えます。

設定は自分にあったものを適時増やしていきます。
PostgreSQLでパスワード認証を設定する

PostgreSQLを使ったときに、パスワード認証の設定がなかなできずに詰まったので書きました。

-----
筆者の環境

* psql (PostgreSQL) 12.2
* macOS Catalina 10.15.3 

-----
 


## １、ROLE（ユーザー）のパスワードを設定する
各ユーザーのパスワードを設定する。

### 新たにユーザーを作成する場合
`user01`を新規ユーザーとして作成、パスワードは`pass`とする。
`postgres=> CREATE ROLE user01 WITH LOGIN PASSWORD 'pass';`

### 既存のユーザーにパスワードを付与する場合
既存ユーザー`user02`に対してパスワード`pass`を設定する。
`postgres=> ALTER ROLE user02 WITH PASSWORD 'pass';`

## ２、pg_hba.conf(設定ファイル)を編集する
設定ファイルの認証方式を編集して、パスワードを聞かれるようにする。

まず、ファイルの位置を検索
※もっと良いコマンドもあると思う
`sudo find / -name pg_hba.conf`

検索できたらファイルのパスを指定してエディタで設定ファイルを確認する。

私の環境だと下記のようになっていた。
一番右側の`METHOD`の部分が認証方式。現状だと全て`trust`になってあり、無条件でログインできてしまう。

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
```

####
認証方式について

* trust  全て接続を無条件で許可する。パスワードや他の認証方式も適用されない。
* password　クライアントに対して平文のパスワードを要求する。
* md5　クライアントに対して二重MD5ハッシュ化パスワードを要求する。

上記３種類以外にもあるが今回は割愛。

`MTHOD`を`trust`から`password`or`md5`にすればパスワードの認証を設定することができる。


下図は設定の一例

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     password
# IPv4 local connections:
host    all             all             127.0.0.1/32            password
# IPv6 local connections:
host    all             all             ::1/128                 password
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     password
host    replication     all             127.0.0.1/32            password
host    replication     all             ::1/128                 password
```

記事の改善点、間違い等ありましたらぜひご指摘をお願いします。

参考
[PostgreSQL 9.4.5文書 19.1. pg_hba.confファイル](https://www.postgresql.jp/document/9.4/html/auth-pg-hba-conf.html)
Nutanix Moveのバージョンアップ

#はじめに
しばらく使ってなかったNutanix Moveを久々に触りつつ、新しいバージョンも出ているのでちょっとバージョンアップしてみようと思いました。
大した内容でもないですが、自分用の備忘録もかねて実施した内容を残しておこうと思います。

#環境
元々使用していたNutanix Moveのバージョンは以下です。
3.4.1

更新後のバージョンは以下となります。
3.5.0

#準備
事前にNutanixのSupport PortalからNutanix MoveのUpgrade Packageをダウンロードしておきましょう。
①"Offline upgrade package"を選択してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/6e21a0bc-ec60-37c1-cad2-952bdfc964d4.png)

zipファイルの中身はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/ab018b31-cce6-c054-34ea-6649d8ab22b4.png)

次に今使用しているNutanix Moveのバージョンを確認してみたいと思います。
②Nutanix Moveの管理IPアドレスを指定して、ログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/a8139916-ac66-f26b-55f6-ac0371297196.png)

③画面右上にあるNutanixの文字をクリックし、さらに"About Move"をクリックして、Nutanix Moveのバージョンを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/391c98a5-4e03-1027-99eb-457af1ef847d.png)

現在のバージョンが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/407b08c8-46c7-d8c4-558f-585a1034cf8b.png)

#バージョンアップ作業
①再び画面右上のメニューからギアのアイコンを選択して、"Upgrade Software"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/abd92064-11b2-78c9-4c92-b9d0fff4f0b2.png)

現在使用中のバージョンと最新バージョンの情報とRelease Noteが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/3d281584-a217-279e-aba5-a07777d6d8f1.png)

②画面の下の方にある"upload the binary"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/5142faae-d317-487c-96d0-09e7c51b93bf.png)

③バイナリファイルとメタデータファイルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/275f371b-a63d-eed1-9ca5-5b6de1494cac.png)

以下のような形です。[Upload]ボタンをクリックすることでファイルがUploadされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/13d30cd3-9339-9c72-af96-7cceaf28880f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/24085282-4427-2ee7-047e-4b35c2df2581.png)

④Uploadが終わったら今度は[Upgrade]ボタンをクリックしてバージョンアップをかけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/6fc8bc54-6717-8cb6-2f80-f19a30e125d8.png)

バージョンアップが開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/8474c3d6-2975-64ce-0c75-3fdfe4bc7120.png)

無事完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/b9e86910-4f4d-ff03-b1fb-2e9ae6dca9dc.png)

⑤Nutanix Moveに再度ログインし直しが必要になるので、再度ログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/879cf264-8a46-0a6e-7300-57654b3f2a98.png)

⑥使用許諾に同意して、[Continue]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/c8b47817-6b66-185a-d72f-e3c21e3153a8.png)

⑦再び画面右上の"Nutanix"の文字をクリックし、"About Move"をクリックしてバージョンを確認すると、更新後のバージョンを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111342/80109bf3-a1fd-ed1c-c806-ace91723caab.png)


MoveもPRISM上から1Click Upgradeで！というわけにはいきませんが、Nutanix Moveの管理画面からファイルを読ませてポチポチと先に進めばバージョンアップができるので、とっても簡単でいいですね。
Overleaf 設定 自分用

# 参考URL

* [Beamer Presentations: A Tutorial for Beginners (Part 2)—Lists, Columns, Pictures, Descriptions and Tables](https://www.overleaf.com/learn/latex/Beamer_Presentations:_A_Tutorial_for_Beginners_(Part_2)%E2%80%94Lists,_Columns,_Pictures,_Descriptions_and_Tables)

# スライド

日本語化

```
\documentclass[unicode,12pt]{beamer}
\usepackage[whole,autotilde]{bxcjkjatype}
```

目次

```
\begin{frame}
\frametitle{Table of Contents}
\tableofcontents
\end{frame}
```

# 文書

日本語化

```
\documentclass[ja=standard]{bxjsarticle}
\usepackage[utf8]{inputenc}
```
AWS初心者が在宅勤務中にAWSの資格を取る記録 part1

##■4/27(Mon)
・koiwaclub(https://aws.koiwaclub.com/)でCLF#01～48まで解答
　→参考書2冊斜め読み+Udemyでコース受講(https://www.udemy.com/course/1706378)
　 ※上記くらいの知識ベースはあります
　→とりあえず解きまくるだけ！解説はそこそこ見るくらいで量を重視

###感想
・336問(No.1につき7問*48)中222問正答（正答率はおよそ66%）
・意外と正答できる
・覚えてるところは覚えてるけど、覚えてないものはほとんどおぼえてない
・本番がどんな感じかわからないけど、読解力が必要だと感じた

##■4/28(Tue)
・koiwaclub(https://aws.koiwaclub.com/)でCLF#01～20まで解答
　→2周目
　　→解説もじっくり見て、メモをとりつつ理解を深める

###感想
・1周目時点でこの方法をとっていればよかったと後悔。。
・ベースがなんとなくできてきた感覚はある
　→確実に理解して解答できるようになってきた

##■4/29(Wed) 祝日
・koiwaclub(https://aws.koiwaclub.com/)でCLF#21～30まで解答
　→2周目
　　→解説もじっくり見て、メモをとりつつ理解を深める

##感想
・特になし。。

##■4/30(Thu)
・koiwaclub(https://aws.koiwaclub.com/)でCLF#31～48まで解答
　→2周目
　　→解説もじっくり見て、メモをとりつつ理解を深める
・下記のUdemyコースを受講する
　https://www.udemy.com/course/aws-4260/learn/quiz/4766842#overview

##感想
・2週目の結果
　336問(No.1につき7問*48)中279問正答（正答率はおよそ83%）
　　→ある程度伸びたが80%台後半をマークしたかった感

##■5/1(Fri)
・下記のUdemyコースを受講する
　https://www.udemy.com/course/aws-4260/learn/quiz/4766842#overview

##感想
・試験の結果（正答率）
　→基本①：80%
　 基本②：67%
　 応用①：49%
　　→応用になると一気に難しくなる感じ
　　 基本をしっかり押さえてないと全て回答できないことを痛感した

##まとめ
GW中も勉強に励まなければいけなと思いました。
また、心境の変化もあったのでCLF、SAAの取得を少し早めるべくペースアップを図ります。
古いブランチを最新の状態にしたい

## ブランチのリサイクル活用
作業ごとにブランチを細かく切るとブランチの量がとんでもないことになるので
すでに作業が終わったブランチを最新のmasterブランチと同じ状態にして
新たにそのブランチで作業したい
簡単だけど備忘録として。


## git merge masterでOK
まずカレントブランチの確認

```
$ git branch

   *master  ⬅️カレントブランチは米印がつく
   branch1
   branch2
   branch3

こんな感じで出る
```




ブランチ移動

```
$ git checkout branch1
$ git branch

  master  
  *branch1  ⬅️ブランチが移動する
  branch2
  branch3


$ git merge master
```

これでbranch1はmasterと同じ最新の状態に。
B-TreeとB+Treeに関して簡単に説明

MySQLのインデックスには```B+Tree```と呼ばれる木構造が使用されている。
似たような木構造に```B-Tree```があると知り、違いに触れつつ両方の木構造を説明してみる。

インデックスとはなんぞや？、という方は別の記事等を参照してからお読みください。

# B-Tree
![スクリーンショット 2020-05-01 15.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/7c9dd415-b591-cc0b-06c1-12bf3a3edd68.png)

- 各ノードは値を保持し、また２つ以上の子ノードを保持することがある。
- 値を検索する場合はルートノードから順番に大小を比較して検索していく。
- 例えば4を検索したい場合は、node a → node b → node cという順序で検索する。
- メリットは検索回数が少なくてすむ（=計算量が少なくてすむ） ∵基本的に階層の数だけ検索すればいいから。
- 子ノードの数が２に固定されているB-Treeが```二分探索木```である。
- MongoDBのインデックスに使われているらしい。

# B+Tree
![スクリーンショット 2020-05-01 15.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454171/fc81def9-99e7-31c4-e092-7fa958c99289.png)

- B-Treeとは異なり各ノードではなくリーフノード(上記の図の青い部分)でデータを持つ（リーフノードがデータを持つのでキー値がノードと被る）
- リーフノードがポインタでつながっている。

# それぞれのメリット
- B-Treeはノードもデータを持つので、探索途中でヒットすればレスポンスが早いことがある。
- B+Treeは複数ノードにまたがる範囲検索を効率的に行える。
Ruby on Rails チュートリアル 第１章①

○この記事の要点
「第1章　ゼロからデプロイまで」の最初から途中までの実施内容メモ
思ったことなどのメモ

○内容
■Ruby on Railsについての説明
　・生い立ち。2004年
　・採用実績。Airbnb や Basecamp, Disney, GitHub, Hulu, Kickstarter, Shopifyなど
　・利用されている理由
　　・100%オープンソース
　　・設計が簡潔で美しい（Ruby言語の驚異的な柔軟性によるもの）
　　・RESTへの対応
　　・多様なコミュニティ

■環境構築
・手法が2つ。手法2がおすすめらしいので、手法2で実施（無料）。確かに便利。特にLinuxマシンを用意できない場合、手法2はおすすめ。
手法1.Learn Enough に沿ったローカルマシンでの環境構築
手法2.クラウド統合開発環境 (クラウドIDE) を使った環境構築
（クラウドIDEはWebブラウザの中で実行できるため、OSが異なっても同じように扱えるため、便利）
クラウドIDEとして、AWS Cloud9がおすすめされている。（Cloud9 の料金は無料）

・AWS Cloud9の環境整備（https://aws.amazon.com/jp/cloud9/getting-started/）
（１）AWSアカウントの登録を行う　※１
（２）AWSへのログイン。AWS cloud9での環境作成　※１
（３）初期設定
　　・Rubyドキュメントのインストール
　　・Railsをインストール
※１ Railsのチュートリアルなので、仕方がないとは思うが、AWSアカウントの登録やcloud9の環境作成については時間がかかった。この後時間があれば詳細記事を作成するか。

■最初のアプリケーション作成
（１）cdコマンドでアプリケーションを作成したいフォルダに移動
（２）rails _5.1.6_ new hello_appしてアプリケーションフォルダを作成
→アプリケーションのひな型作成を行ってくれる　※２　エラー発生
※２
エラー：
既にenviromentフォルダが存在していた（なぜ？）ので、フォルダを作成せずそのまま実施したが、実行結果がエラーになった。
対処：enviromentフォルダを削除してから再度enviromentを作成し、rails _5.1.6_ new hello_appした

（３）Bundlerを実行して、アプリケーションに必要なgemをインストール
チュートリアルに記載してある通り、Gemfileを修正（バージョン指定のため）
bundle installを実行。※３　エラー発生
※３

```ruby:エラー
ubuntu:~/environment/hello_app (master) $ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
You have requested:
  spring = 2.0.2

The bundle currently has spring locked at 2.1.0.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```
対処：エラーメッセージにbundle updateして！って書いてあるので実行。
再度bundle installで正常に終了するようになった。
↑ここまででアプリケーションの準備完了

■rails serverの起動（開発マシンでのみブラウズできるローカルWebサーバー）
（１）rails serverを実行
（２）PreviewタブからPreview Running Application
　開いた窓の右にある□をクリックすると、ブラウザ起動⇒Yay! You’re on Rails!
・rails serverを停止してから再度Preview Running Applicationすると、No application seems to be running here!になっているので、サーバが動作していないことを確認できる。

■Hello,World!の表示
（１）application_controller.rbのファイル修正⇒hello,worldのhtml定義
（２）routes.rbのファイル修正⇒デフォルト表示の変更
PreviewタブからPreview Running Application⇒hello,worldが開いた

今日はここまで。実施時間は2時間。次回は「第1章　ゼロからデプロイまで」の残り

■感想
・仮想IDEとか便利すぎる。昔はローカルマシンに仮想環境入れて、OSセットアップから言語のインストール、パスの設定。。。とか全部やったのにそれ全部不要。素晴らしい。
・Linuxの知識がなくても行けそうだが、自身がやったことがGUIで見れないというのでイメージがわかない点はありそう。
・MVCモデルということで、昔Servletやってた経験が活きてる。というかいまだにMVCモデルが使われてるんだな。と思った。
#Ruby try ... I wanna delegate ( pass through ) all of natural args to another method in one method

```rb
# https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/

# https://medium.com/@sologoubalex/parameter-with-double-splat-operator-in-ruby-d944d234de34

# OK
# Pass keyword args to another method
def foo1(**kwargs)
  bar1(**kwargs)
end

def bar1(x:, y:)
  p x
  p y
end

foo1(x: "X1", y: "Y1")


# OK
# *args not used
def foo2(*args, **kwargs)
  bar2(*args, **kwargs)
end

def bar2(x:, y:)
  p x
  p y
end

foo2(x: "X2", y: "Y2")

# OK
# args used
# kwarss used
def foo3(*args, **kwargs)
  bar3(*args, **kwargs)
end

def bar3(hash, x:, y:)
  p hash[:a]
  p hash[:b]
  p x
  p y
end

foo3({a: "A3", b: "B3" }, **{ x: "X3", y: "Y3"})


# OK
def foo4(*args, **kwargs)
  bar4(*args, **kwargs)
end

def bar4(string, x:, y:)
  p string
  p x
  p y
end

foo4("A4", x: "X4", y: "Y4")


# NG
def foo5(*args, **kwargs)
  bar5(*args, **kwargs)
end

def bar5(string, hash)
  p string
  p hash[:x]
  p hash[:y]
end

# No Warning
bar5("A5",{ x: "X5", y: "Y5" })

# Warning
# warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
foo5("A5",{ x: "X5", y: "Y5" })



# OK
def foo6(*args)
  bar6(*args)
end

def bar6(string, hash)
  p string
  p hash[:x]
  p hash[:y]
end

foo6("A6",{ x: "X6", y: "Y6" })



```

# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ORACLE GoldenGate on Windowsのggsciが使えない

# 概要
GoldenGateにはggsciという制御用のコマンドラインインタフェースがあるのですが、コマンドプロンプトから実行してもウンスンで困りました。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75431/7e376f86-5827-86cd-6cbf-400d2cc601c5.png)

エクスプローラーからggsci.exeを実行したところ、「コンピューターに MSVCR120.DLLがないため、プログラムを開始できません。」とのこと。なるほど。

# 解決
Microsoftから下記のパッケージをインストールしたら起動しました。

- Visual C++ 2013 および Visual C++ 再頒布可能パッケージの更新
   - https://support.microsoft.com/ja-jp/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75431/c1959ad8-61f8-4d05-855a-f99713a580f6.png)

# 確認バージョン
   - OS: Windows Server 2012 R2 評価版
   - DB: ORACLE database 11gR2 EE
   - GG: ORACLE GoldenGate 19c (19.1.0.0.4 for Oracle on Windows (64 bit))
  
よかった、よかった。
GitHub Actions の Runner を一発で構築するスクリプト

Terraform で EC2 の user_data に突っ込んで、自動構築した。

```rb:gh-action.tf
resource "aws_security_group" "runner" {
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "runner" {
  ami                    = "ami-0278fe6949f6b1a06" # ubuntu 18.04
  instance_type          = "t2.small"
  vpc_security_group_ids = [aws_security_group.runner.id]
  user_data              = file("./ec2-scripts/init-gh-action-runner.sh")
}
```

```sh:./ec2-scripts/init-gh-action-runner.sh
#!/bin/bash

set -ue

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker ubuntu

mkdir actions-runner
cd actions-runner
curl -O -L https://github.com/actions/runner/releases/download/v2.169.1/actions-runner-linux-x64-2.169.1.tar.gz
tar xzf ./actions-runner-linux-x64-2.169.1.tar.gz
chown -R ubuntu: /actions-runner
sudo -i -u ubuntu /actions-runner/config.sh \
    --url https://github.com/org/repo \
    --token AAAAAAAAAAAAAAAAAAAAAAAAAAAAA \
    --name $HOSTNAME \
    --work _work \
    --unattended \
    --replace

/actions-runner/svc.sh install
/actions-runner/svc.sh start
```

TODO: GitHub Actions のトークンの作成を自動化したい

参考: https://github.com/myoung34/docker-github-actions-runner
言語処理100本ノック　第4章: 形態素解析　33. 「AのB」

# 問題
> 2つの名詞が「の」で連結されている名詞句を抽出せよ．
https://nlp100.github.io/ja/ch04.html

下のデータでいうと、「彼の掌」を抽出しろという問題。

``` python
# inputデータ
[[{'surface': 'ただ', 'base': 'ただ', 'pos': '副詞', 'pos1': '*'},
  {'surface': '彼', 'base': '彼', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'の', 'base': 'の', 'pos': '助詞', 'pos1': '接続助詞'},
  {'surface': '掌', 'base': '掌', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'に', 'base': 'に', 'pos': '助詞', 'pos1': '格助詞'},
  {'surface': '載せ', 'base': '載せる', 'pos': '動詞', 'pos1': '*'},
  {'surface': 'られて', 'base': 'られる', 'pos': '接尾辞', 'pos1': '動詞性接尾辞'},
  {'surface': 'スー', 'base': 'スー', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'と', 'base': 'と', 'pos': '助詞', 'pos1': '格助詞'},
  {'surface': '持ち', 'base': '持つ', 'pos': '動詞', 'pos1': '*'},
  {'surface': '上げ', 'base': '上げる', 'pos': '動詞', 'pos1': '*'},
  {'surface': 'られた', 'base': 'られる', 'pos': '接尾辞', 'pos1': '動詞性接尾辞'},
  {'surface': '時', 'base': '時', 'pos': '名詞', 'pos1': '副詞的名詞'},
  {'surface': '何だか', 'base': '何だか', 'pos': '副詞', 'pos1': '*'},
  {'surface': 'フワフワ', 'base': 'フワフワ', 'pos': '副詞', 'pos1': '*'},
  {'surface': 'した', 'base': 'する', 'pos': '動詞', 'pos1': '*'},
  {'surface': '感じ', 'base': '感じ', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'が', 'base': 'が', 'pos': '助詞', 'pos1': '格助詞'},
  {'surface': 'あった', 'base': 'ある', 'pos': '動詞', 'pos1': '*'},
  {'surface': 'ばかりである', 'base': 'ばかりだ', 'pos': '助動詞', 'pos1': '*'},
  {'surface': '。', 'base': '。', 'pos': '特殊', 'pos1': '句点'}],
...
```

# 回答
1文ごと、1形態素ごとに「の」の前後に名詞があるかチェックする。
インデックスを0から始めると、「の」が先頭・終わりの場所にあると、
IndexError: list index out of range
とエラーになるので、インデックスの開始を1からにする必要がある。

``` python
surface = []
for sentense in result_list:
    for i in range(1, len(sentense)-1):
        if sentense[i-1]['pos'] == '名詞' and sentense[i]['surface'] == 'の' and sentense[i+1]['pos'] == '名詞':
            surface.append(sentense[i-1]['surface'] + sentense[i]['surface'] + sentense[i+1]['surface'])
surface

# 結果
['彼の掌',
 '掌の上',
 '書生の顔',
 'ものの見始',
 '顔の真中',
 '穴の中',
 '書生の掌',
...
```

# 参考にしたサイト
[言語処理100本ノックに挑戦 第4章](https://qiita.com/takugenn/items/44bf9cd78824ce7892d5)
【Rails】メッセージを送ったビューにredirect（メモ）

##目的
 依頼詳細画面（requests/show.html.erb）からメッセージを送り(message#createして)、依頼詳細画面（requests/show.html.erb)に戻りたい。

##前提
テーブル同士の紐付けができている。


##実装
URIパターンより、
`request GET    /requests/:id(.:format)                                                                  requests#show`
依頼詳細画面（requests/show）に戻るためには、request.idが必要になる。

以下のようにした。

```messages.controller.rb
def create
  message = Message.create(message_params) #変数messageを定義
  redirect_to "/requests/#{message.request.id}" #アソシエーションを利用し、request.idを取得
end

private
def message_params
  params.require(:message).permit(:content).merge(user_id: current_user.id, request_id: params[:request_id])
end
```
変数messageを定義することで、ストロングパラメーターを用いてrequest.idが取得できる。
requestとmessageは紐づいているため、`#{message.request.id}`でidを取得。


##実装で起こったエラー
メッセージを送信後、正常にredirectされているが、投稿されたメッセージは表示されない。
ターミナルを確認。以下。

```console
Started POST "/requests/8/messages" for ::1 at 2020-05-01 15:07:23 +0900
Processing by MessagesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+IWNPAmRagwZuuL〜4uDd4yYJWeFcO==", "message"=>{"content"=>"s"}, "commit"=>"SEND", "request_id"=>"8"}
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
  ↳ app/controllers/messages_controller.rb:9
   (0.2ms)  BEGIN
  ↳ app/controllers/messages_controller.rb:3
  Request Load (0.5ms)  SELECT  `requests`.* FROM `requests` WHERE `requests`.`id` = 8 LIMIT 1
  ↳ app/controllers/messages_controller.rb:3
   (0.3ms)  ROLLBACK
  ↳ app/controllers/messages_controller.rb:3
Redirected to http://localhost:3000/requests/8
Completed 302 Found in 23ms (ActiveRecord: 1.4ms)
```
ROLLBACK!?!?
DBには保存されていない。
BEGIN と ROLLBACK はデータベースの用語らしい。
保存しようとしたけど取り消された感じ？
modelを確認`belongs_to :users` 複数形になっていた。単数形にして。エラー解決。
【Laravel】複数テーブルのmigrationファイルを1回で作成するエイリアス

#やりたいこと
新規プロジェクトでテーブル百程度を作成する必要があり
毎度`php arisan make:migration`したくない

#やりかた
aliasを作成する

`~/.bash_aliases`を編集

```bash:~/.bash_aliases
#make migration
function mmi(){
    while [ "$1" ]
        do
            command php artisan make:migration create_"$1"_table
            shift
    done
}
```

引数がある限りループして、`make:migration`して作成します

あとは一度exitで終了して立ち上げなおすか、`bash ~/.bashrc`で再度実行し読み込ませる。

とはいえ、中は自分で書かないといけないので面倒...
ここもどうにか出来たらいいんだけれど
pynputによるキー検出

Pythonには、多くの機能を備えた pynput モジュールがあります。
今回は、pynputを使ってキー検出をしていきます。
#開発環境
MacOS Catalina
Python 3.8.2
opencv-python 4.2.0.34
#キー検出
早速やっていきたいと思います！

```python

from pynput.keyboard import Key, Listener

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()
```
このプログラムは、キーを押した時にそのキーが何かをprintしてくれるプログラムです。
「def on_press(key)」
このコードは(　)の中のパラメーターによってキーが押された時に実行するようになっています。
#参考
今回は短いですがこれで終わります。
[https://www.it-swarm.dev/ja/python/python](https://www.it-swarm.dev/ja/python/python%E3%81%A7%E3%82%AD%E3%83%BC%E6%8A%BC%E4%B8%8B%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F/1047269462/)
#Mac で日本語入力がどうしようもなく重い、遅い時は... ライブ変換無効 + Mac OS 再起動はいかが

- Mac の IME のライブ変換を無効にする ( or Google日本語入力に変える )
- Mac の 「英語入力しながら日本語にも変換してくれる、ありがた迷惑なやつ」を無効にする ( or Google日本語入力に変える )
- Mac OS を再起動する

本当に悩んでいて、色々と試したが ライブ変換無効 + Mac の再起動の合わせ技がかなり効いた感じがした

docker や node など、開発でそれなりに重い処理も走らせている影響もあるかと思い、もうMacBookを買い換えるしかないかと思っていたが、単に再起動で随分と解消した

なぜ今まで気づかなかったんだろう

教訓、OSはたまに再起動したほうが良い

現在 2020年
スペックは以下

![image](https://user-images.githubusercontent.com/13635059/80673759-0c81c400-8aeb-11ea-8539-4ce042ffa299.png)


# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GW中に開催のオンラインイベント（無料）

今年のGWは、自宅で過ごされている方がほとんどではないでしょうか？
日本はGW期間中ですが、アメリカでは、データエンジニアも要チェックなオンラインイベントが開催されています。そこで今回はその中でも大きなイベントを2つ紹介したいと思います

#[Data Champions Online](https://dco-us.coriniumintelligence.com/)
開催期間：Date: 5/4-8(毎日1.5時間程度）
開催場所：バーチャル
言語：英語
費用：無料

データリーダーのCoriniumによるバーチャルカンファレンス。データ分野で最も魅力的で参加者が多いカンファレンスの1つであり、すべてのETL実務者にとって必見だと言えます。
AIG、Chubb、Northwell Health、Bell Mediaの代表者がスケジュールに参加し、業界リーダーからの知見、戦略を学ぶ機会が満載の1週間。現時点で発表されているAgendaとしては以下のようなものがあります。

- **Taking a Psychological Approach to Data Challenges**（データ課題への心理学的アプローチ）
- **How Are Businesses Developing and Achieving Data Transformation?**（企業はどのようにしてデータ変換を開発し、実現しているのか？）
- **How Are Businesses Streamlining Their Enterprises and Processes For Better Results?**（より良い結果を出すために、企業はどのようにして企業と業務プロセスを合理化しているか？）

参加登録は無料ですので、ぜひこの機会にオンラインイベントで学習してみてはいかがでしょうか？
[参加登録はこちら(無料)](https://dco-us.coriniumintelligence.com/)

#[X-Force Data Summit](https://www.xforcesummit.com/)
開催期間：4/29-30　
※期間後も**[アーカイブ](https://www.xforcesummit.com/replays/)**を見ることができます
開催場所: バーチャル
言語：英語
費用：無料

Xplentyによる**X-Force Data Summit**は、Salesforceデータと統合に関するベストプラクティス、ワークフロー、体験を共有するためのグローバルなSalesforceコミュニティのための場です。このオンラインカンファレンスでは、Salesforceに関するトピックを中心に、幅広い魅力的な講演が行われました。

**Salesforce Confessions**（セールスフォース あれこれ）
**Slack Hack Your Salesforce - Integrating Slack with Salesforce**（SlackとSalesforceの統合）
**Combining Segment With Salesforce**（Segment（ソフトウェア）とSalesforceの統合）
**Creating Customer Health Scores With Salesforce & Xplenty**（SalesforceとXplentyで顧客のヘルススコアを作成する）

このイベントでカバーしているカテゴリーは、**Salesforce**、統合、データウェアハウス、ChatOps、レポート、アナリティクスです。

**[アーカイブ視聴はこちら（無料）](https://www.xforcesummit.com/)**

ぜひGW中にチェックしてみてはいかがでしょうか？
Javascriptのメソッド  indexOf / map / filter


##indexOf() - 文字列を検索する
検索対象の文字列の先頭（0番目）から、順番に1文字ずつ検索をしていき、最初に一致した位置（index番号）を**数値**で返してくれる。

```javascript
//任意の文字列
var fruits = 'lemon', 'orange', 'apple';
// 'orange'を検索する
var search_result = fruits.indexOf('orange');
console.log(search_result);
//出力結果：6
```
検索した文字列が見つからなかった場合は「-1」が返ってきます。

```javascript
//任意の文字列
var fruits = 'lemon', 'orange', 'apple';
//'banana'を検索する
var search_result = fruits.indexOf('banana');

if (search_result !== -1) {
  console.log('見つかりました');
} else {
  console.log('見つかりませんでした');
}
```

##map() - 配列の各要素にコールバック関数を実行する
配列に使うメソッドで、各要素に対して**コールバック関数**を実行し、その結果を新しい配列として返す。

- コールバック関数とは<br>
関数に引数として渡される関数のこと。

```javascript

var items = [1,2,3,4];
//配列の各要素を2倍にして返す
var calc_result = items.map(item => {
    return item * 2;
});
 
console.log(calc_result);
//出力結果：[2,4,6,8]
```

##filter() - 配列から、特定の条件を満たすデータを抽出する
こちらも配列に使うメソッドで、特定の条件を**コールバック関数**に書くことで、条件を満たすデータを**配列で**返してくれる。

```javascript

var items = [1,2,3,4,5,6,7,8,9,10];
 
var results = items.filter(item => {
    //3の倍数を抽出
    return value % 3;
});
 
console.log(results);
//出力結果：[3,6,9]
```
P5.js 日本語リファレンス(strokeWeight)

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

## strokeWeight()

### 説明文

線、点、図形の周囲の境界線に使用されるストローク(線)の幅を設定します。すべての幅はピクセル単位で設定されます。

### 構文

strokeWeight(weight)

### パラメタ

- weight  
Number：ストロークの太さ(ピクセル単位)

### 例

```javascript
function draw() {
  strokeWeight(1); // デフォルト
  line(20, 20, 80, 20);
  strokeWeight(4); // 太い
  line(20, 40, 80, 40);
  strokeWeight(10); // すごく太い
  line(20, 70, 80, 70);
}
```

### 実行結果
![strokeWeight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/a822d893-af1f-f139-c51d-a55b17af2e47.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) に従います。
P5.js 日本語リファレンス(strokeJoin)

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

## strokeJoin()

### 説明文

LINE を接続するジョイントのスタイルを設定します。これらのジョイントは、留め継ぎ、面取り、丸めに対応するパラメータ MITER、BEVEL、ROUNDで指定します。デフォルトのジョイントは MITER です。

### 構文

strokeJoin(join)

### パラメタ

- join  
定数：MITER、BEVEL、ROUND のいずれか


### 例1

```javascript
function draw() {
  noFill();
  strokeWeight(10.0);

  strokeJoin(MITER);
  
  beginShape();
  vertex(35, 20);
  vertex(65, 50);
  vertex(35, 80);
  endShape();
}
```

### 実行結果
![strokeJoin-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/978ceefe-0865-3eb4-b1ea-17e31338c76f.png)


### 例2

```javascript
noFill();
strokeWeight(10.0);
strokeJoin(BEVEL);
beginShape();
vertex(35, 20);
vertex(65, 50);
vertex(35, 80);
endShape();
```

### 実行結果
![strokeJoin-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/0950a411-3c6d-26f6-34bb-00dd072b6864.png)



### 例3

```javascript
function draw() {
  noFill();
  strokeWeight(10.0);

  strokeJoin(ROUND);
  
  beginShape();
  vertex(35, 20);
  vertex(65, 50);
  vertex(35, 80);
  endShape();
}
```

### 実行結果
![strokeJoin-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/60237cdd-107f-efc4-9d05-ac1e824f867b.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) に従います。
toio準備1

[概要]
node.js/nodist/noble/yarnなどのインストール
Bluetoothのドライバ更新
Bluetooth機器の検出


----------------------------------------------
機材
TOIOセット(バリューパックがよい)
[Bluetoothドングル](https://github.com/noble/node-bluetooth-hci-socket#compatible-bluetooth-40-usb-adapters) （リストにあるもの）
スイッチサイエンス開発者用シート

----------------------------------------------
(あ) conda でpython2.7環境を作る
conda create -n py27 python=2.7 anaconda
　
(い)
[Node.js](https://nodejs.org/en/download/) をインストール
 　node -v   v12.16.3
nodist 0.9.1 //nodist は Node.js のバージョンを管理するツール｡
　→　npm -v 6.14.4 も入る。

[noble](https://github.com/noble/noble)  : Node.jsでBluetooth LEを扱うためのモジュールです。

追記：npm config set msvs_version 2015 とVisualStudioのVERを明示した方がよいそう。 
npm install noble　：　エラーでる　→Powershell 管理者モードでおこなう
npm install --global windows-build-tools　：
npm install noble　：　再確認
（参考）
◆ Windows10にnobleをインストールする https://qiita.com/s_nkg/items/3f27328e108d7fa8d076
◆ [Windowsでnpm installしてnode-gypでつまずいた時対処方法] https://qiita.com/AkihiroTakamura/items/25ba516f8ec624e66ee7

（う）
Bluetoothアダプタのデバイスドライバを、[Zadig](https://zadig.akeo.ie/)というツールでWinUSBというドライバに書き換える必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/547ecaa6-90f7-fa25-c356-5a9a55ea76f0.png)
確認：[Node.jsから周辺のBLEデバイスを探すサンプル](https://qiita.com/n0bisuke/items/00503d2b18fc4f413c4e
)

npm init -y
npm i --save noble

node app.js

手順まとめ
npm install noble
npm install --global windows-build-tools
npm install noble
デバイスドライバの差し替え


npm init -y
npm i --save noble
node app.js

これでbluetoothデバイスを認識するところまでいけた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/bb72a806-d46b-eff9-f2af-0b0941196c54.png)
ドメインとGmailの連携を保ちながらGoogle Domainsで取ったドメインとzeit now.shを繋ぐ

# zeitはvercelに
https://vercel.com/blog/zeit-is-now-vercel
久しぶりにnow.sh開いたら急にvercelとかで意味が分からなかった

# Google domains + Gmail

ドメイン取って、Gmailと繋いで`...@yourdomain.com`みたいにメールを受け取るには設定が楽で良い。

# zeitも使いたい

zeitにプロジェクトを追加すると自動的に`project_name.now.sh`になるが、これをGoogle domainsで取った`yourdomain.com`にするには[Custom Domains][2]の通りにすればいい。

1. Google domains側のDNSレコードをzeit側に向けてやる
2. またはGoogle domains側にALIAS、ANAMEを設定する

ここで問題はGoogle domainsではALIAS、ANAMEの設定が出来ない（zeit側のCDNも効かないので非推奨ともある）。なので選択肢としては1しかない。

1.を設定すると、yourdomain.comがzeit側に行ってしまうので、このままだと@yourdomain.comでのメールが不達になる。

# 解決策

MXレコードをzeit側に設定する。

[Vercel DNS][4] (nowからvercelコマンドツールに変わってきてるので適当に読み替える)
[Set up email forwarding with custom name servers][3]
サッと見た感じ、web経由ではMXレコードの追加は出来なさそう。以下のコマンドでMXレコードを追加。

```
now dns add yourdomain.com '@' MX gmr-smtp-in.l.google.com 5
now dns add yourdomain.com '@' MX alt1.gmr-smtp-in.l.google.com 10
now dns add yourdomain.com '@' MX alt2.gmr-smtp-in.l.google.com 20
now dns add yourdomain.com '@' MX alt3.gmr-smtp-in.l.google.com 30
now dns add yourdomain.com '@' MX alt4.gmr-smtp-in.l.google.com 40
```

これでyourdomain.comのwebサーバーをzeitでホストしながら、@yourdomain.comのメールはGmailで引き続き受け取れるし、送信出来る。


[1]: https://vercel.com/blog/now-dns
[2]: https://vercel.com/docs/v2/custom-domains
[3]: https://support.google.com/domains/answer/9428703?hl=en
[4]: https://vercel.com/docs/cli#commands/dns
P5.js 日本語リファレンス(strokeCap)

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

## strokeCap()

### 説明文

LINEの端形状を設定します。これらの端は、2乗、拡張、丸められており、それぞれが対応するパラメータ SQUARE、PROJECT、ROUNDで指定します。デフォルトは ROUND です。

### 構文

strokeCap(cap​​)

### パラメタ

- cap  
定数：SQUARE、PROJECT、ROUND のいずれか

### 例

```javascript
function draw() {
  strokeWeight(20.0);
  
  strokeCap(ROUND);
  line(20, 30, 150, 30);

  strokeCap(PROJECT);
  line(20, 70, 150, 70);
  
  strokeCap(SQUARE);
  line(20, 110, 150, 110);
}
```

### 実行結果
![strokeCap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/11e3e01b-82b5-346e-5b3a-aff6b255192b.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) に従います。
P5.js 日本語リファレンス(smooth)

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

## smooth()

### 説明文

すべてのジオメトリを滑らかな(アンチエイリアスされた)エッジで描画します。 smooth() は, サイズ変更された画像の画質も向上させます。 2Dモードでは、smooth() がデフォルトでアクティブであることに注意してください。 noSmooth() を使用して、ジオメトリ、画像、フォントのスムージングを無効にすることができます。 3Dモードでは、デフォルトで noSmooth() が有効になっているため、ジオメトリのエッジをスムーズ(アンチエイリアス)にしたい場合は、smooth() を呼び出す必要があります。

### 構文

smooth()


### 著作権

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) に従います。
【iOS】ErrorMessage レイアウトスレッド管理に注意！！

~~~ Error:ErrorMessage 
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
~~~
英訳をすると、
このアプリケーションは、メインスレッドからエンジンにアクセスした後、自動レイアウトエンジンをバックグラウンドスレッドから変更しています。これにより、エンジンの破損や奇妙なクラッシュが発生する可能性があります。

iOS13くらいから
レイアウト描画関係のスレッドを気にする必要があるようです。

iOS13にあげてからやたらと落ちる原因が増えたという方がいたらこの点確認してみてください。

例を挙げている記事がありました

[tableVeiw.reloadData()をバックグラウンドスレッドで実行してはいけない](https://qiita.com/takehilo/items/ef89185eacb7d4b60112)

[viewDidLoadでAdMobの設置とAlamofireによる通信を行っている時に発生。]
(https://llcc.hatenablog.com/entry/2016/05/25/230000)

~~~
  /// UIView 系のレイアウト処理
  // 例：tableVeiw.reloadData()
  // 例：cell.text = "テキスト"
~~~

~~~
dispatch_async(dispatch_get_main_queue(), {
 // レイアウト系の処理を行う場合
})
~~~

// 念のため メインスレッドにいるかの確認をしておくといいかもですね。

~~~

let currentThread = NSThread.currentThread()
print(currentThread.isMainThread)  // false

dispatch_async(dispatch_get_main_queue()) {
  let currentThread = NSThread.currentThread()
  print(currentThread.isMainThread)  // true
  // レイアウト系の処理を行う場合
}
~~~

---

## 関連記事

---

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１ WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)

緩募


### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
https://twitter.com/sunstripe2011

#### プログラミングラボ
https://twitter.com/PLab2020

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

#### トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

### キャリア教育事業

#### 青空プログラミング
[![青空プログラミング100px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/603d53ab-828b-645e-a415-1b6f158d7356.png)](https://actcoin.jp/project/detail.php?id=600)

[![ダウンロード (9).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/9bde9318-28c2-ce74-d4c5-326168061bcc.jpeg)](https://www.youtube.com/hashtag/%E9%9D%92%E7%A9%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

#### 広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集

## ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております

## ビヨンドXプロジェクト

[ビヨンドXプロジェクト全体会議](https://www.youtube.com/playlist?list=PLaR6-YWiGWkYhEHWnt8f1z-JC0g3nwwC9)