OmniAICreator/Qiita-1.07M huggingface dataset:
VirtualBoxでpWnOS:2.0の設定


# VirtualBoxでpWnOS:2.0の設定

以前の記事で脆弱性のある[DVWAの構築](https://qiita.com/rui-watanabe/items/1f4e675a30c31a01fe7d)をしました。

今回は、**脆弱性のある仮想イメージが公開されいるプラットフォームVulnHubの、pWnOS:2.0というやられサーバーをKali LinuxとともにVirtualBoxに設定する手順**についてまとめていきたいと思います。

#前提条件
・Virtual BoxにKali Linux(kali-2019.4/)インストール済み
※Kali-2020.1ではパッケージ関連でエラーが出てGUI設定ができなかったため、一つ前のバージョンをインストール(2020年2月時点)
http://cdimage.kali.org/

#pWnOS:2.0のイメージをダウンロード

まず、pWnOS:2.0のイメージを[サイト](https://www.vulnhub.com/entry/pwnos-20-pre-release,34/)からダウンロードします。

ファイル形式は7zファイルとなっているので、ファイルを展開するためには、OSに応じてソフトウェアをインストールする必要があります。

自分はWindows環境でpWnOS:2.0をダウンロードしたので、以下のURLのソフトウェアで展開しました。https://sevenzip.osdn.jp/

#VirtualBoxにpWnOS:2.0を設定

次に、VirtualBoxにpWnOS:2.0を設定します。

VirtualBoxの新規タブからサーバーの初期設定をします（CPUやメモリなどは動作すれば最小でも可）。

pWnOS:2.0はUbuntuサーバなので、タイプをLinux、バージョンをUbuntu64ビットに指定します。

ovfファイル形式などだとこのまま起動して、ディスクの選択をしてもいいのですが、展開したものがvmdkファイルのものだったので、以下の設定手順が必要でした。

```
設定→ストレージ→コントローラIDE→ハードディスクの追加から、展開したvm
dkファイルを選択する
```

これで起動してログイン画面まで遷移できたら、pWnOS:2.0の設定は完了です。

# Kali Linuxにネットワーク範囲を設定

pWnOS:2.0への攻撃には、VirtualBoxに導入したKali Linuxを利用します。

そのためネットワークの範囲を、pWnOS:2.0のものに合わせます。

pWnOS:2.0では、静的に10.10.10.100というIPアドレスが設定されているため、Kali Linux側でも10.10.10.0/24に合わせた設定をします。

（debianのネットワークの設定ファイルは/etc/network/interfacesファイルにあります）

```
root@kali:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# 固定IPの設定
allow-hotplug eth0
iface eth0 inet static
 address 10.10.10.10
 netmask 255.0.0.0
 broadcast 10.255.255.255
 gateway 10.10.10.1
```


#Kali LinuxとpWnOS:2.0のネットワーク設定

Kali LinuxのIPをpWnOS:2.0にあわせることができましたが、Virtual Boxの設定がそれぞれデフォルトのNATのままなので、ゲストOS同士の疎通ができない状態になっています。

そこでKali Linux、pWnOS:2.0それぞれ、設定→ネットワークからNAT→NATネットワークに変更します。

NATネットワークに設定すれば、ゲストOS同士の疎通、ホストOSとの接続（デフォルトのNATの仕様）が可能になります。

最後にKali Linuxを立ち上げ、pWnOS:2.0に対してpingが通れば設定完了です。

```
root@kali:~# ping 10.10.10.100
```

#参考URL
https://qiita.com/v_avenger/items/8accd0cecba2c8f1a923
https://qiita.com/JhonnyBravo/items/135aa654d7a4b5c64c34
https://qiita.com/feifo/items/0fde474005589afcff68
作業に集中するためのチャットワークの活用術。ピン留/カテゴリ分け/ミュート設定

slackやChatworkやTeamsなど
メールではなくチャットを基本的な社内の連絡ツールにしている企業はこのご時世多いかと思います。

そんなチャットツールはすごく便利な反面、関連するプロジェクトやグループやworkspaceが増え過ぎていて
チャットを見切れないToT なんてことありませんか。
そうなってしまっては元も子もないというか生産性を上げるためのはずの便利なツールに時間を取られていては本末転倒ですよね。
それだとメール時代とあまり変わらないですよね。

今回は作業に集中するための『**チャットワーク**』における私の個人的な使い方・活用術です。

※大前提として、チャットを見る時間を決めて配分することや、不要なチャットから抜けて精査するべきみたいな話は今回は割愛します。

## ピン留／カテゴリ分け／ミュート設定／デスクトップ通知

### ピン留

まずは作業に必要でよく見るチャット部屋を切り分けて``ピン留``します。
ピン留することで未読既読に関わらず、ピン留していない部屋よりピン留した部屋が優先して上に表示されます。
<img width="93" alt="スクリーンショット 2020-02-26 12.52.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/4bc85dad-8e6d-5e37-086b-8adc88bb3529.png">

これはやっている方も多いかなと思います。

### ミュート設定

ほぼ見ることはない、Bot通知や大量にメッセージが来る部屋は不毛ですよね。
とはいっても自分は管理者だったり、すごく例外的にたまには見るので退出することもできない。
という部屋は``ミュート設定``がいいかなと思います。

<img width="243" alt="スクリーンショット 2020-02-26 12.57.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/13feb928-ef71-9223-db8c-7d991a895645.png">

画面右側の歯車マーク→``グループチャットの設定``→``ミュート``で設定できます。

<img width="727" alt="スクリーンショット 2020-02-26 12.58.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/9e1e6385-de55-0e78-b67a-612a2525ca97.png">

ミュート設定するとメッセージを未読として表示しません。
なお、自分宛のToメッセージなどは未読として表示されます。
なので無視してしまったり見失うことはないので便利です。

ミュートにした部屋は「ミュート中のチャット」から確認できるので時間のある時に確認可能です。

### カテゴリ分け

ピン留とミュート設定をある程度した後に、
私は作業集中する時用として最低限必要なカテゴリ設定をしています。

<img width="222" alt="スクリーンショット 2020-02-26 13.00.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/d2c77594-147e-1e9d-b992-42c046d51f91.png">

カテゴリ設定はチャットのカテゴリの「＋」ボタンをクリックすると設定できます。
カテゴリ名とそのカテゴリに紐づけるチャットを選択できるので集中用のカテゴリとでもすればいいかなと思います。
<img width="524" alt="スクリーンショット 2020-02-26 13.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/1e28778a-426d-4267-036d-71e512d9baf0.png">

ここでは仕事に最低限必要なチャットのみを入れるといいです。

すると流れを把握する必要性のある最低限のチャットのみ見つつ、返信しつつ作業できる状況ができます。

### Toがあった時のみデスクトップ通知する

ちなみに少し番外編ですが、
デスクトップ通知は便利ですが、すべてのチャットの通知を出していると集中できずに邪魔すぎます。
この設定をしていなくてバンバン通知来てる人をよく見ますが邪魔じゃないのかな？とよく思います。

<img width="568" alt="スクリーンショット 2020-02-26 13.08.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/f74b5c9f-2c13-f81a-4b83-09a0e3c62211.png">

そんな方は``動作設定``→``デスクトップ通知``→``Toがあった時のみ通知する``がいいと思います。
全てのチャットをリアルタイムに見ていても不毛ですからね。
通知自体が邪魔って人はデスクトップ通知自体をOFFにしてもいいのかなと思います。

とまあ、人によって設定はそれぞれですが、私の個人的な使い方をメモとして記載させていただきました。
Laravel HomesteadでVagrant SSHがなかなかできなかった話

Railsを今までずっとやっていましたが、Laravelも学び始めた時にまず環境構築からだよなぁと思い、Qiita内の記事を参考にしながらComposerオンリーで作ってみたり、Homesteadを使ってみたりとしておりましたが、Homesteadで一日沼にハマってしまったので、こちらに備忘録的に書いておきたいと思います。
皆様の参考になれば幸いです。

とっても参照してお世話になった記事は　「[こちら](https://qiita.com/7968/items/97dd634608f37892b18a)」からどうぞ！

#バージョン情報
PC：Windows10 home 1903
Vagrant 2.2.7
Virtual Box　6.1.2
Composer 1.9.3
Laravel 6.15.1

#Vagrant & Virtual Box
上記各々検索して出てきた公式サイトにてダウンロード可能です。


#Homesatead
こちらでざっと環境開発に必要なプロセスを載せていきます。
１．ホームディレクトリにて

```
vagrant box add laravel/homestead
```

と入力してHomestead専用のVagrant Boxをインストールします。専用のVagrantfileも生成されます。
virtual Boxの番号を聞かれたら3でいいと思います。※この処理に時間がかかります。

２．ユーザーフォルダ直下やCフォルダ直下、デスクトップなどで任意の作業用フォルダを作ります。

３．作業用フォルダ内で

```
git clone https://github.com/laravel/homestead.git Homestead
```

と入力しHomesteadを召喚します。

４．Homeasteadフォルダもできるので、移動して

```
bash init.sh
```

と入力してHomeasteadの初期化を行います（これをやらないと不具合がでるらしい）Homeastead initialized等の文言が出てきたらOK

５．もしSSH鍵を生成していなかったら、

```
ssh-keygen
```

で作っておきましょう。エクスプローラーのユーザ/.ssh内にid_rsaとid_rsa.pubがあればできています。コマンドで

```
ls -la .ssh
```

とかでも見ることができます。

６．Homeasteadディレクトリに移動して、

```
vim homestead.yaml
```
で下記の用な感じに編集します。

```
--
ip: "192.168.10.10" #任意のIPアドレス
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/app #任意の作業用フォルダ
      to: /home/vagrant/Code

sites:
    - map: homestead.test #任意のホスト名
      to: /home/vagrant/Code/Laravel/public #Laravelは作成するプロジェクト名、何でも良い

databases:
    - homestead

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp
```

７．vagrantを

```
vagrant up --provision #provision入れると不具合が起きにくいかと
```

で起動しましょう。

```
The specified host network collides with a non-hostonly network!
This will cause your specified IP to be inaccessible. Please change
the IP or name of your host only network so that it no longer matches that of
a bridged or non-hostonly network.
```

と出てきた場合は、Windows/System32/drivers/etc/hostsを管理者権限のあるエディタで開き、
ipと任意のホスト名を入力してあげましょう。

８．以上が完了したら、

```
vagrant ssh
```

を入力することでSSH接続が完了します。vagrant@homesteadというディレクトリ名に変わってると思います。

```
cd code

composer create-project laravel/laravel --prefer-dist ディレクトリ名 #この処理に時間がかかります

```
とすることで編集するプロジェクトが立ち上がり、編集が可能になります。
ちゃんとサーバーに接続できてるか確認するために、ipアドレスをブラウザに入力してみましょう。


あれ？？？？できない？？？？


#Vagrant SSHができなかった・・・
何回やってもSSH接続ができない！そこで周りの猛者にきいてみたところ、
.ssh/configってなんやこれ？邪魔っぽくね？
というふうに見解をもらったので、すでに生成されているSSH鍵と一緒に右クリック！！！！
新しく鍵を作り直すと、
```vagrant ssh```
でやっと起動できました～！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160101/e468c8de-23fa-5624-f018-2b1f4ab62d7c.png)


#まとめ
Homesteadを利用した環境構築において、
SSHまでやろうとしてもうまく行かない場合は、考えられる原因は
・Windows/System32/drivers/etc/hosts
・Homestead.yaml
・SSH鍵とその仲間.ssh/configファイル
です。ここに入力漏れがないかをみてみましょう。

ありがとうございました。
Nuxt.jsでGTM、GAを設定する

Nuxt.jsでのGoogleタグマネージャーとGoogleアナリティクスの実装をまとめます。

# 前提条件
- Nuxt.jsがインストールされていること

# インストール
各モジュールをインストールする

```shell
$ npm i --save @nuxtjs/google-tag-manager
```

```shell
$ npm i --save @nuxtjs/google-analytics
```

# 使い方

```javascript:nuxt.config.js
module.exports = {
  modules: [
    ['@nuxtjs/google-tag-manager', { id: 'GTM-XXXXXXX' }], // 追記
    ['@nuxtjs/google-analytics', { id: 'UA-XXXXXXXX-X' }] // 追記
  }
}
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [@nuxtjs/google-tag-manager - npm](https://www.npmjs.com/package/@nuxtjs/google-tag-manager)
- [@nuxtjs/google-analytics - npm](https://www.npmjs.com/package/@nuxtjs/google-analytics)
RailsアプリケーションにSlimを導入する方法

# 目的
RailsアプリケーションのテンプレートエンジンをerbからSlimに変更．
具体的には以下のことをしたい．

1. slimを導入
2. 既存のerbをslimに変更
3. rails g controller(or scaffold)した時にerbではなくslimを自動生成するようにする

# 環境
MacOS High Sierra 10.13.6
Rails : 5.2.4.1
Ruby : 2.6.5 


# 1. slimを導入
Gemfileに以下を追記．

```
gem 'slim-rails'
group :development do
 (省略)
    gem 'html2slim'
end
```
`gem 'slim'`も必要と思ってしまいがちですが，`slim-rails`が`slim`に依存しているため，上記のように書けばbundlerさんが勝手に`slim` gemもインストールしてくれます．

`slim-rails`は`rails g controller(or scaffold)`した際にslimも自動生成してくれるgem．つまり最初に書いた3がもう実現できているわけです．このgemのおかげで`config/application.rb`の編集が不要になるので楽．
`html2slim`を導入することで`erb2slim`というコマンドによってerb→slimの変換が行えるように．

そして以下を実行．

```
$ bundle install
```


# 2.既存のerbをslimに変更

```
$ bundle exec erb2slim app/views app/views -d
```

`-d`オプションをつけると，既存の`erb`ファイルを消去してくれます．

# 3. rails g controller(or scaffold)した時にerbではなくslimを自動生成するようにする
1でも書いたように，`slim-rails`を導入した時点でこれは達成されています．

# 目的達成
gemを適切にインストールすればconfigとかいじらなくていいので楽．
ゴリゴリslimで書いていきましょう．
プロキシ環境でDataiku DSSを利用する

# プロキシ環境でDataiku DSSを利用する

## はじめに

Dataiku Data Science Platform（Dataiku DSS）を利用する方法として、[Dataiku DSSをVirtual Boxを使って利用する方法](https://qiita.com/goya1021/items/0b244ffec4a971b0f736)をご紹介しました。今回は、Proxy環境でDataiku DSSを利用する場合の設定方法について紹介します。

## プロキシ情報を設定するには

Virtual Box版のDataiku DSSにプロキシ情報を設定するには、次の２つの設定をします。

- Dataiku DSSの管理者画面でのプロキシ設定
- Dataiku DSSのサーバへのプロキシ設定

## Dataiku DSSの管理者画面でのプロキシ設定

Dataiku DSSでは、Administrator画面でプロキシ情報を設定します。

### 1. 設定画面の表示
Dataikuにログインした後、画面右上のキューブアイコンをクリックして、［Administrator］メニューをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/26f04250-bad0-8328-21cc-c512147035a0.png)
その後、画面右上にある［Settings］タブをクリックしたあと、画面左側にある［Misc］をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/c1fb4a02-55c8-9ab0-a1cb-e8d83856455e.png)

### 2. プロキシ情報の設定
次の２か所でプロキシ情報を設定します。

- HTTP proxyでの設定  
HTTPやFTPでデータを外部から取得する場合や、プラグインやサンプルプロジェクトのダウンロードをする際に、ここで設定した内容が利用されます。
- Code envs extra optionsでのpip installのオプション設定  
［Code Envs］で独自のPython環境を作成して利用する場合に
、ここで設定したオプションが利用されます。

#### 2.1 HTTP proxyでの設定
次の項目にプロキシ情報を入力します。

- HTTP proxy host：プロキシサーバのURLを設定します（例）xxx.co.jp
- HTTP proxy port：プロキシサーバのポート番号を設定します（例）8080
- HTTP proxy username：プロキシサーバで認証を行う場合に、認証ユーザ名を設定します。（例）username
- HTTP proxy password：プロキシサーバで認証を行う場合に、パスワードを入力します。（例）password  
※HTTP proxy username, およびHTTP proxy passwordはプロキシサーバで認証をしない場合は空欄のままします。

#### 2.2 Code envs extra optionsでのpip installのオプション設定

［Extra options for 'pip install'］欄で次のオプションを設定します。  

```
--proxy=http://[username:password@]<proxy host>:<proxy port>

（例）
1. ユーザ認証がある場合
--proxy=http://username:password@xxx.co.jp:8080
2. ユーザ認証がない場合
--proxy=http://xxx.co.jp:8080
```

### 3. 保存する

プロキシ情報を設定した後、画面左側の［SAVE］ボタンをクリックして、設定内容を保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/e10c9b0d-1242-f8f9-b098-7a7461875b65.png)

## Dataiku DSSのサーバへのプロキシ設定

Code envの機能を使って、Python仮想環境を作成する場合は、Dataiku DSSのサーバに対してもプロキシ設定をする必要があります。Dataiku DSSのサーバに対してプロキシ設定をする場合は次のようにします。

### 1. コンソールにログインする
下のコンソールをクリックして、ログインする。ログインする際のユーザ名、パスワードは画面に記載されている情報を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417992/1055cad1-79a6-62c3-9fdf-a83080211775.png)

### 2. 次のファイルを編集する

```
$ vi ~/.bashrc

# 次の内容を記載する。
export http_proxy="http://username:password@xxx.co.jp:8080/"
export https_proxy="http://username:password@xxx.co.jp:8080/"

# 編集後、設定内容を反映する
cd
source .bashrc
```

### 3. 次のコマンドを実行してDataiku DSSを再起動する

```
cd ~/dss/bin
./dss restart
```

## さいごに

プロキシ環境でDataiku DSSを利用する場合の設定方法について紹介しました。
プロキシ環境のもとでDataiku DSSを利用される場合に、よろしければご参考ください。
npmコマンドの直列処理、並列処理の簡単な記述

`npm`コマンドを簡単に記述して、直列処理、並列処理を行います。

# 前提条件
- npmがインストールされていること
- package.jsonがあること

# インストール
```shell
$ npm install -D npm-run-all
```

# 使い方
## 設定

`run-s`の後にコマンドを書くと直列、`run-p`の後にコマンドを書くと並列で処理を行ってくれます。
コマンドを`hello:*`と書くと、当てはまるすべてのコマンドを処理します。

```json:package.json
{
  "scripts": {
    "hello:foo": "echo FOO",
    "hello:bar": "echo BAR",
    "hello-s": "run-s hello:foo hello:bar",
    "hello-p": "run-p hello:*"
  }
}
```

## 実行
`npm`コマンドで`hello-s`または`hello-p`を実行します。

```shell
$ npm run hello-s
```

```shell
$ npm run hello-p
```

## 出力結果

```console
FOO
BAR
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [npm run のスクリプトを連続実行・並列実行する (npm-run-all)](https://maku77.github.io/nodejs/npm/npm-run-all.html)
『Unity C# 個人用メモ』 オブジェクトをクリックした座標へ移動させる（ナビゲーション不使用

#クリックした位置の座標を取得し移動させる
`Ray`と`RaycastHit`を使用してオブジェクトをクリックした座標へ移動させる
Rayをちゃんと理解してないから推測込み('ω')難しいのよね

###前提として
プレイ画面(スクリーン座標)は2Dなのでそれをゲーム上の3D空間(ワールド座標)へ変換する必要がある

###素材
```
public class NewBehaviourScript : MonoBehaviour
{
    //レイを使用するための宣言
    private Ray ray;

    //レイがヒットした情報を格納するために使う
    private RaycastHit hit;

    //移動先の座標格納用
    private Vector3 pos;

    //移動用
    private float step;
```
###本文
```
    void Update()
    {
        //クリックされた時
        if (Input.GetMouseButtonDown(0))
        {
            //レイのスタート位置
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            //レイキャスト(スタート位置,方向 情報,距離)
            if (Physics.Raycast(ray, out hit, Mathf.Infinity))
            {
                //座標posへhitを変換
                pos = hit.point;
                pos.y = 1f;
            }
            //移動用
            step = 10f * Time.deltaTime;
        }
        //オブジェクトの移動
        transform.position = Vector3.MoveTowards(transform.position, pos, step);
    }
}
```

###ray
そもそも`ray`(レイ)ってなんぞやっていう疑問
特定の位置からセンサーを飛ばすって意味と推測してるけど実際どうなんだろう？

```
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
```
`ray`を飛ばすスタート地点を宣言

`Camera.main.ScreenPointToRay()`
プレイ画面上のどこから飛ばすかを設定する
今回はマウスがクリックされた時のマウスの位置を取得しなければならないので
スタート地点は`Input.mousePosition`となる

###Raycast        
```
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
///Physics.Raycast(スタート地点, レイと飛ばす方向 レイが当たったオブジェクトの情報を格納, レイを飛ばす距離)
```
※`Physics.Raycast()`はRaycastHitを使う際の決まり文句

※`ray`はレイを飛ばすスタート地点のこと

※`out`はどの方向にレイを飛ばすかということ
・補足：今回は`out`なのでカメラの目線からout(奥側)となる(決まり文句でいいのかなと思う)

※` hit`はレイキャストで飛ばしたレイが接触したオブジェクトの情報の格納先のこと
・補足：今回は変数`hit`に座標とか名前とか色々な情報が格納される

※`Mathf.Infinity`は飛ばすレイの最大距離のこと{最大射程とか言った方が分かりやすい？}
・補足1：レイの飛ばす距離は`float型`であり、100f等とすれば範囲を制限できる
　　　　　(途方もなく遠い場所にあるオブジェクトに反応しないようにするため)
・補足2：逆に別に範囲を制限しないのであれば`Mathf.Infinity`と書けば距離は無限大になる

###その後
```
pos = hit.point;
pos.y = 1f;
```
`Vector3 pos`へ`hit.point`(hitの場所つまり座標)を変換して格納する
なお`y軸`は動いてほしくないのでオブジェクトの初期の設定値を入れる

```
step = 10f * Time.deltaTime;
```
これは移動速度の値10fに`Time.deltaTime`を与えることでマシンスペックに関係なく処理速度を一定にする

###Vector3.MoveTowards()
```
transform.position = Vector3.MoveTowards(transform.position, pos, step);
///transform.position = Vector3.MoveTowards(対象, 移動先, 速度);
```
`Vector3.MoveTowards()`で対象を移動先まで移動させることが出来る
今回は`本体`を`クリックされた座標`へ設定された`速度`で移動させる。となる
OMCでOracle Databaseを監視する①

では実際に、Oracle Management CloudのOracle Databaseモニタリングの画面からDBの状態を監視していきます。

以下のパフォーマンス・チャートをクリックすると、デフォルト設定されたメトリックが表示されます。このメトリックは、データベースやミドルウェアの製品に合わせて事前作成されています。デフォルト以外のメトリックを追加する場合は、チャートの追加をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1692e904-c52f-c33e-95a5-9835aa4c2325.png)

- 定義済みのメトリックを追加可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/db82a3a4-79a6-ccaf-3b5c-7a4d60b1b431.png)

ここでは、数あるメトリックの中から代表的なものを以下に紹介します

- Top Wait Events関連メトリック
    - パフォーマンス・チューニングで気になるTop Wait Event系の情報ですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3aa227f2-f26b-63ff-2bdb-206dbecaceea.png)

- Latency関連メトリック
    - Logfile SyncやSequential Readもチューニングポイントのひとつです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/0a12e202-3712-f4e4-c81f-bd6a0018d0c8.png)

- Database Activity関連メトリック
    - ざっくりとデータベース全体の状態を監視します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/687d216d-c33b-5856-a53d-d22d0ccf9e52.png)

- Load関連メトリック
    - I/Oやトランザクションの処理状況が気になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/19cd7942-5c61-1e4a-7d26-b1c7108d3059.png)

- Instance Load関連メトリック
    - Physical Read/Write, REDO WriteなどのDisk I/O分析は重要ですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/169ef0c1-d07b-c2d0-a191-c5c36626a112.png)

- Efficiency関連メトリック
    - Cache HitやSoft ParseはチューニングのMustアイテム
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/ad206616-d75e-18df-926d-f0dce91937d2.png)

- Storage関連メトリック
    - Recovery Areaの不足、ディスクスペースの枯渇はDB停止の危機です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9df87138-3535-ddec-1c83-807d423e0f3b.png)

ASMも監視対象にしていれば、同様にASMメトリックも参照可能です

- Disk Group Usage関連メトリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/ef7e0b0e-c8a1-bd1f-13d8-8111df354429.png)

- Database Disk Group Performance関連メトリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/268be8c0-1fc7-283e-2301-654a107e0787.png)

- リスナーのメトリックというのもあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9ee889e8-6610-376a-729c-245c1ccbf334.png)

これらのモニタリング機能はOMCのInfrastructure Monitoringのサービスで提供されています。このデータは過去2週間分まで遡って検索することが可能です。
また、特定のしきい値を超えた場合にアラート情報をメールやSlack、Webhookで通知するなどの使い方も可能です。

Infrastructure Monitoringは、データベースサーバーの詳細分析をしていく際に非常に有効ですが、データベースの数十～数百となっていくと監視が非常に煩雑になっていきます。
その場合はOMCのIT Analyticsのサービスを活用することによって、横断的にサーバーの監視から詳細分析をするというアプローチが効果的です。

次は、IT Analyticsによるデータベースの監視について紹介します。
[OMCでOracle Databaseを監視する②](https://qiita.com/western24/items/aea534e1570f06620396)

Oracle Management Cloud関連の情報は[こちら](https://qiita.com/western24/items/1e44bfcaa77f3251a263)
Kotlin入門:オブジェクト宣言


##オブジェクト宣言
アプリの設定情報のように、
一つしかインスタンスを持たないクラスを用意したいことがあります。
このような場合に使用する仕組みをオブジェクト宣言と言います。

オブジェクト宣言の一般的な構文は以下の通りです。

```Kotlin
object name{ body }
```
`name`:オブジェクト名
`body`:オブジェクトの本体

以下は入力例です。

```Kotlin
object MyApp{
    var name = "Kotlin"
    var author = "Kotlin Project"
    fun show(){
        println("${name}:${author}")
    }
}
fun main(){
    MyApp.show()
}
```

クラスではなくインスタンスそのものの宣言なので、
コンストラクターは持てません。


##オブジェクト式

Androidのアプリ開発では、イベントリスナーの宣言など、
その場限りのクラスを定義したいということがよくあります。

オブジェクト式の一般的な構文は以下の通りです。

```Kotlin
object: parent{ body }
```

`parent`:基底クラスまたはインターフェース
`body`:クラス本体

入力例:

```Kotlin:MainActivity.kt
btn.setOnClickListener(object: View.OnClickListener{
  overtire fun onClick(view:View){
    Log.v("Kotlin","Clicked!")
  }
})
```

##コンパニオンオブジェクト

クラス内部でのオブジェクト宣言のことです。
以下はインスタンス生成するためのマーケットメソッド(任意のメソッド名で可)を、
コンパニオンオブジェクトで定義する例です。

```Kotlin
class Person private constructor(var name:String){
    companion object Market{
        fun getInstance():Person{
            return Person("山田")
        }
    }
    override fun toString():String{
        return "Person:${this.name}"
    }
}
fun main(){
     val person = Person.getInstance()
     println(person)
}
```

実行結果は以下の通りです。

```Kotlin
Person:山田
```

ここで`Person`クラスを`private`宣言しているので、
クラス外部からはインスタンス化できません。
コンパニオンオブジェクトには`companion`キーワードを付与するだけです。
コンパニオンオブジェクト配下のメンバーは「クラス名.メンバー名」で呼び出せます。
JavaScriptで音声読み上げテスト

JavaScriptで音声読み上げのテストPGMを作成しました(空白を読み上げたい場合、'。'を記入)

参考にしたサイト
<a href="https://codepen.io/AnTytle/pen/wayGvO">再生、一時停止、再開ボタン - Speech Synthesis API</a>

githubURL: https://github.com/NanjoMiyako/TextYomiageTest

サンプルページURL: https://nanjomiyako.github.io/TextYomiageTest/
Promiseとasync/awaitの使い方

非同期で処理するためのPromise、async/awaitの基本的な使い方をまとめました。
詳しく知りたい方は参考文献をご確認ください。

# Promise
## Promiseオブジェクトを返す

```javascript
return new Promise((resolve, reject) => {})
```

## Promiseの結果を返す
### resolveする
Promiseのresolveを実行する

```javascript
return new Promise((resolve, reject) => {
  resolve('成功です')
})
```

### rejectする
Promiseのrejectを実行する

```javascript
return new Promise((resolve, reject) => {
  reject('失敗です')
})
```

# async/await
## 処理の結果を待つ

```javascript
async function sample() {
  const result = await samplePromise()
  console.log(result.data)
}
```

## 並列で処理する

```javascript
async function sample() {
  const array =[5, 10, 15]
  const promiseAll = await Promise.all(
    array.map(async (value) => {
      return await samplePromise(value)
    })
  )

  return promiseAll
}
```

## 例外処理(エラーハンドリング)

```javascript
async function errorHandling() {
  try {
    const result = await throwError()
    return result
  } catch (err) {
    throw err
  }
}
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [async/await 入門（JavaScript）](https://qiita.com/soarflat/items/1a9613e023200bbebcb3)
MacでDBeaverのdbeaver.iniを編集する方法

## 背景
DBeaverでタイムゾーンが９時間ずれる問題が発生し、ググって「dbeaver.iniを編集すれば良い」ということはわかったものの、mac初心者の私はmacで編集する方法が分からずしばらくはまってしまったのでメモ
（環境はmacbook pro,macOS Mojave）

## 編集方法
1.FinderでDBeaverを右クリック（２本指クリック）し、「パッケージの内容を表示」
2.Contents/Eclipseの直下にdbeaver.iniがある。任意のエディタで編集する。
SendGridのテンプレート+PHPでメール送信

## はじめに
SendGridのテンプレートを利用するメールの送信を実装したけど、公式のドキュメントが古くて参考にならないかつ思ったより参考記事が少なかったのでまとめました。

## インストール
パッケージをComposerでインストール
https://github.com/sendgrid/sendgrid-php

```json:composer.json
{
    "require": {
          "sendgrid/sendgrid": "~7"
    }
}
```

```
$ composer install
```

## テンプレート作成
SendGridのコンソール画面からEmail API>Dynamic Templatesを選択
<img width="553" alt="スクリーンショット 2020-02-20 17.55.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/c21b5e7f-d2c7-9882-b262-3196d4b637ce.png">

Create a Dynamic Templateで新しいテンプレートを作成
こんな感じで作成されたテンプレートが表示されます
<img width="1283" alt="スクリーンショット 2020-02-20 18.02.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/1e6deb1c-4a1f-3f04-ab80-9292ec317e47.png">
赤で囲っているTemplate IDを後でコード内で呼び出します。

Add Versionからメールテンプレート本文を作成していきます。
今回はこんな感じに作成しました。
<img width="733" alt="スクリーンショット 2020-02-20 18.32.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/e2cb909a-1ec5-d4b3-56a1-e5d5829f1e63.png">
{{}}で囲まれた部分に文字を埋め込むことができます。

テンプレートの詳しい作成方法はこちらを参考にどうぞ
[テンプレートを適用して送信する(Dynamic Transactional Template編)](https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/using_dynamic_templates.html)


## メールを送信する
以上で作成したテンプレートを使ってメールを送信していきます。

```php
$email = new SendGrid\Mail\Mail();
$email->addTo('to_address@mail.com');
$email->setFrom('test@info.test', '送信元表示名');

// SendGridのコンソール上で作成したテンプレートのIDを設定
$email->setTemplateId($template_id);

// メールテンプレートに埋め込む文字列を設定する
$email->addDynamicTemplateData('name', '田中樹'); 
$email->addDynamicTemplateData('url', 'http://hoge.hoge');

// SendGridのAPIキーを設定
$sendgrid = new SendGrid($api_key);

// 送信
$sendgrid->send($email);
```
これで送信すると、以下のようにメールが届きます。

<img width="621" alt="スクリーンショット 2020-02-20 18.56.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/140aceb9-ee2a-a171-adc2-e4ae225fba78.png">


今回は作成していませんが、{{}}で囲めばhtmlで作成したテンプレート内でも文字列の置き換えは反映されました。

手探りの実装になりましたが、もし間違いがありましたらご指摘ください。
$usesは1度使用しないとmodelから定数を呼び出せない

詳しくは調べていないので自分用メモ

    public $uses = array(
        'Hoge',
    );

    $this->Hoge->find();

    $fuga = Hoge::fuga;

上記はOK


    public $uses = array(
        'Hoge',
    );

    $fuga = Hoge::fuga;

この場合はエラー


    App::uses('Hoge', 'Model');

    $fuga = Hoge::fuga;

これもOK
＃自分用メモ　DartでExtension Methodを作る

#DartでExtension Method を作ってみる

KotlinでもあったExtension Method(kotlinではExtension function)、Dartでも使いたいなーと思ったら実装されてた

###そもそも何？
クラスに独自のメソッドをあと付け出来る機能。便利。

###インストール

```yaml:pubspec.yaml
environment:
  sdk: ">=2.6.0 <3.0.0"
```

Extension Methodはver2.6で実装されたので、それ以下の場合sdkのバージョンを変更する必要がある

###実装
```dart

extension E on DateTime{
   bool past() {
    return this.isBefore(DateTime.now());
  }
```

kotlinと違うのは、外付けクラスを作成すること。↑では**"E"**がそう（適当な名前）
レファレンスではメソッド名のバッティングを避けるためらしい。
そのあとに　**on ○○**（クラス名）とターゲットのクラスを書く。
秘密鍵の共有「Secret Manager」

# 前置き
:warning:基本、秘密鍵の共有はよろしくないので、そちらを許容できる方のみ対応ください。

EC2のキーペアのプライベートキーの管理をどのように共有するかを模索していた段階でしたが、AWS Secret Managerで実現できそうなので、検証してみました。

# AWS Secret Manager
[【AWS公式】AWS Secrets Manager](https://aws.amazon.com/jp/secrets-manager/)
>アプリケーション、サービス、IT リソースへのアクセスに必要なシークレットの保護
データベースの認証情報、API キー、その他のシークレットをそのライフサイクルを通して容易にローテーション、管理、取得できるようにします。

秘匿情報の管理をこいつはやってくれます。

# 秘密鍵をバイナリデータで登録
※バイナリデータの登録・参照・取り出しは、AWSマネジメントコンソールではサポートされておらず、AWS CLIやSDKを使う必要があります。

## 登録用のシェル
```register.sh
#! bin/bash
if [ -z "$1" ]; then
    echo "引数を入力してください"
    exit
else
    KEYPAIR_NAME=$1
    aws secretsmanager create-secret \
        --name ${KEYPAIR_NAME} \
        --secret-binary file:///data/secret-manager/keypair/${KEYPAIR_NAME}.pem
    aws secretsmanager get-secret-value \
        --secret-id ${KEYPAIR_NAME}
fi
```

## 登録シェル実行
```shell:
$ sh register.sh [秘密鍵の名称（.pem除く）]
```
## コンソールで確認
一応、コンソール画面で登録されているか確認してください。
![Screenshot from 2020-02-26 11-39-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/568d4eba-4c44-0ddc-6694-4d76bad9b849.png)

# 秘密鍵を取り出し、ファイルで保存する
他の人が、登録した秘密鍵を取得する目線で、やっていきます。
先程、登録したシークレットキーを取得します。

## 取り出し用のシェル
```getValue.sh
#! bin/bash
if [ -z "$1" ]; then
    echo "引数を入力してください"
    exit
else
    KEYPAIR_NAME=$1
    aws secretsmanager get-secret-value \
        --secret-id ${KEYPAIR_NAME} \
        --query 'SecretBinary' \
        --output text \
        | base64 -d > ./get-keypair/${KEYPAIR_NAME}.pem
fi
```

## 取り出しシェル実行
引数の名称で、シークレットキーを取得してきます。

```shell:
$ sh getValue.sh [秘密鍵の名称（.pem除く）]
```
これでファイルが保存され、秘密鍵として使用できると思います。
# 参考サイト
- [【AWS CLI】secretsmanager create-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/create-secret.html)
- [【AWS CLI】secretsmanager get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html)
Linuxのプロセス管理コマンドを触って学習する〜その①〜

LPICレベル1の学習をしていく中で、プロセス管理のコマンドあまり知らないことに気づいたのでまとめることにした。
# テスト用シェル
5秒間隔でプロセス名とカウンタを表示する以下のシェルを作成。

~~~bash:Process.sh
#!/bin/bash

count=0
while true;do
  echo "${1}: ${count}"
  count=$(expr $count + 1)
  sleep 5
done
~~~

# プロセス実行
プロセスをフォアグランドジョブで実行。

~~~
$ ./Process.sh Process1
Process1: 0
Process1: 1
Process1: 2
Process1: 3
・・・・
・・・
停止するまで続く
~~~
## psコマンド

別端末でpsコマンドの実行。

~~~
$ ps
  PID TTY          TIME CMD
16400 pts/7    00:00:00 bash
16699 pts/7    00:00:00 ps

~~~

psだけだと現在の端末から起動したシェルのみ表示される。
以下はpオプションを付けて指定したPIDのみ表示。

~~~
$ ps
  PID TTY          TIME CMD
 5507 pts/1    00:00:00 bash
 5570 pts/1    00:00:00 ps
$ ps -p 5507
  PID TTY          TIME CMD
 5507 pts/1    00:00:00 bash
~~~

eオプションで全てのプロセス表示、fオプションで詳細表示

~~~
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2月25 ?      00:00:22 /sbin/init splash
root         2     0  0  2月25 ?      00:00:00 [kthreadd]
root         3     2  0  2月25 ?      00:00:00 [ksoftirqd/0]
・・・続く
~~~

pstreeでプロセスをツリー状に表示する。

~~~
$ pstree
systemd─┬─ModemManager─┬─{gdbus}
        │              └─{gmain}
        ├─NetworkManager─┬─dhclient
        │                ├─dnsmasq
        │                ├─{gdbus}
・・・以下略
~~~

## bgコマンドとfgコマンド
Process.shを実行している端末でCtrl+zで一時停止し、bgコマンドでバックグラウンドジョブに切り替え。

~~~
・・・略
Process1: 94
Process1: 95
Process1: 96
Process1: 97
Process1: 98
^Z
[1]+  停止                  ./Process.sh Process1
$ jobs　#バックグラウンドと一時停止中のジョブを表示
[1]+  停止                  ./Process.sh Process1
$ bg %1 #バックグラウンドジョブに切り替え
[1]+ ./Process.sh Process1 &
$ jobs
[1]+  実行中               ./Process.sh Process1 &
$ fg %1 #フォアグランドジョブに切り替え
^C #Ctrl+ｃでプロセス終了
$ ps
  PID TTY          TIME CMD
16108 pts/3    00:00:00 bash
25783 pts/3    00:00:00 ps
~~~

テスト用シェルの標準出力が邪魔になってしまったので、[次回](https://qiita.com/r_saiki/items/4318adc7c8a642b68c4f)はechoを無しにして、プロセスの優先度変更をやってみる。
#Stripe API + Ruby / WebHookRequest 設定でエンドポイントのURLを変更する例

ngrokを利用していると、毎回WebConsoleから設定を変えるのはなかなか面倒だが、設定変更さえAPI経由で可能みたいだ。いいね。

```rb
Stripe::WebhookEndpoint.update('we_xxxxxxxxxxxxxxxxxxxxxxx', {url: 'https://example.com/'})
```


# エンドポイントを一覧するには

```rb
Stripe::WebhookEndpoint.list
```



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Unity]音楽が再生されない

# 事象
Unityで`UnityWebRequestMultimedia.GetAudioClip`を実行した際に下記のエラーが発生

```
unity Streaming of 'mpeg' on this platform is not supported local
```

# 対処法
Build Settings>Platformを変更したら解決された。
Unityの設定を変更している時にPlatformが変わってしまったよう。
AWS RDS MySQLについて知らなければならない最も大切なこと

AWS RDS MySQLについて知らなければならない最も大切なことを簡単に、簡潔にご紹介しようと思います、

**メジャーバージョンをあげるな。**

特にフロントエンドまわりの方は、バージョンを最新にあげるのが最低限のマナーだと思っている方が多いかと思います。私もそうです。しかしながら、AWS RDS MySQLはバージョンを最新にすると使えなくなるサービスが多々あります。ざっとあげると

- Amazon Aurora MySQL（MySQL5.6/5.7のみレプリケーション可能）
- RDSパフォーマンスインサイト （MySQL5.6/5.7のみ可能）

まだこのふたつは問題ありません。Auroraは別途のチューニングが必要ですし、パフォーマンスインサイトは分析しなければ利用しなければいいだけです。致命的なのは

- Amazon RDS Proxy （MySQL5.6/5.7のみ可能）


> 現在、MySQLバージョン5.6または5.7で実行されるAmazon RDS MySQL、または、Aurora MySQLをサポートしています。
https://aws.amazon.com/jp/blogs/news/using-amazon-rds-proxy-with-aws-lambda/

いや、プレビュー版なのはわかってます。けど、Lambdaでコネクションプールを考えるとRDS Proxyはまさに救世主でプレビュー版でも本番に投下したかったのです。私のプロダクション環境はRDS MySQL8系なので上記は一切使えませんが。Lambdaで環境構築をすませましたが、ElasticBeanstalkに切り替えます・・・。

使う予定はない？私もなかったです。けど、使いたくなるときはいつくるかわかりません。

AWS RDS MySQL使うなら「最新バージョンにしよう」とか思わずに、5.7のマイナーアップデートにしておくことをおすすめします。
それでは、また。
COTOHA アクセストークンの取得 (PHP)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

```php:acess_token.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//	access_token.php
//
//						Feb/26/2020
//
// ------------------------------------------------------------------
include('Requests/library/Requests.php');
require_once './vendor/autoload.php';

fputs (STDERR,"*** 開始 ***\n");

Requests::register_autoloader();

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$client_id = getenv("CLIENT_ID");
$client_secret = getenv("CLIENT_SECRET");
$url_base = getenv("DEVELOPER_API_BASE_URL");
$url_publish = getenv("ACCESS_TOKEN_PUBLISH_URL");

$data = array('grantType' => 'client_credentials','clientId' => $client_id,
		'clientSecret' => $client_secret);
$str_json = json_encode ($data);
$headers = array('Content-Type' => 'application/json');

$request = Requests::post($url_publish, $headers, $str_json);

var_dump($request->status_code);

print("-----------\n");
var_dump($request->body);
print("-----------\n");

$json_string = $request->body;
$dict_aa = json_decode ($json_string,true);
print($dict_aa["access_token"] . "\n");

fputs (STDERR,"*** 終了 ***\n");

// ------------------------------------------------------------------
?>
```

実行結果

```text
$ ./acess_token.php
*** 開始 ***
int(201)
-----------
string(249) "
          {
            "access_token": "7Zj26srl557J3ffR********", 
            "token_type": "bearer",
            "expires_in": "86399" ,
            "scope": "" ,    
            "issued_at": "1582683782964"           
           }
        "
-----------
7Zj26srl557J3ffRGfbdWYAbCT8U
*** 終了 ***
```
[初心者向け]pythonでsayコマンドなどのやり方！

#プログラム
```python:say.py
import discord
from discord.ext import commands


token = "" #tokenを指定してね
client = commands.Bot(command_prefix="!") #prefixを設定(!の部分は好きに変えてね(例の場合は、!say <メッセージとなる>))
client.remove_command('help') #helpコマンドはいらないので削除

@client.command()
async def say(ctx, *, message):
    await ctx.send(message)


@client.command()
async def channelsay(ctx, channelid, *, message):
    channel = await client.fetch_channel(channelid)
    await channel.send(message)


client.run(token)
```
#終わり
多分これで行けるはず...(未確認)
このプログラムを使えば、!say <メッセージ>や、!channelsay <チャンネルid> <メッセージ>でメッセージを送信できる(はず)。
メモ②-SELECT文の基本-

【仮定・予備知識】
「->」←これはEnterキーで改行したことを表す記号。
MySQLでは、「;」を入力しない限り、いくらでも改行することができる。
また、「SELECT *」の「*」印は、「すべての項目」を扱いたいときに使うもの。


①練習用データベース「company」のemployeeテーブルを、コード順に並び替えたいとき

昇順に並べる場合↓
MariaDB [company]> SELECT *
    -> FROM
    -> tbl_employee;
もしくは
MariaDB [company]> SELECT * 
    -> FROM
    -> tbl_employee
    -> ORDER BY
    -> code ASC;

降順に並べる場合↓
MariaDB [company]> SELECT *
    -> FROM
    -> tbl_employee
    -> ORDER BY
    -> code DESC;

②companyデータベースのemployeeテーブルから「伊藤英樹」を抽出する場合
MariaDB [company]> SELECT *
    -> FROM
    -> tbl_employee
    -> WHERE
    -> name = "伊藤英樹";

③companyデータベースのemployeeテーブルから血液型A型の人を抽出する場合
MariaDB [company]> SELECT *
    -> FROM
    -> tbl_employee
    -> WHERE
    -> blood = "A";

④companyデータベースのemployeeテーブルから基本給(basic_salary)が23万円以上の人を抽出する
MariaDB [company]> SELECT *
    -> FROM
    -> tbl_employee
    -> WHERE
    -> basic_salary >= 230000
    -> ORDER BY
    -> basic_salary ASC;


⑤companyデータベースのemployeeテーブルからコード(code)と基本給(basic_salary)だけを表示し、
基本給が23万円以上の人だけを抽出する
MariaDB [company]> SELECT
    -> code,basic_salary
    -> FROM
    -> tbl_employee
    -> WHERE
    -> basic_salary >= 230000
    -> ORDER BY
    -> basic_salary ASC;

・・・③へ続く
tfenv を update して bash のエラーで失敗するときの対処法

# 環境
- macOS Catalina 10.15.3
- anyenv + tfenv
- zsh 5.8
- bash 3.2.57(1) (OS default)

# 状況
`tfenv` を [anyenv-update](https://github.com/znz/anyenv-update) で更新したところ `2.0.0-beta1` が install された。

```console
❯ tfenv -v  
tfenv 2.0.0-beta1
```

その状況で `list` などのサブコマンドを実行すると

```console
❯ tfenv list
/Users/nekottyo/.anyenv/envs/tfenv/bin/tfenv: line 107: @: unbound variable
```

となる。

## 対応
`brew install bash` をして `bash` を更新する

```console
❯ brew install bash      
(snip)
❯ bash --version       
GNU bash, version 5.0.16(1)-release (x86_64-apple-darwin19.3.0)

❯ tfenv list   
  0.12.13
* 0.12.8 (set by /Users/nekottyo/.anyenv/envs/tfenv/version)
  0.11.14
  0.11.13
```
xDebug使ってたらマジカル定数__FILE__や__DIR__でエラーや期待しない動作をする

vscodeでxDebugつかってデバッグしてるときにハマったので備忘録。
間違いなどあれば教えて下さい:bow_tone1:

### 現象
```
// ↓がtrueになるべきケースでもfalseしか返さない。
if ( file_exists( __DIR__ . '/hoge.php') ) {
}
```

### 原因
参考記事によれば、xDebugがデバッグ時にマジカル定数を動的に生成しているため。
デバッガを噛まさなければ、この問題は起きない。

```__FILE__``` は ```xdebug://debug-eval```に評価されるし、
```__DIR__``` は ```xdebug:```に評価される。
```dirname(__FILE__)``` は ```xdebug:```に評価される。
```dirname(__DIR__)``` だと、期待するパスに評価される。

```dirname(__DIR__)```以外の解決方法としては、先に```$dir = __DIR__;```と代入してしまって、動的生成の影響を受けないようにする。

ただ、```dirname(__DIR__)```にしても、```$dir = __DIR__;```にしても、コードをパット見たところ冗長な感じはするし、デバッガの都合がコードの入り込むのは違和感しかないので、好きではないなー。

### 参考
[php - xDebug weird \_\_DIR\_\_ constant - Stack Overflow](https://stackoverflow.com/questions/21254661/xdebug-weird-dir-constant)

[php - Uncaught exception 'ErrorException' in xdebug://debug-eval - Stack Overflow](https://stackoverflow.com/questions/41745897/uncaught-exception-errorexception-in-xdebug-debug-eval)
#Stripe API / Delete all metadata key and value  in Stripe object/ Ruby gem

update and empty value. it works.

```rb
# Set metadata
Stripe::SubscriptionSchedule.update(subscription.schedule.id, metadata: { a: "1", b: "2"}).metadata
# => #<Stripe::StripeObject:0x2b194861e680> JSON: {
#  "a": "1",
#  "b": "2"
# }

# NG
# Update with empty Hash
Stripe::SubscriptionSchedule.update(subscription.schedule.id, metadata: { }).metadata
# => #<Stripe::StripeObject:0x2b19485d9fa8> JSON: {
#  "a": "1",
#  "b": "2"
# }

# NG
# Update with nil
Stripe::SubscriptionSchedule.update(subscription.schedule.id, metadata: nil).metadata
# => #<Stripe::StripeObject:0x2b19485b1f80> JSON: {
#  "a": "1",
#  "b": "2"
# }

# OK
# Update with empty string
Stripe::SubscriptionSchedule.update(subscription.schedule.id, metadata: "").metadata
# => #<Stripe::StripeObject:0x2b194858a32c> JSON: {
# } 

```


[deleting Metadata · Issue #637 · stripe/stripe-dotnet](https://github.com/stripe/stripe-dotnet/issues/637)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Laravel] Collection の順番を逆にしたいけどキーが邪魔になるとき

Laravel の Collection は `reverse()` メソッドによって逆順に並び替えることができます。
しかし以下のようにキーが付与（*1)されてしまうので、思い通りの比較ができないことがあります。

```php
$collection = collect(['a', 'b', 'c', 'd', 'e']);

$reversed = $collection->reverse();
/*
    [
        4 => 'e',
        3 => 'd',
        2 => 'c',
        1 => 'b',
        0 => 'a',
    ]
*/

$otherCollection = collect(['e', 'd', 'c', 'b', 'a']);

echo $otherCollection === $reversed;
// false
```

そうじゃないんだよ、欲しいのは `['e', 'd', 'c', 'b', 'a']` なんだよって時は
`values()` メソッドでキーを削除（*2）しちゃいましょう。

```php
$collection = collect(['a', 'b', 'c', 'd', 'e']);

$reversed = $collection->reverse()->values();
/*
    ['e', 'd', 'c', 'b', 'a']
*/

$otherCollection = collect(['e', 'd', 'c', 'b', 'a']);

echo $otherCollection === $reversed;
// true
```


*1 「付与」→正確には「保持」
*2 「削除」→正確には「リセット」
説明は次の項にて

## なぜなのか？
前項で使った「付与される」という表現は正確ではなく、 Laravel のドキュメントにもある通りキーが**保持**された結果として、「新たにキーが付与された」ように見えているだけです。
[コレクション](https://readouble.com/laravel/6.x/ja/collections.html)

前提としてPHPでは、全ての配列は以下のようにキーを持っています。

```php
$array = ['a', 'b', 'c', 'd', 'e'];
/*
    [
        0 => 'a',
        1 => 'b',
        2 => 'c',
        3 => 'd',
        4 => 'e',
    ]
*/
```

さて、 Collection の `reverse()` では PHP の `array_reverse()` を利用していますが、
第２引数に `true` を指定しているのにご注目👀

```php
    public function reverse()
    {
        return new static(array_reverse($this->items, true));
    }
```

`array_reverse()`の第２引数は`preserve_keys`「キーを保持」するパラメーターです。
[array_reverse](https://www.php.net/manual/ja/function.array-reverse.php)

PHP の配列の世界で表現するとこんな感じ。

```php
$array = ['a', 'b', 'c', 'd', 'e'];
$otherArray = ['e', 'd', 'c', 'b', 'a'];
/*
    [
        0 => 'e',
        1 => 'd',
        2 => 'c',
        3 => 'b',
        4 => 'a',
    ]
*/

$reversed = array_reverse($array, true);
/*
    [
        4 => 'e',
        3 => 'd',
        2 => 'c',
        1 => 'b',
        0 => 'a',
    ]
*/

echo $otherArray === $reversed;
// false
// キーが一致しないので別の配列
```

Laravel の`values()`では、`array_values()`を呼び出しています。

```php
    public function values()
    {
        return new static(array_values($this->items));
    }
```

`array_values()` は配列の値を取り出してキーを振り直すメソッドなので、以下のように欲しい配列を取得することができるんですね。
[array_values](https://www.php.net/manual/ja/function.array-values.php)


```php
$array = ['a', 'b', 'c', 'd', 'e'];
$otherArray = ['e', 'd', 'c', 'b', 'a'];

$reversed = array_values(array_reverse($array, true));
/*
    [
        0 => 'e',
        1 => 'd',
        2 => 'c',
        3 => 'b',
        4 => 'a',
    ]
*/

echo $otherArray === $reversed;
// true

// 配列でやるなら単純にこれでもいい
$reversed2 = array_reverse($array, false);
/*
    [
        0 => 'e',
        1 => 'd',
        2 => 'c',
        3 => 'b',
        4 => 'a',
    ]
*/

echo $otherArray === $reversed2;
// true
```
sshでGitLab2段階認証リカバリーコードを再発行

# 2段階認証の端末をなくし、リカバリーコードもないが、秘密鍵は残っていてsshはできる場合

運用者に問い合わせしなくても、 ssh でリカバリーコードを再発行できます。
助かりました。

https://docs.gitlab.com/ee/user/profile/account/two_factor_authentication.html#generate-new-recovery-codes-using-ssh

```sh
$ ssh git@gitlab.com 2fa_recovery_codes
Are you sure you want to generate new two-factor recovery codes?
Any existing recovery codes you saved will be invalidated. (yes/no)
yes

Your two-factor authentication recovery codes are:

****************
****************
****************
****************
****************
****************
****************
****************
****************
****************

During sign in, use one of the codes above when prompted for
your two-factor code. Then, visit your Profile Settings and add
a new device so you do not lose access to your account again.
```

# 教訓

リカバリーコードはちゃんと控えておきましょう
Apache Lucene

Apache Luceneについて調べたことを自分なりに纏める。

・オープソースのスケーラブルな全文検索エンジンライブラリである。
・全文検索とは、テキストの全文に対して、指定した文字列で検索を行う検索方法である。
Javaで記述されている
・1000万ドキュメントの規模までは一台のマシンで対応でき、それ以上は複数のマシンで分散処理で検索できるようにHadoopを使用する
・Elasticsearchのベースシステムとして、採用されている。Luceneのラッパーのイメージである
Devlopers Summit 2020 t_wada氏 「質とスピード」所感

## 初めに
Developers Summitは毎年参加していますが、印象に残ったセッションを紹介します

**13-B-4**
**質とスピード**
**和田 卓人[タワーズ・クエスト]**

安定のt_wadaさん
昨年と思っていましたが、一昨年の螺旋の話も秀逸でした
[技術選定の審美眼 / Understanding the Spiral of Technologies](https://speakerdeck.com/twada/understanding-the-spiral-of-technologies)

質とスピードということで、納期が近づくとテストを簡素にしてそれらしく動くシステムを作って凌ぐのは良く(?)聞くお話ですが、ここらへんの考察がどんなものか、すごく興味がありました

本番リリース後爆発して、リカバリ作業でデスマーチが展開されるのは分かりきっている事で、スコープを狭めるのが良きとされていますが、大人の事情でそうもいかず...

スライドはこちら
[質とスピード（2020春版） / Quality and Speed 2020 Spring Edition](https://speakerdeck.com/twada/quality-and-speed-2020-spring-edition)


## セッションのポイント

- 品質には内部品質と外部品質がある
- 内部品質は、Maintainability, Flexibility, Portability, Re-Usability, readability, Testability, Undarstandabilityから構成される
- コードをクリーンにするのは、後でやれば良いというが、コードのクリーナップはされることはない、リリースした瞬間から新機能開発が始まるから
- 内部品質が良くないと、保守作業に時間がかかってしまう。これは中長期的には明らかなマイナス
- スピードを落とせば品質は上がるのか？
- ダメなコードを書く人は、時間があってもなくてもダメ
- その逆もしかり
- 質とスピードはトレードオフ関係にない
- 品質を高めるとデリバリーのスピードがあがる
- 高いコードの品質を保つ == 速いスピードを維持できる
- 手戻りの時間は学びを産まない
- 質を犠牲にするとスピードも犠牲となる
- 質を上げるには設計する判断力が必要となる
- 判断力は簡単に身につかず、自分で設計したシステムを長時間メンテするのが一番良い
- 内部品質への投資は1ヶ月で効果がある
- スピードおよび質とトレードオフされるのは、メンバーの成長とそれに必要なフィードバックおよび学習の機会


## 所感
- 質とスピードがトレードオフにならないのは大きな気づき
- すごいプログラマはコードもきれいなのは完全に同意
- だけど、本当にものすごいプログラマは、普通の人には全く理解できないコードを書くって話も聞いたりするけど...:sweat_drops:
- 運用から参画して、メンテを全く考えていないコードを見てきた身としては、質の低いコードはメンテコストがかかるのは本当に実感できた
- 高い質を確保すると1ヶ月で元が取れるっていうのは、リリース頻度の尺度が抜けているのでは？
- 学習、成長の機会が失われるっていうのは大きな気づき
- 手の遅い若手に代わって、ベテランメンバーが作業して、若手が育たないっていうのは良く聞くお話
- 進捗ダメです→現状では質をキープできない→スコープ削る→学習する機会が得られる→メンバーが成長→質の高いコードがかけるってこと？
- メンバーが成長する他の機会ってないのかな
- 個人の経験だと、他の人が書いたコードを読むのは良い面も悪い面も吸収するところが多かった
- コードレビューやペアプロ等でコードがどういう意図で書かれてるか一緒に見るのが効果的かも
RailsでjQueryを導入する方法+確認方法

# jQuery導入について
・久しぶりにjQueryを導入しようとして苦戦したので調べました。

## 導入手順
環境
Rails 5.2.3
Ruby 2.5.1

## 1.gem 'jquery-rails'をインストール

```
(Gemfile)
# 全ての環境で適用したい為、最下部に記述
gem 'jquery-rails'
```
忘れずにbundle installしましょう！

## 2.application.jsを編集
require jqueryを追加

```application.js
//= require jquery
```

**※注意点**
記述の順番によってはjQueryが動作しないので要注意！

```application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree . #require_treeより上にjquery、jquery_ujsを書くこと
//= require activestorage
```

基本的にはここまで実装できれば、あとはhtmlファイルでイベントを用意して、jsファイルで
イベントに対して内容を記載すれば動きます。

## 3.turbolinksを使う場合
application.html.erb等htmlファイルのhead内に以下の記述があるか確認。
またdocumentの記載方法についても注意が必要。

```application.html.erb
 <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```


```products.js
 //初回読み込み、リロード、ページ切り替えで動く。
$(document).on('turbolinks:load', function() { });

//初回読み込み、ページ切り替えで動く。リロードは動かない
$(document).on('turbolinks:render', function() {　});

//ページ遷移前に行いたい処理用。ページ切り替えでもリロードでも動かない
$(document).on('turbolinks:request-start', function() {　});
```

## 4.導入確認方法
### ①console.logでチェック
ブラウザに表示できているか確認。

```application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree . 
//= require activestorage

console.log('hoge')　# 追加
```
<img width="1438" alt="スクリーンショット 2020-02-25 14.50.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526620/87107151-63e2-af81-f427-b9574a9787e0.png">

### ②仮でコントローラー・ビューを作成

```tests_controller.rb
class TestsController < ApplicationController

  def index
  end
  
end
```

```index.html
<h1>Ajax#index</h1>
<p id="hoge">赤色になるよ</p>

<script>
  $("#hoge").css("color","red")
</script>
```

<img width="313" alt="スクリーンショット 2020-02-25 15.07.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526620/bd05434c-1c4e-3bcf-f18b-1b8d1b32e03e.png">
文字の色が変わればjQueryは導入できています。

## 5.それでも導入できない場合
### coffeeファイルの削除
今回苦戦した原因がこのcoffeeファイルでした。
「rails g controller」で任意のコントローラーを作成した際に、自動で「コントローラー名.coffee」という名前で生成されます。
jsファイルと同様の名前でcoffeeファイルがあると、同じ名前で作ったjsファイルがあっても、coffeeファイルが優先的にRailsから呼び出されるため、jsファイルが呼び出されないという状態になります。
coffeeファイルは使用しないならコントローラー作成時に忘れずに削除しましょう！


*********************************************************

今回はturbolinksを初めて使用することもあり、記述誤りばかりを疑っていました。
coffeeファイルについても理解が足りてなかったです:sweat_smile:
今後学習していく中で追加事項があれば随時更新していきます！

参考：
https://qiita.com/s-yank/items/cf7cadbb6c6996d67cf7
https://qiita.com/kumagi/items/289ccadf344f32613304
[coffeeファイルについて](https://wa3.i-3-i.info/word13568.html)
PyInstallerで作ったexe実行時にexeが置いてあるファイルの場所を取得する

我ながらものすごいピンポイントの情報
macのターミナルの話です。windowsでは未検証

##結論
sys.args[0]でexeファイルのフルパスが取れたので、それを使いました。

##困ったところ
exeファイル実行時、ユーザーのホームディレクトリに解凍し、処理を実行するようです。
exeを実行した場所にexcelファイルを吐き出したかったのですが、exeファイルの実行場所に関わらず、ホームディレクトリにexcelファイルが生成されてしまいます。
exe解凍後のpythonファイルもホームディレクトリに展開されてしまいます。

```Python3
print(os.path.abspath(__file__)))
# /Users/ユーザー名/do_something.py
```

##print(sys.args)してみる
ターミナルでpythonコマンドなりexecなりするとき、実行ファイルを引数として渡します。
そういや`print(sys.args)`でとれんじゃねーの？と思い、試してみたら取れました。

```
[/Users/ユーザー名/exeファイル置き場/dist/do_something_exe_file]
```

## ファイルの置き場所を実行場所と同一にする。
あとは定番の操作をすればオッケー

```Python3:
file_path = os.path.join(os.path.dirname(sys.argv[0]), file_name)
```

## 感想
基礎知識、周辺知識が大事な業界だなーとつくづく思います。
メモ①-DB起動からテーブル一覧の表示まで-

【仮定】
MariaDBの導入・環境構築は終わっているものとする

<0>
①コマンドプロンプトからMariaDBを起動するには
mysql -u ユーザー名 -pを入力し、Enter。

②現在手元にあるデータべース一覧を表示する
MariaDB [(none)]> SHOW databases;

③使用するデータベースを選択する
MariaDB [(none)]> USE データベース名;

④データベースに含まれるテーブル一覧を表示する
MariaDB [world]> SHOW tables;

⑤テーブルに含まれる項目一覧を表示する
MariaDB [world]> DESC テーブル名;


・・・②へ続く
XCUITestからplistを参照する

UITest実行時は少し参照方法が違うようです。
Bundleが違うということですね。

`Bundle.main.path(forResource: "Info", ofType: "plist")`とにらめっこしてましたが

例として、ファイルツリーの`hogeUITest`以下に`Info.plist`を配置し、
XCTestCaseから参照する場合は以下の通りです。

```swift
let testBundle = Bundle(for: type(of: self))
if let filePath = testBundle.path(forResource: "Info", ofType: "plist") {
    if let dict = NSDictionary(contentsOfFile: filePath) {
        if let value = dict["key"] as? String {
     	  	print(value)
        }
    }
}
```

## トラブルシューティング

目的のkeyが見つからないときは、想定しているplistか疑う必要があります。
XCTestCaseから呼ぶ場合は`Bundle(for: type(of: self))`でOKですが、
テストファイルの中ではなく、通常のアプリ内のクラスに実装すると、当然selfではなくなるので注意です。

困ったときは`bundle`を`Bundle.allBundles`として探してみてください。
`[bundle]`でとれるのでまわして探しても見つからないか確認しましょう。

## 闇実装
`.allBundles`というのを見つけました。Test側もそうじゃない方からも探せます。

```swift
let bundles: [Bundle] = Bundle.allBundles
for bundle in bundles {
    if let filePath = bundle.path(forResource: "Info", ofType: "plist") {
        if let dict = NSDictionary(contentsOfFile: filePath) {
            if let value = dict["key"] as? String {
                print("みつけた！")
            }
        }
    }
}
```
pip install -U pip を実行すると 'Could not install packages due to an EnvironmentError: [WinError 5] アクセスが拒否されました。'と出る。

windows10, Windows Powershellにて、pip install -U pipを実行すると、

'Could not install packages due to an EnvironmentError: [WinError 5] アクセスが拒否されました。'と出ます。

しかしながら、pip listで確認すると最新の状態になっています。
ちゃんとアップデートされたか不安になったので、上記のエラーは管理者権限問題かと思い、Windows Powershell（管理者）にて、再度python -m pip install --force-reinstall -U pipを実行してみましたが、同じく上記のエラーに直面しました（管理者権限の問題ではない？）。

解決方法アドバイスお願いします。
#Stripe のテスト用クレジットカードで、定期支払などの請求・支払い失敗イベントを発生させたい時のカード番号 ( 4000000000000341 ) 

もろもろのカード番号は拒否されて顧客にさえ登録できないものが多いが、この専用番号であれば、いったん顧客に支払い情報として登録しておいて、あとから課金・決済・支払いを失敗させることができる。

>4000000000000341 | Attaching this card to a Customer object succeeds, but attempts to charge the customer fail.

https://stripe.com/docs/testing


![image](https://user-images.githubusercontent.com/13635059/75203376-482da400-57b1-11ea-845d-67f4bbb33f8e.png)
![image](https://user-images.githubusercontent.com/13635059/75203388-4cf25800-57b1-11ea-89fa-6fcd84ea10f9.png)
![image](https://user-images.githubusercontent.com/13635059/75203437-65fb0900-57b1-11ea-9851-92817cd992fa.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Elasticsearchの負荷検証

# 結論

+ Elasticsearch の queueサイズを上げると全体的にレスポンスは遅くなる
+ しかし、その分多くのリクエストに対応できる
+ 予算などと相談して適切な設定をすると良い

## 負荷テスト結果

+ timeout設定: 60000ms

|queue size| 	fastest |	slowest |	total request count 	|error rate|
|----|----|----|----|----|
|1000 	|1973| 	59461 	|16736 	|50%|
|10000 |	7195 	|59219 |	21472 |	1%|
|20000| 	10447 	|59715| 	19548 	|5%|

## 負荷テスト考察

+ 大きくしすぎた場合、逆に遅くなるしエラーも増えていいことない。
+ queueのサイズはメモリに大きな影響を与えない。
+ メモリはclient nodeの方に多めにあげたほうがいい
+ data node は結局ディスクIOが足を引っ張るので限界がある。
+ client node にあげとくと429を正常に返してくれる確率が上がる