OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】ccxtライブラリをmacOSにインストールしてみた

#はじめに
みなさんmacOSにpythonのライブラリをインストールして活用していますか？
今回はccxtライブラリをインストールする方法を紹介します。

#環境
・python3.7
・macOS(Catalina 10.15.7)

#参考
私は色々なライブラリをインストールしすぎてもう何が入っているかもうわかりません。
そんな時はターミナルで確認ができます。
右上の虫眼鏡マークをクリックし[ターミナル]と入力します。
![スクリーンショット 2021-09-07 18.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/7534f701-7d15-ff4e-3499-389b796bf59b.png)
トップヒットに出てくるターミナルをクリックします。
![スクリーンショット 2021-09-07 18.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/d597d10f-69b5-a4d6-3b98-4055c533b066.png)

以下のコマンドを入力して下さい。

```
$  pip3 list
```
インストールしたライブラリの一覧が表示されます。

#プログラム
さて、今回はccxtというライブラリをインストールしたいと思います。
ccxtとは複数の仮想通貨取引所のAPI操作が集約されたライブラリです。ccxtを実行することで複数取引所のAPIを容易に呼び出せます。なので仮想通貨の板情報を取得したり、取引を自動化することができます。
私はwindows環境にインストールして情報取得していたのですが、macOS環境にはインストールしていなかったのでインストールしてみたいと思います。

ちなみにccxtをインストールしていない状態でimport ccxtコマンドを打つと以下のようなエラーメッセージが出力されます。

```エラーメッセージ
Traceback (most recent call last):
  File "/Users/hirockio/Desktop/ccxt.py", line 1, in <module>
    import ccxt
ModuleNotFoundError: No module named 'ccxt'
```

ではccxtライブラリをインストールしてみましょう。
と言っても超かんたんです。

1.ターミナルを起動します。
2.以下のコマンドを入力します。

```
$  pip3 install ccxt
```

以下のエラーが発生した場合は、インストールの権限がありません。
スーパーユーザで実行する必要があります。

```
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/ccxt-1.55.95.dist-info'
Consider using the `--user` option or check the permissions.
```

スーパーユーザでコマンドを実行する必要があります。パスワードが聞かれますので入力して下さい。
余談ですが「sudo」は「substitute user（もしくはswitch user） do」の略みたいです。

```
$  sudo pip3 install ccxt
```

以下が表示されたらインストール成功です。

```
Successfully installed ccxt-1.55.95
```

#最後に
ccxtの使い方はまた別の記事に書きたいと思います。
ご参考になれば幸いです。
ダンプサーバーとは何ですか？静的サーバーに対するその利点は何ですか

ダンプサーバーは、標準のHTTPダンプから取得したデータでクライアントの要求に応答するサーバーです。

静的サーバーと同様に、ダンプサーバーはコードを実行せず、準備ができたデータをクライアントに提供するだけです。
静的サーバーはファイルの内容で応答し、ダンプサーバーはダンプで応答します。
ダンプには、応答の本文、ステータスコード、およびヘッダーが含まれます。
ダンプサーバーを使用すると、静的サーバーのように、 **```GET```** メソッドだけでなく、***あらゆる種類のリクエスト***を処理できます。
ダンプサーバーを使用すると、コードを記述せずに任意のAPIをシミュレートできます。

>フロントエンドでの作業を開始する必要があり、バックエンドの準備がまだ整っていない場合は、ダンプサーバーが必要です。

[DeepfakeHTTP](https://github.com/xnbox/DeepfakeHTTP) ダンプサーバーをご覧ください。
<br>
<strong> DeepfakeHTTP </strong>は、応答のソースとしてHTTPダンプを使用するWebサーバーです。
<br>
<strong>人々はそれを何のために使用していますか？</strong>
<ul>
    <li>バックエンドから始める前に、製品の<abbr title = "概念実証"> POC </abbr>またはデモを作成する</li>
    <li>REST、GraphQL、およびその他のAPIのプロトタイピングとテスト</li>
    <li>重要なエンタープライズインフラストラクチャを単純な静的ファサードの背後に隠す</li>
    <li>サーバー側とクライアント側の両方でHTTP通信をハッキングおよび微調整する</li>
</ul>
Laravel でカスタムルールを作ったよ

# 要件
変更箇所以外の変更は認めない！（別タブ編集問題用担保その1）
Validationの中に入れて！

## やったこと
### まず、ルールのファイルを作る

```
$ php artisan make:rule HogeHogeRule
```

```App\Rules\HogeHogeRule.php
<?php

namespace App\Rules;

use App\Models\HogeHoge;
use Illuminate\Contracts\Validation\Rule;

/**
 * Class HogeHogeRule
 *
 * @package App\Rules
 */
class HogeHogeRule implements Rule
{

    private $id;
    private $attribute;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct(int $id)
    {
        $this->id = $id;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $this->attribute =  $attribute;
        return hogeHoge::find($this->id)->$attribute === $value;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return $this->attribute . ' mismatched.';
    }
}
```

`$attribute` が、validate で検査する項目名。↓だと、piyo とか fuga が入る。
`$value` は検査対象（実際の値）。

### 準備はできたので、早速組み込みましょう。

```App\Models\hogeHoge.php
    public static function makeValidator(array $params)
    {
        $rules = [
            'id' => ['required', 'integer'],
            'piyo' => ['required', 'integer', 'between:1,3', new HogeHogeRule($params['id'])],
            'fuga' => ['integer', 'nullable', new HogeHogeRule($params['id'])],
        ];

        return Validator::make($params, $rules);
    }
```

以上。
rails で `development?` を維持したまま新しい環境を追加したいとき

新しく環境を追加したい場合（`staging` とか）はこちらの方法でできるけど、
https://qiita.com/yusabana/items/a1f4fe2c37b20db2a3f6

`Rails.env.development?` とか `Rails.env.staging?` は `method_missing` で実装されてるので、
https://github.com/rails/rails/blob/v6.1.4/activesupport/lib/active_support/string_inquirer.rb#L28

例えば `development` と同等の環境を新しく `development-foo-bar` みたいに追加しようとしても、
`Rails.env.development-foo-bar?` とかやるとメソッド名にハイフンが使えないので syntax error になるし、
肝心の `Rails.env.development?` が `false` のままになってしまうので期待通りにいかない。

ので、こんな感じで　`extend` してやるといいかも。

```rb:config/initializers/00_force-env-development.rb
module ForceEnvDevelopment
  def development?
    true
  end
end

case Rails.env
when 'development-foo-bar' then
  Rails.env.extend ForceEnvDevelopment
end
```

っていう話。
送信中の暗号化をtrueにしたredisにsidekiqから接続する

## 前提
sidekiqを導入するにあたり、privateネットワーク内ではあるがアプリとredis間の通信を暗号化しようとなった。
それにあたりredisへの接続ができない問題に当たったのでその修正を覚書

※ redisにはElastiCache for redisを利用

## 結果

以下のように設定した上で以下を環境変数から注入

```
REDIS_URL=rediss://aaa.aaa.aaa.0000.apne1.cache.amazonaws.com:6379
REDIS_AUTH_TOKEN=****
```

```rb
# config/initializers/sidekiq.rb
Sidekiq.configure_client do |config|
  config.redis = {
    url: ENV.fetch("REDIS_URL") { "redis://127.0.0.1:6379" },
    password: ENV.fetch("REDIS_AUTH_TOKEN") { nil },
  }
end

Sidekiq.configure_server do |config|
  config.redis = {
    url: ENV.fetch("REDIS_URL") { "redis://127.0.0.1:6379" },
    password: ENV.fetch("REDIS_AUTH_TOKEN") { nil },
  }
end
```

## つまづきポイント
* 本番の環境では通信を暗号化したいがローカルでは暗号化せずさっと実装したい
    * passwordのデフォルトをnilにすることでローカルでは非暗号化で対応可能
    * 本番では `rediss://` に指定する

## うまくいかなかったケース
### redisでパスワードなしで接続しようとした
`Redis::TimeoutError: Connection timed out` が発生
何故なのかはいまいちわからないですがタイムアウト扱い
port同じなので認証エラーとかになるのかなと思ったらタイムアウトでした

### rediss指定でパスワード追加していない
`Redis::CommandError: NOAUTH Authentication required.` が発生
Criticalを複数ページで実行する

Critical CSSがパフォーマンスを上げるとのことで最近導入を開始しました。
普段Webpackを使っているので[html-critical-webpack-plugin](https://www.npmjs.com/package/html-critical-webpack-plugin)を使用していましたが、[複数ページの場合はページの数だけコードを記述する](https://github.com/anthonygore/html-critical-webpack-plugin/issues/8)という方法が不便だなぁと思い、複数ページに対応したCriticalの導入方法を探したところ見つけられなかったのでメモします。
**Gulpを使う方法**と**スクリプトを自作する方法**の2通りがあります。

## Gulpを使ったCriticalの導入方法
[公式](https://github.com/addyosmani/critical#gulp)の設定通りに記述すればOKです。
一応ここでも明記します。

```:ディレクトリ構成
./
├ docs
|  ├ css
|  |  └ style.css
|  ├ index.html
|  ├ page1.html
|  └ page2.html
└ gulpfile.js
```


```:パッケージのインストール
$npm i -D gulp fancy-log critical
```

```js:gulpfile.js
const { src, dest, series } = require('gulp');
const log = require('fancy-log');
const critical = require('critical').stream;

function criticalCss(done) {
  return src('./docs/*.html')
    .pipe(
      critical({
        base: './docs',
        inline: true,
        css: ['./docs/css/style.css'], //対象としたいCSSファイル
      })
    )
    .on('error', err => {
      log.error(err.message);
    })
    .pipe(dest('./docs'));
  done();
}

exports.default = series(criticalCss);
```

gulpを実行すると、docs内の全てのhtmlファイルにCritical CSSがインラインで追記されたものが上書きされます。
`critical({})`内の設定は公式ドキュメントを参考に変更してみてください。


## スクリプトを使ったCriticalの導入方法
わざわざgulpをインストールしたくない、という人はスクリプトを自作します。
こちらも[公式](https://github.com/addyosmani/critical#usage)で設定の解説がありますが、ディレクトリ内の全てのhtmlファイルを対象にする設定がなかったのでアレンジしました。参考程度にしてください。

```:ディレクトリ構成
./
├ docs
|  ├ css
|  |  └ style.css
|  ├ index.html
|  ├ page1.html
|  └ page2.html
└ critical.js
```


```:パッケージのインストール
$npm i -D critical glob
```

```js:critical.js
const critical = require('critical');
const path = require('path');
const glob = require('glob');

const target = glob.sync(path.resolve(__dirname, './docs/**/*.html'));

target.forEach(async (path, i) => {
  const arr = path.split('/');
  const file = arr[arr.length - 1];
  
  critical.generate({
    inline: true,
    base: './docs',
    src: './docs/' + file,
    target: {
      html: file,
    },
    extract: true, //元のCSSファイルからCritical CSSを削除したい場合（LP推奨）
    width: 1300,
    height: 900,
  },(err, output) => {
    if (err) {
      console.error(err);
    } else if (output) {
      console.log(`Generated critical CSS ${file}`);
    }
  });
});
```
最初にdocsディレクトリの全てのhtmlファイルのパスを取得し、forEachで一つ一つにCriticalを実行しています。
`extract: true`にするとインライン化したコードを元のCSSファイルから削除した新しいCSSファイルを`./docs/css/`ディレクトリに生成し、そしてhtml内に自動で組み込んでくれます。
しかし、そうするとCSSファイルのキャッシュ機能が使えなくなるので複数ページの案件での使用には注意が必要です。

あまり体感できない程度の変化ですが、これ一つでパフォーマンスの数値が変わってくるので是非導入してみてください。
【Python】CSVに行を足してよいかどうか（新しい値があるかどうか）判断する関数

[先程書いたもの](https://qiita.com/shin1007/items/c9becabb493efff06a8a)とはTFが逆で戻るようになってます。


```Python
def ok_to_add_data(csv_file:str, data:list) -> bool:
    '''
    Returns
    -------
    True when the data has new value.
    False when the data has no new value like;
    - last_line == data,
    - data has missing values and other data is same as values of same index of last_line
    '''
    # CSV読み込み
    with open(csv_file, 'r', encoding='utf8') as f:
        rows = [row for row in csv.reader(f)]
    try:
        last_line = rows[-1]
        # 最後が空白行の場合があるのでケア
        if last_line == []:
            last_line = rows[-2]
        # 全く同じデータであればNG
        if(last_line == data):
            return False
        for csv_cell, data_cell in zip(last_line, data):
            # 異なるデータ
            if csv_cell != data_cell:
                # 欠測値でないなら追記と判断
                if data_cell:
                    return True
        # 差分が欠測値のみであればNG
        return False
    # おかしい場合はとりあえず追記
    except IndexError:
        return True
```
WorkatoのConnector SDK（カスタムコネクター）やRubyコネクターでHTTPリクエストを行うとInternal errorが発生する問題と対応方法

## はじめに

Workatoでは、Connector SDK（カスタムコネクター）やRubyコネクターなどを利用することで、Workatoのコネクターとして用意されていない機能をユーザー側で実装することが可能です。

また、Connector SDKやRubyコネクターには、外部のリソース（API等）に対してHTTPリクエストを行うメソッドが用意されていますが、実装したHTTPリクエストが「Internal error」となり悩まされることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/63e3269c-b9fa-67d8-d925-36402add5fc9.png)

Workatoのドキュメントを参考に実装を進めた場合、ほぼ100%の確率でInternal errorに悩まされ、ドキュメント通りに実装しているのにどうして？と悩む方もいるかもしれません。原因と対応方法について以下に記載します。


## Internal errorの原因

get, post, put, patch, delete, optionsなどのHTTPメソッドを利用する際は、レスポンス処理に係るメソッドのチェーンが必要となります。

|メソッド|内容|
|:-----:|:-----:|
|response_format_json|レスポンスがJSONで返されることを想定して結果をセットします|
|response_format_xml|レスポンスがXMLで返されることを想定して結果をセットします|
|response_format_raw|レスポンスのフォーマットを想定せず、そのまま結果をセットします（HTTP, テキスト, バイナリ等）|

これらのうち、いずれかのメソッドがチェーンされていないと、Workatoはそのレスポンスをどのように処理すべきか判断できないため、その結果Internal error が返されます。

## 対応方法

Internal errorが発生した時は、次のように上記メソッドのいずれかがチェーンされているか、まずは確認してみましょう。

```ruby
params = {
  "id" => input["id"]
}

get("https://example.com/api", params).response_format_json
```

## 参考
https://docs.workato.com/developing-connectors/sdk/sdk-reference/http.html
Amazon Linux 2 に複数PHPバージョンを同居

## Amazon Linux 2 に複数のPHPバージョンを同居

PHPインストール時に複数バージョンを同居しても問題ないよう、インストールしてる手順をメモ

:::note warn
汎用的なやり方ではないと思いますが、簡単に設定・切替えしたい人向けです。
:::

① yum updateした後に、remiリポジトリを追加

```sh
# 最新版へupdate
sudo yum -y update
# remiリポジトリを追加
sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

② 利用するPHPバージョン毎にインストール

```sh
# PHPを使うバージョン毎にインストール
for v in  70 74 80; do sudo yum -y install php$v php$v-php php$v-php-{mbstring,mysqlnd,redis,pecl-apcu,opcache,xml,gmp}; done
# PHP7.0を使う場合
php70 -v
# PHP7.4を使う場合
php74 -v
# PHP8.0を使う場合
php80 -v
```

③ apacheの自動起動を有効化　※versionは2.4以上

```sh
sudo systemctl enable httpd
sudo systemctl list-unit-files | grep -e httpd
```

④ apacheのphp.confを勝手にロードされないよう、ファイル名変更

```sh
cd /etc/httpd/conf.modules.d/
# php.confの拡張子を変更
sudo rename php.conf php.conf.org *php.conf
```

⑤ alternativesで各バージョンを管理
※「[複数のバージョンの PHP を切り替えて使う](https://qiita.com/centipede/items/0a5e2f55ec3f66dc6bd9)」記事を参考にしました。

```sh
# PHP7.0
sudo update-alternatives \
--install /usr/bin/php                          php     /opt/remi/php70/root/usr/bin/php 10    \
--slave   /usr/bin/php-cgi                      php-cgi /opt/remi/php70/root/usr/bin/php-cgi   \
--slave   /usr/bin/phar.phar                    phar    /opt/remi/php70/root/usr/bin/phar.phar \
--slave   /etc/httpd/conf.modules.d/10-php.conf webphp  /etc/httpd/conf.modules.d/15-php70-php.conf.org
# PHP7.4
sudo update-alternatives \
--install /usr/bin/php                          php     /opt/remi/php74/root/usr/bin/php 10    \
--slave   /usr/bin/php-cgi                      php-cgi /opt/remi/php74/root/usr/bin/php-cgi   \
--slave   /usr/bin/phar.phar                    phar    /opt/remi/php74/root/usr/bin/phar.phar \
--slave   /etc/httpd/conf.modules.d/10-php.conf webphp  /etc/httpd/conf.modules.d/15-php74-php.conf.org
# PHP8.0
sudo update-alternatives \
--install /usr/bin/php                          php     /opt/remi/php80/root/usr/bin/php 10    \
--slave   /usr/bin/php-cgi                      php-cgi /opt/remi/php80/root/usr/bin/php-cgi   \
--slave   /usr/bin/phar.phar                    phar    /opt/remi/php80/root/usr/bin/phar.phar \
--slave   /etc/httpd/conf.modules.d/10-php.conf webphp  /etc/httpd/conf.modules.d/20-php80-php.conf.org
```

⑥ メインで使うphpに切替え

```shell-session
$ sudo update-alternatives --config php

There are 3 programs which provide 'php'.

  Selection    Command
-----------------------------------------------
*+ 1           /opt/remi/php70/root/usr/bin/php
   2           /opt/remi/php74/root/usr/bin/php
   3           /opt/remi/php80/root/usr/bin/php

Enter to keep the current selection[+], or type selection number:
```

※php.ini設定を忘れずに（タイムゾーン等）

```sh
# PHP7.0.ini
sudo vi /etc/opt/remi/php70/php.ini
# PHP7.4.ini
sudo vi /etc/opt/remi/php74/php.ini
# PHP8.0.ini
sudo vi /etc/opt/remi/php81/php.ini
```

:::note info
コンテナ毎に各バージョンを用意してもOKだが、こちらがお手軽かなと。
:::

殆ど自分用メモですが、ご指摘等頂けると助かります。
2021年9月2日のAWS東京リージョン障害についてざっくり。

2021年9月2日、AWS東京リージョンでAWS Direct Connectの障害があり、調査のサマリが公開されました。

https://aws.amazon.com/jp/message/17908/

某所でこれ読むの辛いというコメントをもらったので、私の理解の範囲で要点をざっくり箇条書き。分かる人、読める人は上のサマリの方が間違いがなく、より詳しいので、そちらを読んでいただいた方がいいと思います。

# 概要

* 午前 7 時 30 分から、Direct Connectの東京リージョンに向かうトラフィックについて断続的な接続の問題とパケットロスの増加を観測。
* 午後 12 時 30 分に復旧を観測しはじめ、午後 1 時 42 分に接続の問題は完全に解決。
* Direct Connect ロケーションと東京リージョンの間のネットワークデバイスの一部に障害が発生したことが原因。
* 他のすべてのネットワーク接続は影響を受けませんでした。他の AWS リージョンへの Direct Connect トラフィックも影響を受けませんでした。

# 根本原因

* 新しいプロトコルとオペレーティングシステムが、2021 年 1 月に初めて実稼働環境に導入された。
* この組み合わせ上を非常に特殊なパケット属性とコンテンツのセットが流れたことで、OSの潜在的な問題が顕在化され障害が発生した。
* これらの条件は非常に特殊で稀で、導入以降8か月正常に動作していたが、今回一致するカスタマートラフィックによってこのイベントが発生した。
* このカスタマートラフィックは、悪意を持って流されたとは考えていない（たまたまだろう）。

# 対策

* 東京リージョンでは現在このプロトコルが無効化されている。
* 有効化前に問題検出・修正する手法を開発したので、新OSとプロトコルを今後導入予定だった他リージョンを含め、再発は起きない見込み。

# 終わりに

こんな感じですかね。以下のあたりがちょっとぼんやりしていますが…

* 新プロトコルとは何だったのか、
* 今後も東京では無効化しっぱなしなのか、
* 既存の導入プロセスでは検出できなかったわけだけど、そこは厳格化するのか、それはやりすぎだと考えているのか、

…新プロトコルの話は興味本位でちょっと知りたいな。
AWS Certified Cloud Practitioner 合格体験記

時間的・金銭的にコスパよく合格するために取り組んだことを共有します．

# Step1: 基本的なAWSサービスを利用する

資格取得のみが目的であるまたは厳しい時間的制約がある方はこのステップを飛ばしてもOKです．

しかしながら，特に初学者の多くの人にとってはこのステップによってAWSの理解が深まるかと思います．

私は[AWS公式のハンズオン](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)を用いて，以下のサービスを触ってみました．

- EC2
- VPC
- IAM
- Lambda
- APIGateway
- RDS
- DynamoDB
- ELB
- AutoScaling
- Route53
- CloudWatch
- S3

特にはじめの一歩として，EC2, VPC, IAMの機能に触れる上では以下を指針としました．

https://www.youtube.com/watch?v=M4wXwx8qQOs

加えて，Qiita限定公開記事の執筆，同期・先輩との勉強会でのアウトプットによって，さらに理解を深めました．

ちなみに，[AWS公式のハンズオン](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)は個人的にはかなり気に入っていて，すべてのAWS情弱向け商材を駆逐する潜在性があると思います．これが無料だなんて信じられませんでした．

# Step1.5: AWSクラウドプラクティショナー用参考書で学習する

こちらの教材を購入し，読了しました．

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=aws+%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1631006392&sr=8-1

このフェーズはStep1を踏んだ方にとっては不要かもしれません．

AWSCPの試験範囲を把握する上では有用ですが，ここで得られる知識はStep1やStep2の中で得られるもので十分カバーできるという印象です．

# Step2: AWSクラウドプラクティショナー問題集で学習する

以下の問題集を購入し，基本問題2つと応用問題3つを演習しました．

https://www.udemy.com/course/aws-4260/

応用問題は難易度としては実践の問題よりも難しいように思いましたが，合格の確実性を上げるためのインプット教材として捉えると評価できる教材だなという印象です．

上記の問題集に加えて，試験直前には以下も利用しました．

https://aws-exam.net/clf/

こちらの位置づけとしては，試験直前期により多くの問題に触れるためです．

解答に対する信頼性は少々不安が残りますが，十分な演習量を詰めるのは確かでしょう．奇しくも日本語の不自然さも実際の試験を継承していて，そちらも味方によっては評価しうる点かもしれません．

# おわりに

私は新卒研修の一環として取得を求められましたが，試験自体の難易度はそこまで高いとは個人的には感じませんでした．

ご自身の目的やスケジュールにもよりますが，AWSのというサービスの特性や試験のレベル感等も考慮しますと，本資格に関しては短期間でサクッと取ってしまいたい資格だなという印象でした．

以上となります．
59日後にITパスポートを受けるFラン私大文系既卒(41日目)

# ITIL(Information Technology Infrastructure Library)
* ITILとは?
 * ITサービスマネジメントのベストプラクティスが書かれた本

# SLM(Service Level Management)
* SLMとは?
 * サービスレベル管理
 * PDCAを用いて、サービスの維持改善をすること

# SLA(Service Level Agreement)
* SLAとは?
　* サービスレベル合意書
　* サービスレベルを明文化した書類

# ASP
* ASPとは?
 * ASPとは、ソフトウェアをインターネットなどを通じて利用者に提供するサービス事業者のこと。
 * 一つのサーバを独占して使う点が、SaaSと異なる

# サービスサポート
* サービスサポートの種類
 * インシデント管理
 * 問題管理
 * 構成管理
 * 変更管理
 * リリース管理
 * サービス管理

# 構成管理
* 構成管理とは?
 * IT資産を正確に把握して、不正使用を防止する活動
 * ソフトウェアライセンスの管理も行う
 * IT資産とは、ハードウェア、ソフトウェア、ドキュメントのこと 

# 変更管理
* 変更管理とは?
 * システムの変更を承認し、実施計画を立てること

# リリース管理
* リリース管理とは?
 * 変更管理で承認された変更を本番環境に実装すること

# ファシリティマネジメント
* ファシリティマネジメントとは?
　* 建物の設備の保有や運用、維持などを最適化する手法
* ファシリティマネジメントの主な目的
 * 安全性
 * コスト削減
 * 快適性
 * 機密性

# UPS(Uninterruptible Power Supply)
* UPSとは?
 * 無停電電源装置

# システム監査
* システム監査のポイント
 * 信頼性
 * 安全性
 * 機密性 
* システム監査のプロセス
　* 依頼
　* 調査
　* 報告
　* 改善活動

# 情報セキュリティ監査
* 情報セキュリティ監査とは?
 * 情報資産を監査する
* 情報セキュリティ監査のポイント
 * 機密性
 * 完全性
 * 可用性

# コーポレートガバナンス
* コーポレートガバナンスとは?
 * 企業統治
 * 株主を中心としたステークホルダーが、経営者の経営を監視すること

# 内部統制
* 内部統制とは?
 * 　社内の全ての人が業務を健全化すること
 * 　整備と運用の責任は経営者

# ITガバナンス
* ITガバナンスとは?
 * コーポレートガバナンスのITに関連すると統治のこと

# モニタリング
* モニタリングとは?
 * 内部統制が有効に機能していることを継続的に評価するプロセス
パケットスニッフィング とは

## 勉強前イメージ

スニッフィングは匂いをかぐ？？

## 調査

### パケットスニッフィング とは

まず スニッフィング とはネットワークのデータを不正に盗み見ることで、
パケットスニッフィング はノード間のネットワーク上に流れているデータを不正に盗み見ることです。
もしパケットスニッフィングにデータを盗み見られたとすると重大な情報漏えいになる可能性も大きいです。

### パケットスニッフィングの仕組み

仕組みは、
ネットワーク上で通信するためには様々なネットワーク機器を経由しないといけなく、
その際に悪意のある人がネットワーク機器から情報を盗み取ったり、
無線LANの場合には、直接接続せずとも電波を傍受することで情報を取得することが出来ます。

### 対策

対策としては、
ネットワークを接続、また設定する際は盗み見られても内容まではわからないように暗号化の設定をしたり
無線LANでは、接続する機器の制御をMACアドレスで行うなど対策があります。
傍受される前提での構築が必要です。

## 勉強後イメージ

匂いをくんくん嗅ぐ → 探知する → 盗み見る って感じ・・・？
平文だと盗まれたらすぐに見れてしまうよね・・・・

## 参考

- [パケットスニッフィングの概要](https://www.whatsupgold.com/jp/blog/what-is-packet-sniffing)
[Html/Rails]画像の大きさを調整をしたい

##初めに
####この記事の対象者
・画像を貼ったのはいいけど、大きすぎて/小さすぎてなんか見にくい。。。ヒト用


####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
**１）cssを使って画像の大きさを変える方法**
**２）rubyを使って画像の大きさを変える方法**
**３）画面の大きさに応じて画像の大きさを変える方法**
**４）最後に**

##cssを使って画像の大きさを変える方法**
####１）html内に画像を添付

```html
<img src ="画像の名前.png" src="画像のファイルの場所" class="sample">
```

####２）cssで画像のクラス名を指定して横幅、縦幅を設定

```css
.sample{
  width:50px;
  height: 50px;
}
```

##rubyを使って画像の大きさを変える方法**
####１）html内<%= image_tag>を使って画像を添付

```erb
<%= image_tag "ファイル名.png" %>
```

####２）<%= image_tag>内にsize: "縦幅x横幅"を追加

```erb
<%= image_tag　"ファイル名.png", size: "50px＊50px" %>
```
##画面の大きさに応じて画像の大きさを変える方法**
####大きさの単位に気をつけて！
**※幅の単位をpxにすると、その大きさに固定されるためユーザが画面の大きさを変えても画像の大きさはそのままとなる**
**※幅の単位を%にすると、html内は入れ子構造（親子関係）になっているため、親の幅より大きくなることはない＝画面に応じて大きさが変わる**

##最後に 
もし自分のアプリに画像を使っているなら、見た目が悪いとユーザは使いたいと思わなくなると思うからレイアウトは大事だとおもう！

ここまで読んでくださってありがとうございます！
After Effects基礎知識 #1 基本概要と立ち上げ

__[#1]__
__[#2](https://qiita.com/azobe/items/41fab0dd6e3ad7bbe16e)__
__[#3](https://qiita.com/azobe/items/d67f8a92a4d8d5c7d213)__

##After Effects（アフターエフェクツ／アフターエフェクト）とは
PhotoshopやIllustratorと同じAdobeが販売している、映像の合成やVFX・モーショングラフィックスを制作するためのツールであり、要は動画制作ツール。略称は様々だが以下「**AE**」とする。
Adobeが販売している他の動画制作ツールで有名なものに「Premiere Pro（プレミアプロ）」があるが、こちらはノンリニア編集ソフトに分類されるもので、AEで行う映像制作とは分野が異なる。何を作るかによってどちらか一方を使うか、機能を使い分け併用するのが基本となる。
##Premiere Proとの違い
![pr_or_ae1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666382/b85aebac-0206-048a-3b1c-e5f39308a8df.jpeg)
**Premiere**は動画編集ソフト（ノンリニア編集ソフト）である。撮影したビデオ（素材）を取り込み、NGカットなどの不要な部分を削って素材の長さを調整し、それらをタイムライン上で並べ、音楽を挿入して、一本の作品に仕上げる、という作業が基本となる。
__複数の素材を横方向（時間軸）に並べて繋げる__ことが得意と言える。
![pr_or_ae2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666382/1f492e50-14ad-a73f-17c6-c791845a64bf.jpeg)
一方**AE**は編集ソフトというより加工ソフトであり、「コンポジット（合成）ツール」とも呼ばれる。映像素材などにエフェクトをかけたり、図形をアニメーションさせたりを行うものである。言い換えれば素材を合成させて動かす作業を行うことができる。
__複数の素材を縦方向（レイヤー）に重ねて合成する__ことが得意と言える。

##AEの画面
![ae3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666382/7f19964f-37ed-26d8-66de-97132f6a609c.jpeg)

* __コンポジションパネル__：動画のプレビューが表示されるパネル。デフォルトのワークスペースでは上部中央の大部分を占めている。
* __プロジェクトパネル__：素材を読み込むパネル。デフォルトではコンポジションパネルの左側にある。このプロジェクトファイル内で使用されるすべての素材が置かれる倉庫のようなもの。
* __タイムラインパネル__：素材をレイヤーとして重ね制御するパネル。イラレやフォトショにおけるレイヤーウィンドウに横方向の時間軸が加わったようなもの。デフォルトでは下半分に横長に配置されている。
* __ツールパネル__：イラレやフォトショにもあるパネル。デフォルトでは左上に横並びになっている。

##新規コンポジションの作成
![ae1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666382/8b0c5def-2612-f03e-1728-91d1e688f413.jpeg)

AEを立ち上げたばかりのこの状態では、フォトショやイラレでいうアートボードにあたるものがまだ存在していない。
最初に新しく「__コンポジション__」を作成する。

「__コンポジション__」はレイヤーで素材を重ねて構成するコンテナ素材のことであり、簡単な映像を一から作成する場合は作業スペースに近い概念となる。画面縦横比や再生時間などもここで決めるため、事実上動画の規格を定めるためのものにもなっている。
新規コンポジションを作成するには、左上のプロジェクトパネルの右クリック、もしくはメニューバーの「コンポジション」から「新規コンポジション」を選択する。ショートカットキーはCommand+N（フォトショやイラレでの『新規プロジェクト作成』ショートカットと同じ）

コンポジションの設定を入力・選択し、コンポジションを新しく作成する。
![ae2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666382/97b0c7ee-48a6-063c-6a66-bedfcb9e4f4f.jpeg)

* __コンポジション名__：適当な名前を付ける。
* __幅・高さ__：文字通りコンポジション（動画）の幅と高さの値をここに入力する。
* __フレームレート__：1秒当たり何フレーム表示させるかの設定。単位はfps（フレーム/秒）。値が大きいとなめらかに動いている見え、小さいとカクカクしているように見える。ただしフレームレートが高いとそれだけデータ量が増えるためフレームレートが高いから良いというわけでは必ずしもない。テレビ放送は30fps、映画は24fps、最近のテレビゲームなどでは60fpsが基本。
* __デュレーション__：そのコンポジションが継続する時間、つまりここでは再生時間と捉えて良い。
* __背景色__：文字通りだが、基本は透明として扱われる。

![ae4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666382/021e6108-b872-c999-2f8d-b563a1ca9ca7.jpeg)
コンポジションの設定を終えると、上画像のように、プロジェクトパネルには作成したコンポジションの名前が、タイムラインパネルには作成したコンポジションのタイムラインが、コンポジションパネルにはそのコンポジションのプレビュー画面が現れる。

タイムラインにまだ何も置いていない状態なので、プレビューは背景色に設定した黒一色が表示されているのみである。

__[次回](https://qiita.com/azobe/items/41fab0dd6e3ad7bbe16e)__、ここに素材を読み込み簡単なアニメーションをつける。
swiftで競プロをやりたい初心者向けのまとめ（随時更新予定）

###初心者向けswift競プロ備忘録
今回は競プロ初心者である私がswiftで競プロをする際に必ず使うような処理の仕方を備忘録としてまとめていきたいと思います。
####入力編
+ 標準入力をString型で使いたい時

```swift
let input = readLine()!
```
+ 標準入力をInt型で使いたい時

```swift
let input = Int(readLine()!)!
```
+ 標準入力がスペースによって区切られている時

```swift
let input = readLine()!
let splited_input = input.split(separator: " ")

let a = splited_input[0]
let b = splited_input[1]

//キャストする場合は
let num_a = Int(a)
//このように書くことができます。

```
このように書くと一つずつ定数として取得することができます。
スペースではなくカンマで区切られている場合はseparatorの部分をスペースからカンマに変えると取得できます。
またaやbをInt型にキャストすれば数字として扱うことも可能です。

+ 標準入力が改行によって区切られている時

```swift
let input1 = readLine()!
let input2 = readLine()!
```
このように改行された行数分入力を繰り返すと取得することができます。

####メソッド編
+ 指定した文字列が含まれているかの判定

```swift
import Foundation
let string:String = "Hello World"
if string.contains("Hello") {
    print("Helloが含まれる")
}
//trueが返されるので"Helloが含まれる"がprintされる
```

+ 指定した文字列を繰り返す

```swift
let a = String(repeating: "あいうえお", count: 3)
print(a)
//あいうえおあいうえおあいうえお
```
+ 指定した文字列を置換する

```swift
import Foundation
let before = "りんごが食べたいな"
let after = before.replacingOccurrences(of: "りんご", with: "ぶどう")
print(after)
//ぶどうが食べたいな
```

+ Int型配列の全要素の合計値を求める

```swift
let array: [Int] = [1, 2, 3, 4, 5]
let result: Int = array.reduce(0) { $0 + $1 }

print(result)
//15
```
reduce( )の中身が自由に決められる初期値です。
その後の＄0や＄1に関しては私も曖昧なので知りたい人はぜひ調べてみてください。
####たまに使う小技編
+ 改行せずにprintする

```swift
print("ABC", terminator: "") 
print("DEF")
//ABCDEF
```
terminator:" "と書くとスペースを空けてprintすることができます。

+ 絶対値を求める

```swift
let a:Int = -123
print(abs(a))
//123
let b:Double = -4.56
print(fabs(b)) 
//4.56
```
Int型に対してはabsを使ってキャストしてください。
またDouble型やFloat型に対してはfabsを使ってキャストしてください。

+ 平方根を求める

```swift
let a:Double = 4.0
print(sqrt(a))
//2.0
let b:Double = 2.0
print(sqrt(b))
//1.41421356...
```
Double型に対してsqrtでキャストをすると平方根を求めることができます。
（正常系）Rspec Userモデルの単体テストの手順



雛形
======
[前回の続きの雛形](https://qiita.com/wwaattaa/items/03f31bdad4b12a80ccb4)を使用して
Userモデルの正常系テストについて書いていきます。　
ここではバリデーションに関するテストを実装致します。



*正常系テスト*とは、
ユーザーが開発者の意図する操作を行った時の挙動を確認するテストコードです。





↓spec/models/user_spec.rb


```rb

require 'rails_helper'
describe User do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    context '新規登録がうまくいくとき' do
      it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
      end
      it "nicknameが6文字以下で登録できる" do
      end
      it "passwordが6文字以上であれば登録できる" do
      end
    end

    context '新規登録がうまくいかないとき' do
     it "nicknameが空だと登録できない" do
      end
      it "nicknameが7文字以上であれば登録できない" do
      end
      it "emailが空では登録できない" do
      end
      it "重複したemailが存在する場合登録できない" do
      end
      it "passwordが空では登録できない" do
      end
      it "passwordが5文字以下であれば登録できない" do
      end
      it "passwordが存在してもpassword_confirmationが空では登録できない" do
      end
    end
  end
end

`````

 context '新規登録がうまくいかないとき' do
のところは異常系テストになるのでまた次の記事で書こうと思います。

テストコードの記述
--------
be_validマッチャを使用します。
itとendの中に記述していきます。


expectのインスタンスが正しく保存されることを確認できます。
expect(インスタンス).to be_validのように使用してください。





↓spec/models/user_spec.rb

```rb

it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
  expect(@user).to be_valid
end

it "nicknameが6文字以下で登録できる" do
  @user.nickname = "aaaaaa"
  expect(@user).to be_valid
end

it "passwordが6文字以上であれば登録できる" do
  @user.password = "000000"
  @user.password_confirmation = "000000"
  expect(@user).to be_valid
end

`````



テストコードの実行
--------
テストコードの実行にはこのコマンドを使用する。
今回はmodels/user_spec.rb の単体テストなので、こちらのコマンドを使用する。
ターミナルに表示された文字が緑色になれば成功。

↓ターミナル

`````
% bundle exec rspec spec/models/user_spec.rb 

````



明日は異常系について書きたいと思います、、、、、、
【RSpec】結合テストコードでセレクト要素を取得する

# はじめに
今回は下記の画像のようにセレクト形式のフォームのテストコードの際にセレクト要素を取得する方法について記述します。

![スクリーンショット 2021-09-07 17.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623096/4de6b903-a603-2e1e-bb9a-a9996e8c0d48.png)

上記の画像であれば生年月日や居住地の入力欄がセレクト形式に当てはまります！

# 開発環境
Ruby on Rails バージョン2.6.5

# セレクト要素を取得する方法

私は当初、下記のように"fill_in"を使って取得するのかと思い苦戦しておりました。

![スクリーンショット 2021-08-24 10.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623096/15d71f96-6f5b-f660-5e0e-a1e4c9d2f273.png)

しかし、セレクト要素を取得する際の記述は以下のように実装する必要があります。

```ruby:
select'値', form:'取得するフォーム'
```

なので、以下の書き方に変更したところ問題なくテストコードが実装されました！

![スクリーンショット 2021-08-24 10.23.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623096/4b1aaa56-5399-4279-42e7-73d23403938e.png)


# 終わりに

結合テストコードのセレクト要素の取得は今後頻繁に使用すると思い、
自分自身の学びのためにも本記事をまとめさせていただきました！
同じように躓かれた方の参考になれば幸いです🙇‍♂️
【JavaScript】reduceメソッド

#はじめに
こんにちは。
JavaScriptのreduceメソッドについてアウトプットしていきます！

##reduceメソッドとは
>`reduce()` メソッドは、配列の各要素に対して (引数で与えられた) reducer 関数を実行して、単一の出力値を生成します。

> 参照：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

```javascript:JavaScript
const numbers = [1,2,3,4];

const result = numbers.reduce((accu,curr) => {
  return accu + curr;
})

console.log(result);  //10
```
上記の記述では、1回目の処理でaccuには配列の最初の要素の`1`が入る。currには`2`が入る。2回目の処理でaccuにはreturnで返された`3`が入り、currには配列の`3`が入る。

処理が完了すると、resultから配列の合計`10`が出力される。

<br>

##mapメソッドとの違い
reduceメソッドと同じように、配列に対して処理ができるmapメソッドについても簡単に説明していきます。

###mapメソッドとは
>`map()` メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。

>参照：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

```javascript:JavaScript
const numbers = [1,2,3,4];

const result = numbers.map((num) => {
  return num + 2;
})

console.log(result);  //[3, 4, 5, 6]
```
配列の要素全てに`+2`を実行して、新しい配列を生成できます。

<br>

#最後に
ここまでreduceメソッドについてまとめてみました。
できることが少しずつ増えてきてプログラミングの楽しさが増してきました笑
これからもコツコツ学習していきます！
PHPでメールアドレスからサブドメインを除いた形のドメインを抜き出す

以下のコードを利用することで、サブドメインを除いた形で、メールアドレスからドメインを抜き出すことができます。

※ブランドTLDは処理出来ません（ブランドTLDは別途処理方法を検討する必要があります）

```php
<?php
function get_domain($email) {
        // メールアドレスからドメインのみ抜き出し
        $domain = preg_replace('/^.+?@(.+?)$/i', '${1}', $email);
 
        // 地域型JPドメインの抜き出し
        $pattern = '/^.*?((pref|metro|pref|city|town|vill)\..+?\.(hokkaido|aomori|iwate|miyagi|akita|yamagata|fukushima|ibaraki|tochigi|gunma|saitama|chiba|tokyo|kanagawa|niigata|toyama|ishikawa|fukui|yamanashi|nagano|gifu|shizuoka|aichi|mie|shiga|kyoto|osaka|hyogo|nara|wakayama|tottori|shimane|okayama|hiroshima|yamaguchi|tokushima|kagawa|ehime|kochi|fukuoka|saga|nagasaki|kumamoto|oita|miyazaki|kagoshima|okinawa|lg)\.jp)$/i';
        if (preg_match($pattern, $domain)) {
                return preg_replace($pattern, '${1}', $domain);
        }
 
 
        // 属性型ドメインの抜き出し
        $pattern = '/^(.*?)(\.(co|or|ne|ac|ed|ed|go|gr|lg|com|net|org|mil|edu|int|idv)\.(is|ie|az|ac|af|us|as|vi|ae|dz|ar|aw|al|am|ai|ao|ag|ad|ye|uk|gb|io|vg|il|it|iq|ir|in|id|ug|ua|uz|uy|ec|eg|ee|sz|et|er|sv|eu|au|at|ax|om|nl|gh|gg|gy|kz|qa|um|ca|cv|ga|cm|gm|kh|mk|mp|gn|gw|cy|cu|cw|gr|ki|kg|gt|gp|gu|kw|ck|gl|cx|gd|hr|ky|ke|ci|cc|cr|km|co|cg|cd|sa|gs|ws|st|bl|zm|pm|sm|mf|sl|dj|gi|je|jm|ge|sy|sg|sx|zw|ch|se|sd|sj|es|sr|lk|sk|si|sc|gq|sn|rs|kn|vc|sh|lc|so|su|sb|tc|th|kr|tw|tj|tz|cz|td|cf|cn|tn|kp|cl|tv|dk|de|tg|tk|do|dm|tt|tm|tr|to|ng|nr|na|aq|nu|ni|ne|jp|eh|nc|nz|np|nf|no|hm|bh|ht|pk|va|pa|vu|bs|pg|bm|pw|py|bb|ps|hu|bd|tl|pn|fj|ph|fi|bt|bv|pr|fo|fk|br|fr|gf|pf|tf|bg|bf|bn|bi|vn|bj|ve|by|bz|pe|be|pl|ba|bw|bq|bo|pt|hk|hn|mh|mo|mg|yt|mw|ml|mt|mq|my|im|fm|za|ss|mm|mx|mu|mr|mz|mc|mv|md|ma|mn|me|ms|jo|la|lv|lt|ly|li|lr|ro|lu|rw|ls|lb|re|ru|wf))$/i';
 
        if (preg_match($pattern, $domain)) {
                $tmp = preg_replace($pattern, '${1}', $domain);
                $tmp2 = preg_replace($pattern, '${2}', $domain);
                if (substr_count($tmp, '.') > 0) {
                        $tmp =  substr($tmp, strrpos($tmp, '.') + 1, strlen($tmp2));
                }
                return $tmp . $tmp2;
        }
 
        // その他ドメインの抜き出し
        $tmp = substr($domain, 0,  strrpos($domain, '.'));
        if (substr_count($tmp, '.') > 0) {
                $tmp = substr($tmp, strrpos($tmp, '.') + 1, strlen($tmp));
        }
        $tmp2 = substr($domain, strrpos($domain, '.'), strlen($domain));
        return $tmp . $tmp2;
 
}
```
【Unity】AndroidアプリをGooglePlayに公開する

# Unity
下記項目を設定

- 会社名
- プロダクト名
- アイコン
- パッケージ名
- ヴァージョン
- ビルド番号
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/10eb3668-d396-6d72-83e7-b16ea3edbcfe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/669b561b-03a3-b48e-9f26-0d3079903bc6.png)
ARM64にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/76d5d0dc-4b0e-5933-0e67-80210f71cf4b.png)

キーストアを登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/cfc27293-1317-4a5d-ec6d-437f5f7b7212.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/3155bf31-a176-9baf-6668-4faf97f9757d.png)

Build App Bundleにチェックを入れてビルド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/5564f483-457a-3c60-c378-01c944984965.png)

# GooglePlayConsole
アカウントを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/a6f09318-e513-87bd-fdb6-26594fa37cc3.png)
右上のボタンからアプリを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264045/1b66c8d6-f813-d290-5abf-be6d82cb4ebf.png)
ダッシュボードの指示に従い必要な情報を登録

審査に提出
kubernetesリソースコントローラーRS関連

#ReplicaSet（RS）作成

```ruby:ReplicaSet
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: myapp
        image: wangyanglinux/myapp:v1
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80
```

#PODのラベル確認

```ruby:PODラベル確認
kubectl get pod --show-labels
```
#PODのラベル変更
```ruby:PODラベル変更
kubectl label pod POD-Name tier=変更後のラベル名 --overwrite=True
```

#RS削除
```ruby:ReplicaSet削除
kubectl delete rs --all
```
Qiitaで記事を書くときのテンプレート

##初めに
####なぜこの記事を書きたかったのか
Qiitaで記事を書くときに、同じ文を書くのがめんどくさくなった(特に環境について)のでここにテンプレートをメモしたい。

##**Qiita用のテンプレート↓**

```
##初めに
####なぜこの記事を書きたかったのか or この記事の対象者

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
**１）**
**２）**
**３）**
**４）最後に**

##目次１
####目次１の説明

####目次１の説明

##目次２
####目次２の説明

####目次２の説明

##目次３
####目次３の説明

####目次３の説明

##最後に
```
##最後に
次からはここから一気にコピー＆ペーストして記事を書くぞー！
【Capistrano】git archive [ブランチ名] | /usr/bin/env tar -x -f - -C /var/www/myapp/releases/... エラーの解消

<h1>はじめに</h1>
以下の記事を参考にCapistranoの設定をしていたところ、標題の箇所でエラーが発生し、１週間ほど詰まったので、その解消方法をまとめておきたいと思います。

<h5>参考記事</h5>
https://qiita.com/naoki_mochizuki/items/657aca7531b8948d267b

<h1>エラー内容</h1>
前提として、今回、最も重要であるdeproy.rbにおける、デプロイするブランチの指定については、次のように記述していました。

```ruby:deproy.rb

〜略〜

set :branch, '#5/capistrano'

〜以下、略〜

```

Capistranoの設定が成功した上で、masterブランチにマージをしたかった（作業ブランチで、エラーの対応含め、あれこれ試したかった）ため、このように作業ブランチをしてしていました。
「＃５/」については、自分の管理がしやすいよう、番号を振っていたのですが、これが悪夢の始まりとなりました。




Capistranoの設定を終え、次のとおり、コマンドを実行したところエラーが発生しました。

```
% bundle exec cap production deploy     
00:00 git:wrapper
      01 mkdir -p /tmp
〜中略〜

00:06 git:create_release
      01 mkdir -p /var/www/myapp/releases/20210903191022
    ✔ 01 ユーザー名@IPアドレス 0.103s
      02 git archive #5/capistrano | /usr/bin/env tar -x -f - -C /var/www/myapp/releases/20210903191022
      02 bash: -c: 行 1: 構文エラー: 予期しないファイル終了 (EOF) です

〜以下、略〜

```

ん、構文エラー？

<h1>調査開始</h1>
「git archive #5/capistrano | 〜」はCapistranoが実行しているコマンドなので、構文エラーなんてあり得ないだろうという思いをいだきつつ、エラー文の全体を眺めながら、関連しそうキーワードをググり続けました。

何も見つからない。

ブランチの指定の方法が間違っているのだろうか？

問題なさそうだ。

引き続き、調査を続け、GitHubにissueを発見しました！
https://github.com/capistrano/capistrano/issues/1126

これだー！と思い、内容を確認するも英語なのですぐにはわかりません。
翻訳ソフトのお世話になって内容を読んでみると…
「解決してへんやないかい！」
※結局、この記事は関係なかったような気がします。

さて、気を取り直して調査を続けます。英語の記事も探しに行きます。
それでも、同じエラーの人を見つけることはできません。

当然、ログも上から下まで何度も読みます。

わからない。ここらで、もう１回エラー文について、よく考えてみよう。

<h1>考察</h1>

エラーが起きているコマンドはこちら

```
git archive #5/capistrano | /usr/bin/env tar -x -f - -C /var/www/myapp/releases/20210903191022
```

このCapistranoが実行しているコマンドのうち、私のコードが影響している箇所があるとすれば、「#5/capistrano」というブランチ名のみです。

もしかして、ブランチ名の「#」や「/」がエラーの原因になっているのではないだろうか？
「/」なんて、ディレクトリの区切りに使っているので、落ち着いて考えれば、怪しすぎる。

というわけで、次のとおり、masterブランチからデプロイするようコードを修正してみました。

```
git archive master | /usr/bin/env tar -x -f - -C /var/www/myapp/releases/20210903191022
```

さて、Capistranoを実行してみます。
・・・
通った！

<h1>おわりに</h1>
エラーの原因が、ブランチ名の「#」だったのか「/」だったのか、はたまたどっちもだったのかまで突き止めることはできませんでしたが、これにて長きに渡るエラーとの戦いに決着がつきました。

これだけググっても同じエラーに出会えなかったということは、世界を見渡しても、同じことをやらかした人がいないということでしょうか？

私と同じエラーに出会った人（今後も出てこない？）の役に立てるよう、記録に残しておきます。
Python3でCSVからJSONへ変換する

Python3を使用して、CSVファイルをJSONファイルに変換します。

## 実行方法

```
$ python3 csv2json.py -i <入力CSVファイル> -o <出力JSONファイル> --delimiter ',' --header-only 0
```

|オプション|値|
|:--------:|:---:|
|-i|入力CSVファイル|
|-o|出力JSONファイル|
|--delimiter|CSV区切り文字|
|--header-only|0: データも含めて出力したい, 1: ヘッダのみを出力したい|

## コード
```python:csv2json.py
import csv
import json
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', help='Input file name (CSV)', required=True)
parser.add_argument('-o', '--output', help='Output file name (JSON)', required=True)
parser.add_argument('--delimiter', help='Input CSV Delimiter')
parser.add_argument('--header-only', type=int, help='Output only header (Exclude data) 0:True/1:False', choices=[0,1])
args = parser.parse_args()
 
input_file = args.input
output_file = args.output
 
header_only = 0
if args.header_only in globals():
    header_only = args.header_only
 
csv_delimiter = ','
if args.delimiter in globals():
    csv_delimiter = args.delimiter
 
print("Input File:" + input_file)
print("Output File:" + output_file)
 
 
result = []
f_input_file = open(input_file, "r")
if header_only == 1:
    data = csv.reader(f_input_file, delimiter=csv_delimiter, doublequote=True, quotechar='"', skipinitialspace=True)
    for row in data:
        for col in row:
            result.append(col)
        break
 
 
else:
    data = csv.DictReader(f_input_file, delimiter=csv_delimiter, doublequote=True, quotechar='"', skipinitialspace=True)
 
    for row in data:
        result.append(row)
 
f_output_file = open(output_file, "w")
f_output_file = json.dump(result, f_output_file, indent=2, ensure_ascii=False)
```
リモートブランチとローカルブランチのファイル名のみの修正差分表示

# リモートブランチとローカルブランチのファイル名のみの差分表示

みなさんご存知の通り、リモートブランチとローカルブランチの差分を表示するときは、

```
git diff
```
を使うと思います。
ですが、　addする際には、修正ファイルのみが必要になります。
こんな風に。

```
git add index.html
git add test.php
```

となると。ファイル名のみ欲しいですよね。。。
そんな時は、以下を実行すると

```
git diff --name-only
```
これでファイル名のみ取得できるので、便利ですよ( ^ω^ )

# 注意点
これ新規ファイルは見れないのですよ。
コマンドだけで全て差分表示できる方法を知っているつよつよエンジニアさん教えて。。

## 現状の解決策
VScodeのソースコードコントロールを使えばいいんですよ。
便利ですよ。VScode！！
[Html/Rails]範囲指定について

##初めに
####なぜこの記事を書こうと思ったのか
**フロントサイドの実装をするとき、クラス名を直前に決めているせいかcssで装飾をするときに名前を忘れてしまったクラス名は思い出すのにどの部分に当たるのか曖昧の場合があるので自分中でルールを決めてここにメモしたいと思ったから。**

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
1)土台
2)状況に応じてのテンプレート
3)最後に

##土台
・基本的にheaderとfooterは部分テンプレートとして使う頻度が多いのでスルー
・いままで作ったアプリはメイン部分を２−3分割で分けていた

####application.html.erb
```erb
<!DOCTYPE html>
<html>

<head>
  <title>タイトル名</title>
  <script type="text/javascript" src="https://js.pay.jp/v1/"></script>
  <%= stylesheet_link_tag 'application', media: 'all'%>
  <%= javascript_pack_tag 'application' %>
</head>

<body>
  <%= yield %>
</body>

</html>
```

####index.html.erb(縦に２−３分割のとき)

```html
<div class= 'main'>
  <div class= 'top-box'>
    <div class= 'top-container'>
    このサイトについて説明したいこと</div>
  </div>
  <div class= 'middle-box'>
    <div class= 'middle-container'> 
    どんなことができるのか</div>
  </div>
  <div class= 'bottom-box'>
    <div class= 'bottom-container'>
    このサイトのサービスや表</div>
  </div>
</div>
```

####index.html.erb(横に２−３分割のとき)

```html
<div class= 'main'>
  <div class= 'left-box'>
    <div class= 'left-container'>
    このサイトについて説明したいこと</div>
  </div>
  <div class= 'middle-box'>
    <div class= 'middle-container'> 
    どんなことができるのか</div>
  </div>
  <div class= 'right-box'>
    <div class= 'right-container'>
    このサイトのサービスや表</div>
  </div>
</div>
```

##状況に応じたテンプレート
####_header.html.erb(上の部分)

```erb
<header>
<div class='header-box'>
  <div class='left-box'>
    <div class='logo-box'>
      <%= link_to "ロゴの名前や画像" root_path %> <%#　ロゴのみの場合%>
      <a href "#" id "side-btn"><i class= "他のサイトからロゴを持ってくる"></i></a> <%#　サイドバーがいるとき%>
    <div>
  </div>
  <div class='right-box'>
    <div class='right-container'>
      <%= link_to 'リンク先の名前',oooo_path, class: "　リンクの名前（英語表記）" %>
      <%= link_to 'リンク先の名前',oooo_path, class: "　リンクの名前（英語表記）" %>
      <%= link_to 'リンク先の名前',oooo_path, class: "　リンクの名前（英語表記）" %>
    </div>
  </div>
</div>
</header>
```
####_footer.html.erb(下の部分)
```erb
<footer>
<div class='footer-box'>
  <div class='left-box'>
    <div class='logo-box'>
      <%= link_to "ロゴの名前や画像" root_path %>
    <div>
  </div>
  <div class='right-box'>
    <div class='right-container'>
      <%= link_to 'リンク先の名前',oooo_path, class: "　リンクの名前（英語表記）" %>
      <%= link_to 'リンク先の名前',oooo_path, class: "　リンクの名前（英語表記）" %>
      <%= link_to 'リンク先の名前',oooo_path, class: "　リンクの名前（英語表記）" %>
    </div>
  </div>
</div>
</footer>
```

####_sidebar.html.erb(左右部分)

```erb
<div id ="bars">

  <div class= "sidebar-container">

    <div class= "bar">
      <%= link_to "トップページ", oooo_path %>
    </div>

    <div class= "bar">
      <%= link_to "好きな遷移先", oooo_path %>
    </div>

    <div class= "bar">
      <%= link_to "好きな遷移先", oooo_path %>
    </div>

    <div class= "bar">
      <%= link_to "好きな遷移先", oooo_path %>
    </div>

    <div class= "bar">
      <%= link_to "ログアウト", destroy_user/session_path, method: :delete %>
    </div>

  </div>
</div>
```

##最後に
今までは、これから書く機能を連想しそうなクラス名にしていたが、親子関係がわからなくなり無駄な時間が過ぎてしまったので、今日からは基本的にこのテンプレートを使ってアプリの実装する！みなさんはアプリケーションを作るとき自分の中でルールとかつくってるのかな？

ここまで読んでくださってありがとうございます！
SeleniumBasicを利用してExcelからJiraへ自動入力（課題を起票）する (Server/DataCenter)

SeleniumBasicを使うと、RPAツールっぽくExcelからの情報をJIRAへ転記することができます。

APIが使えない環境、APIが苦手でもとりあえずWebブラウザの「開発者ツール」とExcel VBAは扱える方であれば、この方法でJIRAの入力を自動化できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/dbd96fa4-f234-7b6c-c1b7-c49ccc0ad4e5.png)

## サンプルコード

```
Option Explicit
Public driver As New ChromeDriver
Public rootUrl As String
Public startRow As Integer
Public userName As String
Public userPassword As String
 
 
Private Sub CommandButton1_Click()
 
With Sheets("config")
    rootUrl = .Cells(2, 2).Value
    startRow = .Cells(3, 2).Value
    userName = .Cells(4, 2).Value
    userPassword = .Cells(5, 2).Value
End With
 
Dim nowRow As Integer
Dim tinyMCEId
nowRow = startRow
 
' ブラウザを開く
driver.Get rootUrl
 
' ログインする
driver.FindElementById("login-form-username").SendKeys userName 'ユーザー名
driver.FindElementById("login-form-password").SendKeys userPassword 'パスワード
driver.FindElementById("login").Click 'ログインボタン
driver.Wait (2000)
 
 
 
With Sheets("data")
    While .Cells(nowRow, 1) <> ""
        '「作成」ボタンをクリック
        driver.FindElementById("create_link").Click
         
        ' セルから値を取得してフォームへセットする
        driver.FindElementById("summary").SendKeys .Cells(nowRow, 1).Value '要約
        driver.FindElementById("reporter-field").SendKeys .Cells(nowRow, 2).Value '報告者
         
        ' 説明
        ' TinyMCEは、TinyMCEが生成するiFrameへ入ってからSendKeyする必要がある
        tinyMCEId = driver.FindElementByXPath("//div[@id='description-wiki-edit']/div[@class='rte-container']/div/div/div/iframe").Attribute("id")
        driver.SwitchToFrame tinyMCEId
        driver.FindElementByCss("body").SendKeys .Cells(nowRow, 3).Value
         
        ' TinyMCEの処理が終了したら、親へ戻る
        driver.SwitchToParentFrame
         
        ' Submitする
        driver.FindElementById("create-issue-submit").Click
        driver.Wait (2000)
        nowRow = nowRow + 1
    Wend
End With
 
' ブラウザを閉じる
driver.Close
 
 
End Sub
```
cURLを使用してConfluence上の添付ファイルを削除するには (Server/DataCenter)

|変数|値|
|:--:|:--:|
|WIKI_USER_NAME|Confluenceのユーザー名|
|WIKI_USER_PASSWORD|Confluenceのパスワード|
|WIKI_BASEURL|ConfluenceのベースURL|
|ATTACHMENT_ID|添付ファイルID|

```
curl -u ${WIKI_USER_NAME}:${WIKI_USER_PASSWORD} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-X DELETE ${WIKI_BASEURL}/rest/api/content/${ATTACHMENT_ID}?status=current
```
cURLを使用してConfluenceへファイルアップロードを行うには (Server/DataCenter)

|変数|値|
|:--:|:--:|
|WIKI_USER_NAME|Confluenceのユーザー名|
|WIKI_USER_PASSWORD|Confluenceのパスワード|
|FILENAME|アップロードするファイル名|
|WIKI_BASEURL|ConfluenceのベースURL|
|WIKI_PAGEID|アップロード先のページID|


```
curl -u ${WIKI_USER_NAME}:${WIKI_USER_PASSWORD} \
-X POST \
-H "X-Atlassian-Token: nocheck" \
-F "file=@${FILENAME}" \
${WIKI_BASEURL}/rest/api/content/${WIKI_PAGEID}/child/attachment
```
【Ubuntu】vimでPrettierする

vimのプラグイン管理とかがまだよくわかってないけど、とりあえず動いたからメモ。

###### 1. vim-prettierのインストール(https://github.com/prettier/vim-prettier#install)

```zsh
$ mkdir -p ~/.vim/pack/plugins/start
$ git clone https://github.com/prettier/vim-prettier ~/.vim/pack/plugins/start/vim-rettier
```

######2.Prettierのインストール

```zsh
$ sudo npm install -g prettier
```

######3.vim-plugのインストール(https://github.com/junegunn/vim-plug#vim)

```zsh
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

######4.`~/.vimrc`の設定(https://volpe.hatenablog.com/entry/2019/03/29/095753)

```vim
call plug#begin()
" post install (yarn install | npm install) then load plugin only for editing supported files
Plug 'prettier/vim-prettier', {
  \ 'do': 'yarn install',
    \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'svelte', 'yaml', 'html'] }
call plug#end()
```


TODO: 改行される幅が広すぎるので設定したいが、`~/.vimrc`に次のような設定をしても反映されない。

```vim
let g:prettier#config#tab_width = 1
```

TODO解決: vimでのタブの文字数がデフォルトで8なので、それをかえてやるとよい。
https://ex1.m-yabe.com/archives/3702

```vim
set tabstop=4
set shiftwidth=4
```
「さくらのVPS」のサーバーで「さくらのクラウド」のオブジェクトストレージをマウントしてみる

# はじめに

動画を大量に扱うサービスを開発していて、サーバの容量が足りなくなった時にどうしようかと考えていて、色々と検討した末にオブジェクトストレージを使用することにしたので、オブジェクトストレージをマウントする手順をメモしておく。

開発中のサービスは以下のようなもの。
https://streaming.blueomega.jp

ちなみに、OSはUbuntu20.xを利用。

# インストール

```
$ sudo apt install -y s3fs awscli
$ wget https://github.com/kahing/goofys/releases/latest/download/goofys
$ chmod a+x goofys
$ sudo mv goofys /usr/local/bin/
```

# 設定

```
$ aws configure
AWS Access Key ID [None]: [パーミッションのアクセスキーID]
AWS Secret Access Key [None]: [パーミッションのシークレットアクセスキー]
Default region name [None]: jp-north-1
Default output format [None]: 何も入力せずにENTER
```

ファイルの一覧が取得できるか確認する。

```
$ aws --endpoint-url=https://s3.isk01.sakurastorage.jp s3 ls s3://[バケット名]/ --summarize --recursive
```

# マウントさせてみる

```
$ /usr/local/bin/goofys --endpoint=https://s3.isk01.sakurastorage.jp [バケット名] [マウントポイント]
```

アンマウント。

```
$ fusermount -u /home/tmp/
```

マウントしたディレクトリのアクセス権を変更できるように設定を変更。

```
$ sudo nano /etc/fuse.conf 
```

以下の#を削除

```
#user_allow_other
```

# 起動時にマウントされるよう設定

crontabで設定

```
$ crontab -e
```

以下のコマンドを追記

```
@reboot /usr/local/bin/goofys --endpoint=https://s3.isk01.sakurastorage.jp --file-mode=0666 --dir-mode=0777 -o allow_other [バケット名] [マウントポイント]
```

できた！
gcc, makeがありませんのトラブルシューティング

## 環境
Ubuntu20.4

## はじめに
次のコマンドでrbenvをインストールした。

```
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
```

そのあと、公式サイトに、次のコマンドを実行すると高速化が図れるよ、しかし、コマンドに失敗しても無視してOKとは書いてあったが、指示通りに実行してみると。

```
cd ~/.rbenv && src/configure && make -C src
```

次のようなエラーがでてくる。

```
warning: gcc not found; using CC=cc
aborted: compiler not found: cc
```

どうも、Cの開発環境が入っていないもよう。gccとはCのコンパイラのこと。次のコマンドで、Cの開発環境をごっそりインストールできるらしいので試してみることに。

参考URL
https://kazuhira-r.hatenablog.com/entry/2020/11/30/204027

```
sudo apt install build-essential
```

確かに、入っていないようです。

```
make --version
-bash: make: command not found

gcc --version
-bash: gcc: command not found
```

では、実行することに。

```
sudo apt update
sudo apt install build-essential
```

gccインストールできました。

```
gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
```

makeもインストールできました。

```
make --version
GNU Make 4.2.1
```

再びトライ。

```
cd ~/.rbenv && src/configure && make -C src
make: Entering directory '/home/vagrant/.rbenv/src'
gcc -fPIC     -c -o realpath.o realpath.c
gcc -shared -Wl,-soname,../libexec/rbenv-realpath.dylib  -o ../libexec/rbenv-realpath.dylib realpath.o
make: Leaving directory '/home/vagrant/.rbenv/src'
```

何やら、メッセージが表示されたが、うまくいっています。
Elastic Beanstalkの環境の終了やアプリの削除でerror

# 状況
Elastic Beanstalkで環境やアプリケーションが削除できなくなる時がありました。

# 原因
RDSだったり、セキュリティグループなどの依存関係があると削除できなくなるようです。

# エラーメッセージ
以下はElastic Beanstalk管理内にRDSを立てた環境でRDSを先に削除してしまった際に出たエラーメッセージです。

```error.txt

ERROR
Stack deletion failed: The following resource(s) failed to delete: [AWSEBRDSDatabase].
2021-xx-xx-xxxx	
ERROR
Deleting RDS database named: xxxxxxxxxxxx failed Reason: DBInstance xxxxxxxxxxxx was not found during DescribeDBInstances

```

# 余談＆注意点
:::note warn
注意点
今回のエラーの本筋とは関係ありませんが
Elastic BeanstalkではRDSを『管理下に置かない』ことが推奨されています。
理由はElastic Beanstalkの環境を削除した際にRDSが管理下にあると
**一緒に削除されてしまう**からです。
これを防止する方法としてRDSインスタンス設定で削除防止の設定をすることもできます。
:::

# 解決策
CloudFormationをラップして定番ウェブアプリケーションのAWSにおけるベストプラクティス的な
構築をサクッとサポートしてくれるのがElastic Beanstalkなんですね。なので
１.CloudFormationの管理画面を開きます。
２.左メニューからスタックをクリックします。
３．ステータスの欄が[DELETE_FAILED]となっているスタックを確認します。
（Elastic Beanstalk 環境の IDが出ていればその内容も含めて確認します）
４．失敗している処理を進めたい場合は左側のチェックを入れて[削除ボタン]を押します。
５．ポップアップウィンドウでチェックを入れるとその「リソースは無視する」という動きになりますのでチェックを入れます。
![cantdeleteeb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169482/a93d93e3-7d7f-97a7-09a7-cd4dc3c00074.jpeg)
６．スタックのステータスが [DELETE_COMPLETE] に変わったら、 Elastic Beanstalkの管理画面から[環境を終了]します。

# セキュリティグループが原因の場合
基本的には同様の手順で消すことができます。
しかし、セキュリティグループ自体も削除できない場合があります。
もし使っていないという確認が取れればセキュリティグループの
インバウンド、アウトバウントを削除してセキュリティブループ同士の
依存関係をとってあげることで削除できたりします。
詳細は参考ページをご参照下さい。

# 参考情報
[本家：Beanstalkの削除](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-beanstalk-deleted-rds-database/)
[本家：セキュリティグループの削除](https://aws.amazon.com/jp/premiumsupport/knowledge-center/troubleshoot-delete-vpc-sg/)

# 蛇足
PaasやSaasなどで機能が豊富で手軽なゆえに実はブラックボックス化してしまっていることは結構ある気がします。
Beanstalkの中身を詳しく知るにはVPCやCloudFormationあたりを掘り下げれば理解が深まると思います。
ツールで便利になってはいますがまだまだ最低限の知識は必要ですね。