OmniAICreator/Qiita-1.07M huggingface dataset:
MFA認証を受けていないIAMユーザのリソース操作を制御する

IAMユーザに対してMFA認証を必須にする要件があった場合に有効なIAMポリシーを記します。
以下のポリシーがアタッチされたユーザは、MFA認証を受けてからマネジメントコンソールにログインしないと、EC2などのAWSリソースへアクセスができません。

```text:mfa-control
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices",
                "iam:ChangePassword",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices",
                "iam:ChangePassword",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```
<br>
MFAをユーザに設定するには、画面上部のマイセキュリティ資格情報から設定をします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1717863/9e74a156-2f90-e5e1-1c06-298305a456c4.png" width=30%>


以上です。
Django " TypeError: argument of type 'PosixPath' is not iterable" のエラー対処

Django をいじっていたときに出てきたエラー。
どういう経緯でエラーになったのかはわからないが一応直せたので備忘録として残す。

エラーはアプリ作成時やmigrateの際に出てきてた。
以下、エラー文

```shell
$ python manage.py startapp reviews
Traceback (most recent call last):
  File "/home/taka/Dropbox/user/django_project/beginners_book/project1/manage.py", line 22, in <module>
    main()
  File "/home/taka/Dropbox/user/django_project/beginners_book/project1/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/core/management/base.py", line 336, in run_from_argv
    connections.close_all()
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/db/utils.py", line 224, in close_all
    connection.close()
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 248, in close
    if not self.is_in_memory_db():
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 367, in is_in_memory_db
    return self.creation.is_in_memory_db(self.settings_dict['NAME'])
  File "/home/taka/anaconda3/envs/django_env/lib/python3.9/site-packages/django/db/backends/sqlite3/creation.py", line 12, in is_in_memory_db
    return database_name == ':memory:' or 'mode=memory' in database_name
TypeError: argument of type 'PosixPath' is not iterable
```
PosixPathはPathlibというライブラリを使用したときに返される型らしく、そのタイプエラーになっていた。

 このpathオブジェクトをstr型に変換するといいらしい。

```python:setting.py
#変更前
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3'
    }
}

#変更後
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': str(BASE_DIR / 'db.sqlite3'),
    }
}
```

参考

https://stackoverflow.com/questions/64634674/django-typeerror-argument-of-type-posixpath-is-not-iterable

https://dev.classmethod.jp/articles/python-pathlib-intro/
EC2からKMSにより暗号化されたS3へUploadを行う。

EC2からS3へのファイルアップロードに手間取ったので記録します。

実施すること
1.EC2にアタッチしているIAMロールの見直し
2.S3のバケットポリシーの見直し

1.EC2にアタッチしているIAMロールの見直し
以下のポリシーがアタッチされていることを確認します。
　・S3へのアクセス許可
　　手っ取り早く実装したいなら「AmazonS3FullAccess」をアタッチすればOK。
　　セキュリティ要件に応じて書き換えてください。

　・KMSへのアクセス許可
　　AWS管理ポリシーとしては提供されていないので、作成します。

```text:kms-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "kms:GenerateDataKey",
            "Resource": "arn:aws:kms:*:YOURACCOUNTID:key/*"
        }
    ]
}
```


2.S3のバケットポリシーの見直し
アクセス許可のバケットポリシーに明示的にdenyポリシーが書かれていないか確認します。
必要に応じて削除してください。
何も記述されていない状態でも、EC2側に適切なロールがアタッチされていれば、uploadは可能ですが、記述例を載せておきます。

```text:bucket-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceIP",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::YOURS3BUCKETNAME/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "SOURCEIP1",
                        "SOURCEIP2"
                    ]
                }
            }
        }
    ]
}
```

以上です。どなたかの参考になれば。
初心者のVue.js(バージョン2)セットアップ+web apiを叩いてみる

<h1>背景</h1>
業務でvueを使うことになったのでさわってみることにしました。
バージョン2は少し古いようですが、業務で使うのであえて2を使います。

<h1>前提</h1>
npmコマンドが使える環境

<h1>作るもの</h1>
ランダムで猫の画像を表示するアプリ
使用webapi https://aws.random.cat/meow



<h1>セットアップ</h1>
まずはcliをインストールします。-gを付けないとこの後のPJ作成が出来ないので付けます。

```
npm install -g vue-cli
```
<hr>
PJを作成します。質問が大量にあれますが全てデフォルト・一番上の選択肢で
よいと思います。

```
vue init webpack {PJ名}
```
<hr>
webapiとhttp通信をするために必要なaxiosを入れます。

```
npm install axios
```
<hr>
components配下にRandomCatというvueファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/d53f5138-a37c-3df1-602c-e5ab24e57c87.png)
<hr>
routerフォルダ配下のindex.jsを編集します。

```index.js
import Vue from 'vue'
import Router from 'vue-router'
import RandomCat from '@/components/RandomCat'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'RandomCat',
      component: RandomCat
    }
  ]
})

```
<hr>
main.jsを編集します。
Vue.prototype.$axios = axiosと記述することで、別のviewファイルでわざわざ
importしなくともaxiosが使えます。

```main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'

Vue.config.productionTip = false
Vue.prototype.$axios = axios
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

```
<hr>
先ほど作ったRandomCat.vueを編集します。
データバインディングする時は、srcの前に:が必要です。

```RandomCat.vue
<template>
  <!-- <img src="cat">では無いので注意 -->
  <img :src="cat">
</template>

<script>

export default {
  name: 'RandomCat',
  data () {
    return {
      cat: null
    }
  },
  mounted () {
    this.$axios
      .get('https://aws.random.cat/meow')
      .then(response => (this.cat = response.data.file))
      .catch(error => (console.log(error)))
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

```

<h1>おまけ：デバッグ設定</h1>
config配下のindex.jsのdevtoolプロパティを編集します。

```index.js
devtool: 'source-map',
```
<hr>
debugger for chromeを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/8f313026-1e00-d102-a76a-ccbcd75f8b2f.png)

<hr>
launch.jsonを編集します。

```launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
      {
        "type": "chrome",
        "request": "launch",
        "name": "vuejs: chrome",
        "url": "http://localhost:8080",
        "webRoot": "${workspaceFolder}/src",
        "breakOnLoad": true,
        "sourceMapPathOverrides": {
          "webpack:///src/*": "${webRoot}/*"
        }
      }
    ]
  }
```

<h1>感想</h1>
webapiを叩くだけですが、デバッグ設定とか結構こけました。。。
SPAについてまとめてみた

今一度SPAとは何なのかについて整理してみました。

## SPAという設計手法が出てくる以前のWebシステム開発
SPAという設計手法が出てくるまでは、多くのWEBシステム開発においてサーバーサイドレンダリングが標準的な手法だった。

#### サーバーサイドレンダリングとは：
サーバー側でHTMLを生成して、ブラウザでそれを表示する手法。（ブラウザに届いた時点では、既にHTMLが構成されている）
このサーバーサイドレンダリングという言葉自体が存在してなくて、SPAという概念が出てきてから目立つようになったと言われています。

この手法では、ページを更新する度に変更していない部分までサーバ側で生成し直していた為に処理に時間がかかっていた。また、フロントエンドの回収はサーバサイドのシステムへの修正が必要だった。

ただ、決してこのサーバーサイドレンダリングが古いという訳ではなく、アプリによってはこの手法が適しているケースもあるそうです。



## では本題、SPAとは
一応念のため、SPAは`Single Page Application`の略。
単一のWebページでアプリケーションを構成する設計手法

- 最初だけHTMLを返し、それ以降はAJAX通信で非同期に必要なデータだけを受け取りコンテンツを更新する。
- JavaScriptで動作、描画をコントロールし、その名の通り一つのHTMLファイルで成り立っている。
- アプリの持つ状態（データ）の管理をフロントエンド側でも行う（Redux、Vuexで状態を管理） サーバーとのやりとりを最小限に抑えて高速化させる手法
- フロントエンドでもデータ、Redux、コンポーネントを含めた設計力が必要になる
- Vue.js や React を用いてビュー部分のデータ（JSON）をブラウザに渡し、サーバーサイドではAPIのみを提供しページの構築を行う。 

身近なサービスを例に出すと、 
- **SPA:** GoogleMap, Gメール、Facebook
- **非SPA:** Amazon, Github
 

## Vue.jsやReactを使っている = SPA ではない
React, VueはSPAを作りやすくしてるだけで、これらを使う＝SPAではないし、絶対必要なわけでもない（超難しいらしいです）
SPA化しないけど、Component機能を生かす理由でReactやVueを使う事もある。
LaravelやRailsなどのテンプレートファイルにVueやReactコンポーネントを埋め込んで使う例もある。

## SPAのメリット 
- ユーザーのアクションに対して必要な部分のみを更新するので、ページ遷移が非常に高速（非同期で必要なデータを取得する場合は、そのコンテンツが表示されるまではラグがある）

- 最低限必要なものはHTMLファイル、JSファイルのみであり構成がシンプル。この2つをホスティング先に置いておけばとりあえずページは表示される 

## SPAのデメリット 
- JSファイルが実行、評価されてDOMがマウントされるまでコンテンツが何も表示されない 
- JSファイルのサイズが大きくなると、初期ローディングの時間が無視できないレベルになる 
- SEOで不利（クローラーがJavaScriptを実行できるようになったとのことなので、この問題は解決されつつある。ただ、即時的に評価されるのではなく、評価までにラグがあるらしい） 
- TwitterやFacebookのクローラーはJavaScriptを実行しないため、プレーンなSPAアプリだと動的なOGP対応ができない
styled-componentを使ってMateria-UIの背景色を変える

#はじめに
ポートフォリオ作成中に疑問に思ったので備忘録として残しておきます。

#本文
こちらの記事たち[[1]][[2]]を参考にMaterial-UIのコンポーネントにstyledコンポーネントでスタイリングしていたのですが背景色だけが何故か変わりませんでした。

```sass
const SAppBar = styled(AppBar)`
  background-color: #193278;
  color: #fff;
  padding: 8px 0;
`;
```
のように書いても変わらず、困っていました。AppBarコンポーネントにstyleを使ってなら背景色の変更は出来たのですが、スタイルが２箇所に分かれるのは嫌だったので記事を何回も見直していたところ代わりにbackgroundを使っていることに気づき、変更したところ背景色が変わりました。なにが違うのか検索し[[3]]にたどり着いたのですがイマイチよくわかりません。個別に設定するかしないかの違いらしいですが、それならどちらもできそうな気がします。あまり深入りすぎると無駄に時間をとりそうなのでとりあえずおいといて完成後に調べようと思います。あと記事にも書いてありますが

```jsx
<StylesProvider injectFirst>
      <App />
    </StylesProvider>
```
のようにしないと反映されないことがあります。

#参考文献
[1]:https://qiita.com/Ouvill/items/c6761c32d31ffb11e114
[2]:https://qiita.com/ss_33_sss/items/d2bc9dc9585da752fc3e
[3]:https://memo.itsysgroup.com/?p=925



[[1]]:Material-UI と styled-components を組み合わせて、React のサイトを怠惰にスタイリングする。
[[2]]:Material-UIでコンポーネントの色を変更する方法まとめ[React+Typescript]
[[3]]:【CSS】background-colorとbackgroundの違い
テレワークと暫定一位ホワイトボードツールとDX

## はじめに

テレワークしてますか？
MTGもリモートで実施されるようになり、ホワイトボードを使えなくてお困りではないですか？

ということで、ホワイトボードツールに関する考察を書きます。


## ホワイトボード

ホワイトボードに期待される機能は「フリーハンドで図や文字が書ける」かと思います。
それであれば、以下のツールを画面共有することでホワイトボードの代用になりそうです。

- Google スライド
パワポっぽい操作感で図や文字を共同編集可能。

- [Draw.io](https://app.diagrams.net/)
ステンシルが豊富。パワポより細かい図形描画が簡単にできる。
VS Code の Extension も存在。

- [PlantUML](https://plantuml.com/ja/)
シーケンス図などは、手描きするより速く書ける。

- [MindMup 2](https://drive.mindmup.com/)
ブレスト用。ツリーを描くのは簡単だがそれ意外のモノを描くのは大変。

ただ個人的には、そもそも**ホワイトボードを使った会議には致命的な問題点**があると思っているのでその点について触れたいと思います。


## ホワイトボード会議の致命的な問題点

こんな経験はありませんか？

- ホワイトボードになぐり書きして白熱の議論となった
- これだけ喋れば伝わっただろうという達成感に満ち溢れた
- 会議終了時にホワイトボードはきれいに消された
- 同時に記憶からも記録からも消された
- 写真に撮っておいても無駄だった
- なぐり書きのメモの写真を見返しても何も思い出せなかった
- 実際には何も伝わってなかった
- 後日同じ様な事を別の人に聞かれて同じ図をホワイトボードに描く事になった

そもそも**記録力ゼロの媒体に対して記憶しておくべき重要な情報を書き込む**ことって徹底的に無駄じゃないですか？


## 暫定一位ホワイトボードツール

この問題点を解決するホワイトボードツール暫定一位は **『エクセル方眼紙』** だと思います。
図形描画より共同編集の方がウェイトが高い場合は **『スプレッドシート方眼紙』** を利用します。

```
『ホワイトボードに期待される機能は「フリーハンドで図や文字が書ける」かと思う。』
```

上でホワイトボードに対する要件を述べましたが、もう少し整理すると、二次元の平面に対して文字や図を書ければよいという事に気がつきます。

ホワイトボードに自由に二次元で書かれた情報や散漫に会議で議論された内容とは別で、ワードやメモ帳やエバーノートで時間軸に沿って一次元の記録として議事録を残すのが一般的な会議の形式となっています。
しかし、もしもホワイトボードに書かれた情報が重要な情報なのであれば、その情報が書かれていない議事録は何の意味も持たないということになります。
結局のところ、本当に必要な記録というのは **『一次元のメモと、ホワイトボードの記憶または写真を元に情報を再整理した何か』** で、再整理するにはMTGと同程度またはそれ以上の時間が必要になりますが、誰がいつ見るかも分からない議事録にそのような工数をかけることもできないというジレンマがあります。

それであれば、例えば仕様MTGであれば、エクセル方眼紙を画面共有してそのまま仕様書として使える様な２次元のメモ、要件定義MTGであれば、要件定義書として使える２次元メモ、を書けばいいのではないでしょうか？

仕様書に書いてしまってその場で合意が取れれば、後から言った言わないで後から議事録をたどる必要もないのではないでしょうか？

エクセル方眼紙以外（部分的には draw.io,PlantUMLでも可）には、そのまま工程のアウトプットにできるツールは存在していないと思うので今の所暫定一位はエクセル方眼紙としました。


## おわりに

昨今、DXで効率化とよく言われますが、DXで本当に解決すべき課題は何かをきちんと見据えた上でツール選定うべきだと思います。

20年以上前に、**MTGのたびに言うことが変わるクライアント様の案件**をやった時に **『エクセル方眼紙議事録兼仕様書』** は生まれました。議事内容を仕様書に書き直しているその瞬間にもクライアント様の考えは変わっていたのです。
流行ってるからDXで効率化したかったのではなく、DXでワークフローを変えないと仕事にならなかったので『エクセル方眼紙議事録兼仕様書』を作成しました。

何かの価値を製造するという共通のゴールに向かうためにMTGや議事録や仕様書は存在しているとは思いますが、わたし達は『MTGをしたり』、『議事録を取ったり確認したり』あるいは『仕様書を書くため』に仕事をしているわけではないですよね？
シーン遷移時にスコアを引き継ぐ

まず、ゲームスタート時(一番最初のシーン))のシーン遷移で
スコア保存用のゲームオブジェクトを作成します。
作成したら下記のScoreDataをアタッチします。

```C#:ScoreData
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScoreData : MonoBehaviour
{
    public int Score;

    void Start()
    {
        DontDestroyOnLoad(this.gameObject);  //DontDestroyOnLoadでシーン遷移後も保存出来る
        Score = 0;  //ゲームスタート時のスコア
    }

    public int GetScore()
    {
        return Score;  //スコア変数をResultスクリプトへ返す
    }
}
```
GameMainシーン
スコア表示を書いたスクリプトに記述

```C#:SystemMain 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SystemMain : MonoBehaviour
{
    public int Score;
    public Text ScoreText;
    public ScoreData Sd;

    void Start()
    {
        Score = 0;
       //ScoreDataを見つける。(前シーンでDontDestroyOnLoadの記述をしたため、GameMainでも保持していられる)
        Sd = GameObject.Find("ScoreData").GetComponent<ScoreData>();  
    }

    // Update is called once per frame
    void Update()
    {
        ScoreText.text = string.Format("{0}", Score);  //GameMainシーンでのスコア表示
        Sd.Score = Score;  //ScoreDataの中のScore
    }


}
```
スコア結果を反映したいシーンへ移動して
元からあるゲームオブジェクトでも新たに作成してもいいので
下記スクリプトをアタッチする。

```C#:Result
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Result : MonoBehaviour
{
    private GameObject ScoreMaster;
    private ScoreData Sd;
    public Text tx;
    int Score;

    void Start()
    {
        ScoreMaster = GameObject.Find("ScoreData");  //ScoreDataを見つける
        Sd = ScoreMaster.GetComponent<ScoreData>();

        Score = Sd.GetScore();  //ScoreDataの中のGetScore関数を呼び出す
        //アタッチしたオブジェクトに反映したいテキストを紐づける。
        tx.text = string.Format("Score  {0}", Score);
    }
}
```

これでスコアが表示されるようになりました！！
【初心者向け】AWS用語集

よく耳にするAWS関連のサービスや用語を簡単に説明していきます。

参考文献：AWS認定ソリューションアーキテクトーアソシエイト　教科書

##VPC
　AWS上に独立したプライベートネットワーク空間を作成できるサービス
##サブネット
　VPC内に構築するネットワークセグメントのこと。どのAZ（アベイラビリティーゾーン）に作成するか、プライベートサブネットかパブリックサブネットか選べる。
##IGW(Internet Gate Way)
　VPC内のリソースからインターネットへアクセスするためのゲートウェイ。IGWをVPCにアタッチすることでVPC内からネットに接続できる。
##Elastic IP(EIP)
 固定のグローバルIPアドレスを提供するサービス。
　通常、EC2インスタンスを停止するとそれまで使用していたIPアドレスを保持することはできません。起動するたびにIPアドレスが変わるのは運用上手間がかかるため、EIPで固定IPアドレスを指定します。
##VPCエンドポイント
　ルートテーブルに指定されたターゲットを追加することでS3やDynamoDBへアクセスする際に、インターネットを経由せずにAWS内のプライベート接続を実現することができます。
##セキュリティーグループ
　EC2インスタンス単位で適用するファイヤーウォール機能（セキュリティー設定）です。EC2インスタンスに複数のセキュリティーグループ（複数のセキュリティールールの集合体）を適用可能。
##ネットワークACL
　セキュリティーグループと似ているが、こちらはサブネット単位でセキュリティーグループを適用する。
##ELB(Elastic Load Balancing)
ロードバランシングサービス。下記３種類がある。

+ CLB(Classic Load Balancing)
標準的なロードバランシング
+ ALB (Application Load Balancing)
CLBの機能に追加して、あらかじめ設定したパスのルーティングに従って振り分ける。そのため、アプリケーションサーバーのコンテンツベースで特定のサーバーへ処理を振り分けることができる。
+ NLB (Network Load Balancing)
低レイテンシーで高スルートップを実現する。送信先のアドレスを保持するためレスポンスはクライアントへ直接返す。

ELBの主な特徴
 
+ 高可用性｜　複数のAZへ分散することができる
+ 自動スケーリング
+ セキュリティー機能｜　SSL複合の機能・セキュリティークループの設定
+ ヘルスチェックとモニタリング｜　EC2が正常に動いているかチェックしてくれる
+ 外部ELBと内部ELB
+ クロスゾーン負荷分散｜　AZに登録された全てのインスタンスに対して均等にリクエストを分散する
+ Auto Scaling｜　リソースの状況に合わせて、設定通りにEC2を自動でスケールアウト・インしてくれる

##Route53
　可用性の高いDNSを提供するマネージドサービス。

####DNSとは・・・？
Domain Name System（ドメイン・ネーム・システム) の略です。人間が読み取れるドメイン名 (example.co.jp や、www.example.comなど) を機械が読み取れる IP アドレス (192.0.2.44 など) に相互に変換してくれるシステムのことです。また、ドメイン名からIPアドレスを調べることを「名前解決」といいます。

参考：https://qiita.com/drafts/f60b553660b818a469b1/edit　

##EC2
AWSga仮想サーバーを提供するサービスで、このサービスを利用して作成した仮想サーバーをEC2インスタンスと言います。

##S3
高耐久・大容量のオブジェクトストレージサービスです。S3はバケットと呼ばれる単位で作成します。

以下のような特徴・機能を備えています。

+ 高耐久性｜　三箇所のAZへ自動的に保存されるためデータの耐久性は99.999999999％！！！！
+ 大容量ストレージ| 利用できる容量に実質制限はない
+ バージョニング機能｜　オブジェクトの世代管理を提供してくれる
+ 静的Webサイトホスティング機能｜　簡易的なサイトであればサーバーを使わずにウェブサイトの公開も可能
+ 暗号化（AESー256暗号化という暗号方式をとっている）
+ アクセス制御（IAM・バケットポリシー・ACLからそれぞれアクセス制御ができる）

ストレージの形式には、以下のようなものが用意されている。

+ スタンダード（デフォルト）
+ 標準低頻度アクセス｜　低コストだがデータ読み取りに対して課金されるため、バックアップ向き
+ １ゾーン低頻度アクセス｜耐久性は下がるが安価
+ 定冗長化ストレージ｜　通常３箇所のAZを２箇所に減らしてコストを抑える。
+ Amazon Glacier｜　アーカイブを目的としたストレージで、大容量のデータを安価に保管できるが、データアクセスには時間がかかる
+ 署名付きURL｜　S3上のデータに一定時間だけアクセス可能とするURL発行機能
+ ログ保管
+ マルチパートアップロード
+ クロスリージョンレプリケーション｜　別リージョンにもオブジェクトを複製してさらなる耐久性向上

##EBS
永続化可能なブロックストレージサービスで、EC2インスタンスにアタッチすることで利用可能。
ブロックストレージとは、データを「ブロック」と呼ばれる細かい単位で分割して保管する方式。

以下のようなストレージタイプが用意されています。

+ 汎用SSD（デフォルト）
　SSDを安価に利用できる。SSDとはSolid State Drive（ソリッド・ステート・ドライブ）の略で、HDDと同じように使えるメモリーチップタイプの記憶装置。
+ プロビジョンドIOPS SSD(PIOPS : io1)
+ スループット最適化HDD (st1)
Rubyのtimesでハマった話

配列から取り出す時に0から数えるというのは知っていましたが、timesも同じ仕様になっていると知らずにちょっとハマったのでメモ

# そもそもtimesとは
* Rubyの繰り返し処理に使うメソッドの一つ

例えば

```
5.times do
  puts 'Hello World'
end
```
は以下の様になる。

```
Hello World
Hello World
Hello World
Hello World
Hello World
```

# ハマった事
全部Hello Worldと出力するのもつまらんという事で、最後だけ変更しようとした時に以下の様にしてしまった。

```
5.times do |i|
  if i == 5
    puts 'Hello Work'
  else
    puts 'Hello World'
  end
end
```
この場合は残念ながらこうなってしまう.

```
Hello World
Hello World
Hello World
Hello World
Hello World
```
# こうすればOK

```
5.times do |i|
  if i + 1 == 5
    puts 'Hello Work'
  else
    puts 'Hello World'
  end
end

Hello World
Hello World
Hello World
Hello World
Hello Work
```
他の繰り返し処理や冒頭であげた配列も0から数えます。0から数えるということを頭の片隅に置いておけば、なんてことないと思うのでプログラミング初学者の方は気を付けましょう。
参考
[Ruby公式リファレンス](https://docs.ruby-lang.org/ja/3.0.0/doc/glossary.html)
Gmailで容量を喰ってるメールをGASで一気に削除する

# はじめに
こんにちは。自販機で買えるミニッツメイドのピンクグレープフルーツのジュースが好きです、筆者です:v:

さて、Gmailの容量を喰ってるメールってありますよね。なんかでかい添付ファイルくっついてて、そういうメールって大体自分に関係なくて、Ccとかで送られてくるから、いつもそのまま放置してます。
(あくまで自分の場合です:pray:)

そんなメール、普通にGmail上で消すこともできますが、今回はGASで定期的に自動で削除していこうと思います！

# 対象メール
1. 添付ファイルがついているメール.
1. 1かつ10MBを超えるメール.


# 実スクリプトはこちら

```js
const deleteMail = () => {
  let offset = 0;
  const limit = 500;

  while (true) {
    var threads = GmailApp.search('has:attachment larger:10M', offset, limit);
    offset += limit;

    for (thread in threads) {
      for (key in threads[thread].getMessages()) {
        if (threads[thread].getMessages()[key].isInTrash()) {
          continue;
        }
        threads[thread].getMessages()[key].moveToTrash();
      } 
    }
    if (threads.length < limit) break;
  }
}
```

# おわりに
Gmailの容量が少なくなったときは、容量が大きいメールを削除するのが効率がいいです :+1:

以下のスクリプトにがっちゃんこして、定時実行させておくのもおすすめです :ok_hand: 

https://qiita.com/akitkat/items/f4070b81d85af2f9a354

それでは！
TextViewで数値を表示したいときの備忘

TextViewで文字列（String）を表示させていましたが、あるとき計算結果を表示させる、
つまり、TextViewで数値（int）を表示させる必要が出てきました。

なんの疑問も持たずに以下を記載。

```java:qiita.java
int num = 1 + 1;
textView.setText(num);
```
結果はエラー。。。　以下の記載をすると解決。

```java:qiita.java
int num = 1 + 1;
textView.setText(String.valueOf(num));
```
文字列に変換してあげるといいみたいですね。

参考書に、__『TextViewタグ…文字列の表示』__
とありましたので、TextViewに渡すときは文字列（String）にして渡すのが必須なのでしょう。
iOSで使ういろんなアイコンサイズ

毎回ヒューマンガイドラインを探して
そのたびにヒューマンガイドラインが更新されていてつらいので
ちゃんとメモしておこうという自戒

更新：2021/07/03

## Navigation Bars のアイコン

ターゲットサイズ　24x24pt （@3x時は72x72px）
最大サイズ　28x28pt (@3x時は84x84px)

ソース
https://developer.apple.com/design/human-interface-guidelines/ios/bars/navigation-bars/

## Tab Bars のアイコン

丸
基本サイズ　25x25pt (@3x時は75x75px)
コンパクトサイズ　18x18pt (@3x時は54x54px)

四角
基本サイズ　23x23pt (@3x時は69x69px)
コンパクトサイズ　17x17pt (@3x時は51x51px)

ソース
https://developer.apple.com/design/human-interface-guidelines/ios/bars/tab-bars/

## Toolbars のアイコン

ターゲットサイズ　24x24pt(@3x時は72x72px)
最大サイズ　28x28pt (@3x時は84x84px)

https://developer.apple.com/design/human-interface-guidelines/ios/bars/toolbars/

## メモ

まだあった気がするので都度追記します。
PowerBI 用語メモ

#「カーディナリティ」とは
ここではテーブルの関係が「多対一」、「一対多」、「一対一」、「多対多」から選びます。初期設定のままでいいケースが多い。 

#「クロス フィルター」とは
SQLでいうJOINの事です。単一か双方向の2種類があり、それぞれOUTER JOINとINNER JOINを指しています。SQLに詳しくない方はここでは心配せずに自動的に選ばれる選択（この場合は単一）のままで問題ありません。
mixOmicsのエラー「'cpus' has been replaced by BPPARAM」の対処方法

mixOmicsのDIABLOのチュートリアル[http://mixomics.org/mixdiablo/case-study-tcga/](http://mixomics.org/mixdiablo/case-study-tcga/)をのコードをコピペした以下のコードを実行すると、

```{R}
tune.TCGA = tune.block.splsda(X = X, Y = Y, ncomp = ncomp, 
                              test.keepX = test.keepX, design = design,
                              validation = 'Mfold', folds = 10, nrepeat = 10,
                              cpus = 2, dist = "centroids.dist")
```

最新のmixOmicsのバージョンを使っている場合に以下のようなエラーが吐き出されます。

```{R}
tune.block.splsda(X, Y, ncomp = ncomp, test.keepX = test.keepX,  でエラー: 
  'cpus' has been replaced by BPPARAM. See documentation.
```

このエラーは、上記のtune.block.splsda()の引数のうち、マルチコアを用いた並列計算を指定する「cpus」という引数が、バージョンアップにより使われなくなったことに起因します。新しいバージョンでは、cpusの代わりに「BPPARAM」という引数を使用します。

そこで、macやLinuxの場合、上記のようにBiocParallelパッケージのMulticoreParamを用いて並列化を実行します。コア数はparallelパッケージのdetectCoresを用いて検出することができます。


```{R}
##BiocParallel パッケージをインストールする
##BiocManager::install("BiocParallel")

##コア数を検出して指定
BPPARAM <- BiocParallel::MulticoreParam(workers = parallel::detectCores()-1)

tune.TCGA = tune.block.splsda(X = X, Y = Y, ncomp = ncomp, 
                              test.keepX = test.keepX, design = design,
                              validation = 'Mfold', folds = 10, nrepeat = 10,
                              BPPARAM = BPPARAM , dist = "centroids.dist")
```

windowsの場合、MulticoreParamはサポートされていないので代わりにSnowParam()を用いると並列化ができると思います。

```{R}
BPPARAM <- BiocParallel::SnowParam(workers = parallel::detectCores()-1)

tune.TCGA = tune.block.splsda(X = X, Y = Y, ncomp = ncomp, 
                              test.keepX = test.keepX, design = design,
                              validation = 'Mfold', folds = 10, nrepeat = 10,
                              BPPARAM = BPPARAM , dist = "centroids.dist")
```



以上、mixOmicsのバージョンアップに対応したエラーの処理でした。
Raspberry Pi4を購入したが、Mirco HDMIケーブルが手元になくて困った話



#経緯
+ 「ラズベリーパイを購入した方は、この商品も購入しています。」
に騙されてMini HDMIとセットで購入し、無事死亡した話

# 目的
+ 個人的なメモ書きです。
+ ~~黒猫~~を待たずに、モニターなしで初期設定を完了したい。

# 想定している読者
+ Raspberry Piをモニターなしでセットアップしたい人
+ モニターケーブル(Mini HDMI)を誤って購入し、配送を待てない割に買い物に行かない人  
(必ず、[Micro HDMI](https://www.amazon.co.jp/UGREEN-HDMI%E5%BB%B6%E9%95%B7%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-HDMI%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-Transformer-Yoga%E3%81%AA%E3%81%A9%E5%AF%BE%E5%BF%9C/dp/B07QBZ667V/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=micro+hdmi&qid=1625295473&sr=8-5)を購入してください)

# RaspberryPi 初期設定
### 1. MicroSDカードにOSを書き込む 
・[Raspberry Pi Imager](https://www.raspberrypi.org/software/)をインストールする
  ・OSとインストール先のMicroSDカードを指定します。
・"WRITE"をクリックする

### 2. 起動前にsshを有効化する
・MicroSDカードのルートディレクトリを開きます
・テキストファイルを作成します
・名前を**ssh**に変更します
（拡張子の.txtは削除してください）

### 3. 起動前にWLAN接続を完了する
・MicroSDカードのルートディレクトリを開きます
・テキストファイルを作成します
・名前を**wpa_supplicant.conf**に変更します
・下記を参考に、テキストエディタで中身を編集します

``` wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="SSID"
    psk="Password"
}
``` 
※SSIDとPasswordは、自身の環境に合わせて変更してください

### 4. RaspBerryPiを起動する
・SDカードを挿入し、電源コードを接続します

### 5. sshで接続する
・コマンドプロンプトを起動します。
以下のコマンドを入力し、エンターキーを押下します

```
ssh pi@raspberrypi.local
```
パスワードを要求されるため**raspberry**と入力しエンターキーを押下します

2021/07/03 追記予定になります。
エディター画面でオブジェクトが見切れてしまうときの対処法

#クリッピングがおかしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714568/925d07d5-b466-5362-0820-2d4791871e44.png)

##解決法
エディター画面右上のビデオカメラアイコン→**Dynamic Clipping**をオフ
or
同じくカメラアイコン→**Clipping Pans**→**Near**の値を低く設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714568/5f632678-1979-22f2-5fe9-4ac15122d394.png)
GitHubActionsで定期実行

# はじめに
「SlackBOT」や「LINEBOT」を作すると、それを使用するために定期実行したくなります。
定期実行するとなるとどんなツールを思い浮かべますか？

「cron」、「heroku」、「GCP」...など色々ありますよね。

僕自身上記の３つを使ったことがありますが、設定がめんどくさかったり、うまくいかなかった経験があります。

「もっと簡単に定期実行できたらいいのに...」と悩んでいた時に見つけました！

それは「GitHubActions」です。

この記事では「GitHubActions」で定期実行する手順を紹介していきます。

めちゃくちゃ簡単にできるので一度やってみてください！

それではいきましょう！

＊この記事ではPythonメインに説明しているのでご了承ください。（Python知らなくても問題はないです。）

# GitHubとは？

そもそも「GitHub」とはなんぞや？という方は下の記事を参考にしてください！

**[GitHubは難しくないよ！](https://www.cardenema.com/?p=687)**

# GItHubActionsを使ってみる

では早速「GItHubActions」を使ってみましょう！

![Screen Shot 2021-07-03 at 15.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570269/e65f4472-4516-6864-3c16-2c49c853aeed.png)

まずは定期実行したい「GitHub」リポジトリにアクセスして「Actions」という部分をクリックしてください。

「Set up this workflow」を押してください。

![Screen Shot 2021-07-03 at 15.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570269/9b092405-c9f5-c01b-1954-f117788de5fc.png)

そうすると上の画像のような画面が出てきます。

ここで定期実行する設定ができます。

## 設定

ただパッとみてもよくみても何をしているのかさっぱりだと思います。

なので上の画像のコードを消して、下のコードをコピペしてください。

```yaml
# ワークフロー名
name: housework_bot
on:
  schedule:
    # 定期実行する時間・・・①
    - cron: '0 22 * * *'

jobs:
  build:
    # Ubuntuの最新版環境内で処理を実行することを指定
    runs-on: ubuntu-latest

    # 実行する処理＆コマンド指定
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          # pip更新
          python -m pip install --upgrade pip
          # 必要なパッケージインストール・・・②
          
      - name: Run script
        run: |
          # 定期実行するファイルを指定。・・・③
          python 定期実行するファイル
```

上記のコードで編集が必要な部分を説明していきます。

### 定期実行する時間・・・①

ここで定期実行する時間を指定することができます。

ここではcronを使用します。

cronの時間設定についてわからない方は以下の記事を参考にするか「cron 使い方」などでググってみてください。

**[cronの日時指定を、基礎から学ぶ（分,時,日,月,曜日の指定、◯分ごと、月末起動、など）](https://www.yoheim.net/blog.php?q=20190902)**

ここで注意点があります。

それはタイムゾーンの仕様で9時間引く必要があります。

どういうことかというと、毎日8時に定期実行したい場合「0 8 * * *」ではなく「8 - 9 = 23(夜11時)」つまり「「0 23 * * *」とする必要があります。

この点に注意しながら設定してみてください。

複数「cron」を設定したい方は以下のように指定してください。

```yaml
- cron: '0 22 * * *'
- cron: '0 1 * * *'
- cron: '0 4 * * *'
- cron: '0 6 * * *'
```

### 必要なパッケージインストール・・・②

ここで必要なパッケージをインストールできます。

Pythonを使用している場合は、以下のように必要なパッケージのインストールコマンドを入力してください。

```yaml
pip install numpy
pip install pandas
.
.
.
```

余分なものをインストールすると時間がかかるので注意してください。

### 定期実行するファイルを指定。・・・③

ここで定期実行するファイルを指定します。

Pythonならば「python main.py」のようにしてください。

（他の言語の場合は適切なものに変更してください。）

## ファイルの実行

では先ほど設定したファイルを実行しましょう。

![Screen Shot 2021-07-03 at 15.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570269/13628b39-6603-4d61-a604-7531c404346f.png)

上の赤枠部分でファイル名を自由に指定して、右の赤枠の「Commit changes」をクリックしてください。

これでファイルの実行は完了です。

設定した時間に先ほどのyamlファイル内で指定したファイルを実行してくれます。

もしcommitした時に確認の意味を込めて実行されるようにしたい場合は、画像の左赤枠の「# push」を「push」としてください。

「Commit changes」をクリックした時に実行されるので確認してみてください。

# 注意事項

設定した時間ぴったりに実行されない場合があります。

具体的には5, 6分ずれる可能性があるのでご注意ください。

# 最後に

今回は「GitHubActions」を使って定期実行する方法を見てきました。

どうだったでしょうか？

結構簡単だったのではないでしょうか？

もし定期実行したい場合は一度「GitHubActions」を使ってみてください！

それでは！
円形断面及び薄板円筒断面の軸力-曲げ耐力計算

#1. 初めに
円筒断面のN-M曲線を計算する際に、毎回必要に迫られて計算式を作成するので、整理しておきます。

#2. 対象とする断面形状
厚肉の円筒断面と薄肉の円筒断面を対象とします。厚肉の円筒断面は外側の円形断面から内側の円形断面を差し引くことで計算可能です。薄肉円筒断面は円周上に板厚tの薄板として計算します。

#3. 円形断面
円の半径Rとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/d7e4e27b-b9f8-7b3b-537a-19140fb4070d.png)

```math
N = \int_{x1}^{x2} \sigma (x) \cdot A(x) dx \\
=\int (ax+b) \cdot \sqrt{R^2 - x^2} dx \\
= \left[
-\frac{a}{3} ( R^2 - x^2 )^ \frac{3}{2} + \frac{b}{2} \biggl( R^2 \cdot \sin^{-1} \frac{x}{R} + R \cdot x \cdot \sqrt{ 1 - \frac{x^2}{R^2}}  \biggr)
\right]_{x1}^{x2}
\\
```


```math
M = \int_{x1}^{x2} x\cdot \sigma (x) \cdot A(x) dx\\
=\int_{x1}^{x2} (ax+b) \cdot x \cdot \sqrt{R^2 - x^2} dx\\
= \left[
 \frac{a}{8} \{ R^4 \sin^{-1}\frac{x}{R} - x \cdot \sqrt{R^2-x^2} \cdot (R^2-2 \cdot x^2)\}  -  \frac{b}{3} ( R^2 - x^2 )^\frac{3}{2}
 \right ]_{x1}^{x2}
```


```Python 
def integYSg(R,a,b,x):
    '''
    ∫(ax+b)・√(R**2 - x**2) dx
    R:半径
    '''
    return -a/3*(R**2 - x**2)**(3/2) + b/2*(R**2*np.arcsin(x/R)/2 + R*x*np.sqrt(1 - x**2/R**2))

def integYSgX(R,a,b,x):
    '''
    ∫(ax+b)・x・√(R**2 - x**2) dx
    R:半径
    '''
    ans =  a/8*  (R**4*math.asin(x/R) - x * math.sqrt(R**2 - x**2) * (R**2 - 2 * x**2) ) \
        - b/3*(R**2 - x**2)**(3/2)
    return  ans

```

#4. 薄肉円筒断面
半径R、板厚t、x=Rsinθとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260594/22358a25-932a-d017-738a-fd610c8627b5.png)


```math
N = \int_{\theta 1}^{\theta 2} \sigma (x) \; dA \\
= \int_{\theta 1}^{\theta 2} \sigma (x) \cdot t \cdot R \; d\theta \\
=\int ( ax+ b )\cdot t \cdot R \; d\theta \\
=\int ( a\cdot t \cdot R^2 \sin \theta + b \cdot t \cdot R ) \; d\theta \\
=\left[  -a\cdot t \cdot R^2 \cos \theta + b \cdot t \cdot R \cdot \theta \; \right]_{\theta 1}^{\theta 2}
\\
```

```math
M = \int_{\theta 1}^{\theta 2} x\cdot \sigma (x) \; dA \\
=\int (ax+b) \cdot x \cdot t \cdot R \; d\theta \\
=\int (atRx^2+btRx)    \; d\theta \\
=\int (atR^3 \sin^2 \theta + btR^2 \sin \theta)    \; d\theta \\
=atR^3 \int \sin^2 \theta + btR^2 \int \sin \theta    \; d\theta \\
=atR^3 \int \frac {1-\cos2\theta}{2}  + btR^2 \int \sin \theta    \; d\theta \\
=atR^3 \left [ \frac{\theta}{2} - \frac{\sin2\theta}{4} \right]_{\theta 1}^{\theta 2} - btR^2 \left[\; \cos \theta \; \right]_{\theta 1}^{\theta 2} \\

```

```Python 
def integRYSg(R,a,b,x):
    '''
    円弧の積分∫(ax+b)・dA
    R:半径
    板厚tを乗じる必要あり
    '''
    th  = np.arcsin(x/R)
    return -a*R**2*np.cos(th) + b*R*th

def integRYSgX(R,a,b,x):
    '''
    円弧の積分∫(ax+b)・x dA
    R:半径
    板厚tを乗じる必要あり
    '''
    th  = np.arcsin(x/R)
    return +a*R**3*(th/2-np.sin(2*th)/4) - b*R**2*np.cos(th)

```
シェル 備忘録

#【シェル 備忘録】

##シェル

Linux, UNIX等のOSに対して、命令をおこなうソフトウェア

##シェルスクリプト

シェルスクリプトはプログラム。
bashなどが代表的である。（Linuxの標準）

バックエンドエンジニアには必須の知識。
いろんな処理に対する自動化に使用されている。

##標準入力、標準出力

**標準入力**
コマンドを実行するにあたって、特に指定がなかった場合に利用する。
ユーザがキーボードから入力する文字列、パイプから渡された文字列を扱える。

**標準出力**
コマンドを実行した結果のうち、標準的な出力先へ表示する実行結果。
指定がない場合はコマンドラインの画面が標準出力先となる。
パイプを利用することで「パイプで繋いだ次のコマンドの標準入力」が標準出力先となる。
IIRフィルタ、双2次フィルタどれが良いの？調査して、比較してみた

#概要
モータ実機を使ってフィードバック制御をしようとしたときにで電流や速度をマイコンに取り込む上でフィルタを使用する必要性がでてきた。そこでデジタルフィルタについて調査してみると以下のフィルタと遭遇した。
FIRフィルタ、IIRフィルタ、双2次フィルタ、
制御工学の中で使用されるのは急峻なフィルタ特性からIIRと双2次フィルタの模様。
今回はIIRフィルタと双2フィルタについての調査結果をまとめた。
また、Matlab上でシミュレーションしそれぞれを比較した。
結論
・デジタルフィルタの設計方法は離散系のフィルタの伝達関数からフィルタ係数を計算。フィルタ係数はカットオフ周波数から決まる
・双2次＜IIR1次＜IIR2次の順で急峻である



#詳細
IIRフィルタの一般式を示す。もはやこれに関しては一般式としてはこういうもので何を変えたらどうなるのかをわかっていればある程度良いのかなと思う。式としては過去の入力xに係数aをかけたのと、過去の出力yに係数bをかけた総和をフィルタ出力としている。これをz変換して伝達関数の形Y(z)/X(x)として書くと一つのシステムとして見れる。aとbでカットオフ周波数が決まり、M,Nでフィルタ次数が決まる。フィルタ次数は大きいほど、フィルタ特性が急峻になる。例えばLPFであれば減衰率が増える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/e3c1e425-a2aa-2056-1625-fc685c8d1b03.png)

フィルタ次数1,2の時の伝達関数は以下となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/1c485d7c-8687-d846-7c24-f596bb243a63.png)

具体的にIIR1次を作ってみる。
設計方法としては、色々あるみたいだがここでは以下の手順で作る
1：連続系の1時遅れシステムを考える。
2：カットオフ周波数を決める。
3：双一次変換でZ変換する
※Z変換する際に双一次か交代差分かで式が変わる

以下例ではカットオフ周波数wc = 1rad/sでIIR1次の設計例である。
※αはcotanjent (wc*サンプリング周期/2)で求めている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/a46a0f0a-5ea8-9d35-0c25-889b6fc0f77d.png)

基本的にはIIRでも双二次でもZ変換されたフィルタの伝達関数があるし、分母分子の係数の計算方法もカットオフ周波数から一意に決まるのでそれに乗っとればフィルタ作成はできる。
ちなみに双二次はこれ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/ac46f055-2d11-6a33-6274-6e13d3cae0c4.png)


#シミュレーション
設計方法はわかった。次にシミュレーションして比較してみる
とある信号の生データと生データに対してIIR1次、IIR2次、双二次フィルタをかけた波形を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/593f1d6e-59aa-0079-93d7-6058d2afda32.png)
次にボード線図で比較してみた、ちなみにカットオフ周波数は100Hzで設計
IIR2次がこの中では最も特性が良い。
※双二次に急峻性を調整するパラメータQ値があるが、IIR2次よりも急峻になることはなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/bc863c50-5889-aa88-4fda-207b53d4bd3f.png)

#補足
参考にしたサイトはこちら

https://ufcpp.net/study/sp/digital_filter/biquad/

https://vision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2013/dsp2013_12.pdf

#結論

・IIRの1次とRCフィルタはアナログかデジタルかの違い。
・デジタルフィルタの設計方法は離散系のフィルタの伝達関数からフィルタ係数を計算。フィルタ係数はカットオフ周波数から決まる
・双2次＜IIR1次＜IIR2次の順で急峻である


#使用ソフト
Matlab
【BashでJSON】複雑なJSONデータをPOSTする


## 概要

やや複雑な JSON データの HTTP POST 操作を Bash ShellScript で実施する方法.

## 詳細

下記 Python コード相当の処理を Bash ShellScript で実施する.

```python
-*- coding: utf-8 -*-
import requests
payload = {
 "authors":"やなせたかし",
 "book":[
    {
        "title": "あんぱんまんとばいきんまん",
        "price": 935
    },
    {
        "title": "あんぱんまんとうみのあくま",
        "price": 935
    }
 ]
}

requests.post("http://<IP>:<PORT>/api/v1/admin/", payload)

```

## Bash ShellScript コード

```bash
#!/bin/bash  

H="Content-Type: application/json"

payload=$(< <(cat <<EOF
{
 "authors":"やなせたかし",
 "book":[
    {
        "title": "あんぱんまんとばいきんまん",
        "price": 935
    },
    {
        "title": "あんぱんまんとうみのあくま",
        "price": 935
    }
 ]
}
EOF
))

curl -i -X POST -H "$H" -d "$payload" http://<IP>:<PORT>/api/v1/admin/

```

　

以上.
macのターミナルで、EC2にssh接続方法 + コマンド省略の設定方法

キーペアの作成しインスタンス作成後、インスタンスにssh接続するコマンドを記載します。
また、./ssh/configに必要なログイン情報を記載することで、ログイン時のコマンドを省略できます。
キーペア名はec2-key.pem


#ゴール
以下のコマンドでssh接続できます

```
$ ssh ec2       

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

https://aws.amazon.com/amazon-linux-2/
```

#ssh接続方法
```
$ mv ~/Downloads/ec2-key.pem ~/.ssh

$ chmod 600 ~/.ssh/ec2-key.pem


ssh -i [キーファイルの指定] [ユーザー]@[IP]

$ ssh -i ~/.ssh/ec2-key.pem ec2-user@✕✕.✕✕✕.✕✕✕.✕✕

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

https://aws.amazon.com/amazon-linux-2/
```

上記のコマンドによって、ダウンロードしたキーペアを移動させ、キーペアの権限を変更し、インスタンスにssh接続できます。

AmazonLinuxの初期ユーザ名は[ec2-user]です。


AmazonLinuxは　[ec2-user]
Ubuntuは　[ubuntu] もしくは [root]
Centosは　[centos]

#コマンドを省略する設定方法


まず、.sshディレクトリ内にconfigファイルを作成します。
configファイルは、インスタンスにSSH接続するときに利用される設定ファイルです。

```
$ pwd
/Users/[ユーザー名]

$ cd .ssh
$ cat config
cat : config: No such file or directory

$ touch config
```

以下のようにconfigファイルに記載します。

```.ssh/config.

HOST 接続するホストのエイリアス
 HostName IPアドレス または ホスト名
 User	ログインユーザ名
 IdentityFile	秘密鍵のパス


HOST ec2
 HostName XXX.XXX.XXX.XXX
 User ec2-user
 IdentityFile ~/Downloads/ec2-key.pem
```
`Host`は、接続するホストのエイリアスです。今回はec2
`HostName`は、パブリック IPv4 アドレス
`User`は、ec2-user
`IdentityFile`は、キーペアの置き場所
<br>

##.ssh/config を利用してssh接続

`ssh ec2`でssh接続できました。

```
$ ssh ec2       

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

https://aws.amazon.com/amazon-linux-2/
```

##接続できない場合

以下のエラー表示は、キーペアの置き場所があっていませんので、configを修正するか、キーペアの置き場所を`/Users/hiraiyuuji/Downloads/ec2-key.pem`変更してください。

```
no such identity: /Users/hiraiyuuji/Downloads/ec2-key.pem: No such file or directory
ec2-user@XXX.XXX.XXX.XXX: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
【キャッチアップ】AWS-S3

simple storage service
`キー；オブジェクト`　形式のストレージサービス

S3イベント通知でlambdaを実行する

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/NotificationHowTo.html

https://dev.classmethod.jp/articles/challice-s3event-lambda-made-in-3-minutes/

【参考】入門的な動画

https://www.youtube.com/watch?v=K3O9Bi4KoKo
Logicoolマウスのボタンにショートカットキーを割り当て、Ubuntu20でも使えるようにする

# 環境
 Ubuntu20.04.2 LTS
 

# 背景
　Logicoolから[MX ERGO MXTB1s](https://www.logicool.co.jp/ja-jp/products/mice/mx-ergo-wireless-trackball-mouse.910-005183.html)のような複数のボタンを持つマウスが発売されており、ボタンごとに機能(例えば、戻るや進む)を割り当てることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/923be9f0-0c30-396c-8780-b58760ac5121.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/83e24bbc-2785-8ad5-c356-482c220bc4c5.png)

私の環境では、戻るや進むによってページを見失いたくないため、Google Chromeの拡張である[Link Blanker](https://chrome.google.com/webstore/detail/link-blanker/lkafdfakakndhpcpccjnclopfncckhfn?hl=ja)をinstallして、クリックすると別タブで開くようにしている。
そこで、快適にブラウザを使うために、
・ 開いている次のタブに移動する(ショートカットキー: Ctrl+Tab)
・ 開いている前のタブに移動する(ショートカットキー: Ctrl+Shift+Tab)
・ 現在のタブを閉じる(ショートカットキー: Ctrl+W)
・ 閉じたタブを再度開く(ショートカットキー: Ctrl+Shift+T)
の4つの機能をマウスのボタンに割り当てたい。


ボタンの割当は、WindowsやMacの場合、[Logicool Options](https://www.logicool.co.jp/ja-jp/product/options)というソフトをダウンロードすることで、簡単に各ボタンに機能を割り当てることができる。ウィンドウの最小化等も割り当てが可能になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/98973abf-cf15-08d4-3533-224a5fa66d4a.png)

しかし、Ubuntu20.04.2では、Logicool Optionsに対応しておらず、代わりに[Solaar](https://github.com/pwr-Solaar/Solaar)なるものがあるが、キー割り当て等の機能は見当たらない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/8d17fa1d-b3e8-5a80-5c8b-4582632de9c6.png)


# 目的

Ubuntu20.04.2で「開いている次のタブに移動する(ショートカットキー: Ctrl+Tab)」等をマウスのボタンで実行できるようにする


# 方法

一言でいうと、
ショートカットキーをxdotoolで実行する形でxbindkeysの設定ファイル`~/.xbindkeysrc`に記載する。

install

```
$ sudo apt-get install -y xdotool xbindkeys
```


まず、マウスのボタン番号を調べる。

```
$ xev | grep button
```

を実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/27628f4a-9fbc-7238-1aa6-297eb279c090.png)

のようなポップアップが表示されるので、その上でマウスのボタンを押す。
ボタンを押すと、ボタンの番号が表示される。下記の場合だとはボタンの番号は9になっている。

```
state 0x0, button 9, same_screen YES
```


これをxbindkeysの設定ファイル`~/.xbindkeysrc`に書き込む。

はじめに設定ファイルを作成

```
$ xbindkeys --defaults > ~/.xbindkeysrc
```


vimで`~/.xbindkeysrc`を開く、

```
$ vim ~/.xbindkeysrc
```

ショートカットキーと割り当てたいボタンの番号を末尾に記載する

書き方は

```
"xdotool key ショートカットキー"
  b:ボタンの番号
```
のような形式。

例えば、

```~/.xbindkeysrc
"xdotool key ctrl+Tab"
  b:9
"xdotool key ctrl+Shift+Tab"
  b:8
"xdotool key ctrl+w"
  b:6
"xdotool key ctrl+Shift+t"
  b:7
```

設定したら一応プロセスを削除したあとに、再読み込みする。

```
$ killall xbindkeys
$ xbindkeys
```

これで、Ubuntu20.04.2でもマウスのボタンからショートカットキーを実行できる

参考
[[linux]マウスボタンにキーボードのキーを割り当てる](https://qiita.com/osorezugoing/items/8feb32df02fd8fc0ba5d)
[xbindkeys + xdotoolを使い無変換キーを押すとAlt+Tabを実行](https://qiita.com/tukiyo3/items/6b6e91cf86aab87fd0ba)
[xdotool コマンド全２６実例](https://blog.capilano-fw.com/?p=3477)
Rubyのバージョンを変えたい

今回はRubyのバージョンを変える方法についてメモを残していきますー

【前提条件】
Ruby３.０.１であること

【今回やりたいこと】
Ryby３.０.１からバージヨンを下げること
全部ターミナルのコマンドでやってます

【変更可能なバージョン】
下記のコマンドでRubyのバージョン変更ができるバージョンを知ることができますよー


```ruby:バージョン変更が可能なバージョンたち
 % rbenv install --list

>>結果
2.5.9
2.6.7
2.7.3
3.0.1
jruby-9.2.17.0
mruby-2.1.2
rbx-5.0
truffleruby-21.0.0
truffleruby+graalvm-21.0.0
```
【バージョン変更したいバージョンをインストール】
バージョン変更できるバージョンをしれたら早速インストールしてみましょう！！
私は2.6.7にしたいので2.6.7を記入してます！
お好みに合わせて変えてくださいねー

```ruby:バージョンインストール
 % rbenv install 2.6.7
```
インストールができましたか？
これでまだ終わりではありません。
インストールが完了しただけなのでまだセットできていません！！
ですので早速インストールしたバージョンを一緒にセットしていきましょうー

【バージョンをセットする】
バージョンを反映させるには以下の２つがあります。

rbenv local 2.6.5
rbenv global

この違いについてはこの方の記事を参考していただけたら分かりやすいと思います！

rbenv の global と local の違い - 約束の地https://obel.hatenablog.jp › entry


```ruby:どっちかでOKです！！
rbenv local 2.6.5
rbenv global 2.6.5
```

この２つの違いはシステム全体でバージョンを変えたいときはglobal
１つのシステム（ディレクトリ）で変更をしたいときはlocalという認識で私はいます。
（間違えていたら優しい方ご指摘ください！！）

【バージョンがセットされたか確認】
最後にバージョンがセットされたか確認をします！私の場合は２.６.５がセットされればOK

```ruby:セットされたかの確認
rbenv versions 
  system
  2.5.1
* 2.6.5 (set by /Users/....ruby-version)
  3.0.1
```
set byが記載されているところが２.６.５の横であれば私の場合はOKです！

Rubyバージョンの変更は以上になります！！

【最後に余談】
私はここまでたどり着くのに結構時間がかかりました．．．
今回セットしている途中でエラーなどが起きたところは省略していますー

今回記事を書いていて結構記事を書くのが楽しいことに気がついてしまった。
書く時間があったらまたこんな感じに自分の出来事の範囲で書きたいと思いますー

最後まで見てくれたありがとうございます！！
Dockerイメージの保存先を変更する方法 [docker 19.03]


## 概要

デフォルトの Dockerイメージ保存先は「/var/lib/docker/以下」である.

しかし、使用しているマシンでは /var/ が配置されているディスク容量が極少(30GB) であり、すぐにディスクが枯渇してしまう.
他方 /Bulk には約 1TB のスペースがあった.

そこで、Dockerイメージの保存先を /Bulk へ変更したときの手順を記す.

## 環境
### OS
```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
```
### docker
```
$ docker version | head -n2
Client: Docker Engine - Community
 Version:           19.03.13
```

## 留意事項

### その1

参考にした情報源は忘れてしまった.
ただ、本手順は docker バージョン 19.03 系と割り切って参考にしてほしい.
docker も仕様変更が多めなので、異なる docker バージョンでは改めて調べることになると思う.

### その2

これまで稼働させていた Dockerイメージを引越しさせることはできなかった. (当然、コンテナも消える)
イメージビルドのやり直しが必要になるので注意すること.

## 手順

### 1. docker を停止させる

```bash
$ sudo systemctl stop docker
```

### 2. /etc/docker/daemon.json を作成する

```bash
$ sudo touch /etc/docker/daemon.json
```

### 3. Dockerイメージの保存先を作成する

`sudo` を付与する・しないは各自の環境に応じて選択すること.

```bash
$ sudo mkdir /Bulk/docker
```

### 4. /etc/docker/daemon.json に対して「data-root」を定義する.

「data-root」の値には、上記 3 で作成したディレクトリを指定する.

```bash
$ sudo cat /etc/docker/daemon.json
{
 "data-root": "/Bulk/docker"
}
```

### 5. docker を稼働させる

```bash
$ sudo systemctl start docker
```

以上
Dockerエンジンに対してDNSサーバを指定する [docker 19.03]


## 概要

Dockerエンジンに対して DNS サーバを指定する方法を検索すると幾つか情報が見つかるが、自分の環境に該当するもの・しないものがあった.

ここでは自分の環境では有効になった手順を記しておくので、閲覧者皆の環境に該当することは保証できない.



## 環境

### OS
```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
```
### docker
```
$ docker version | head -n2
Client: Docker Engine - Community
 Version:           19.03.13
```

## 手順

### 1. docker を停止させる

```bash
$ sudo systemctl stop docker
```

### 2. /etc/docker/daemon.json を作成する

```bash
$ sudo touch /etc/docker/daemon.json
```

### 3. /etc/docker/daemon.json に対して DNSサーバを定義する

ここでは、DNS サーバが `133.180.0.182` であるものとする

```bash
$ sudo cat /etc/docker/daemon.json
{
 "dns": ["133.180.0.182"]
}
```

### 4. docker を稼働させる

```bash
$ sudo systemctl start docker
```

以上
PythonでTweetの取得と投稿

#概要
TwitterのAPIを利用してツイートの取得と投稿を行う
#今後やってみたいこと
・TwitterAPIを使った特定キーワード分析
・TwitterBot作成
#環境
Python 3.5.2
Jupyter Notebook
#前準備
Twitter APIを使用するには[デベロッパー](https://developer.twitter.com/en/apps/)申請が必要。
#1.pythonでツイートを取得する

```python
import json
from requests_oauthlib import OAuth1Session
import requests


#TwitterのAPI-keyを入力
KEYS = {
    'consumer_key':'----------',
    'consumer_secret':'----------',
    'access_token':'----------',
    'access_secret':'----------',
}

twitter_api = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],KEYS['access_token'],KEYS['access_secret'])

# n番目のツイートを取得する場合の関数を作成
def get_tweet(n):
  url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
  params = {'count': 100}
  result = twitter_api.get(url, params=params)
  result = json.loads(result.text)
  print(result[n]['text'])
#coutで取得ツイート数を設定
# 取得したいツイートの番号を入力
get_tweet(1)
#以下が表示されツイート取得が成功
test_api_001
```
#2.Pythonでツイートを生成
```python
#　POST　statuses/updataからコピー
url = 'https://api.twitter.com/1.1/statuses/update.json'
tweet = "test222 for API"
params = {'status': tweet}
#paramsではstatusを使う

twitter_api.post(url, params=params)
# Twitterで確認したら「test222 for API」がツイートされていたので成功

# ツイートを生成する関数を作成
def post_tweet():
  url = 'https://api.twitter.com/1.1/statuses/update.json'
  tweet = input()
  params = {'status':tweet}
  twitter_api.post(url,params=params)

post_tweet()
#値を入力するとTwitterに投稿される
```
#3.Tweetを確認
![IMG-0953.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/c52c8953-93ef-ee18-7bc5-609352fca7d2.png)
【Android】DataBinding導入【Kotlin】

#①build.gradle(:app)ファイルを開きandroid{}内にbuildFeatures ビルド オプションを true に設定する

![GitHubSampleApp_–_build_gradle___app_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/3fa1dd63-3012-7cc7-9131-b116a9445822.png)

```build.gradle(app)
android {
    ...
    buildFeatures {
        dataBinding true
    }
}
```
※android{}内に、buildFeatures { dataBinding true }の代わりに、
　　dataBinding { enabled = true }と入力しても問題なく動作するが、
　　これは以前の書き方らしく、ビルド時に警告が出る。

##②build.gradle(:app)ファイルplugin{}内にkaptプラグインを追加する。

![GitHubSampleApp_–_build_gradle___app_-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/ece64b75-c38b-76d3-3b17-0ef298771683.png)

```build.gradle(app)
plugins {
　　　　　　　　...
    id 'kotlin-kapt'
}
```

##③Sync Nowする

![GitHubSampleApp_–_build_gradle___app_-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/91b4c4d0-29e6-337c-c339-9070358d6f7a.png)

ここまででプロジェクト内で、DataBindingが使えるようになります。

##参考にさせていただいた記事

https://developer.android.com/topic/libraries/data-binding/start?hl=ja


https://suihan74.github.io/posts/2020/01_02_00_beginning_of_data_binding/
PHPのfunction __constract() について整理する

#コンストラクタとは
コンストラクタはクラスの中で定義するメソッドで、クラスがインスタンス化(NEW）したときに自動的に実行されるもの。
インスタンスを生成したときに初期化する際に、コンストラクタが用いられる。

```php
class Product
{
	function __construct() {
            $this->price = 100;
            $this->tax_rate = 0.1;
	}
	function totalPrice() {
	    return $this->price * (1 + $this->tax_rate);
	}
}
```

#コンストラクタの実行

```php
//インスタンス化した時点で、コンストラクタは実行されている
$product = new Product();

//コンストラクタ以外のメソッドは使いたい時に呼び出す
$product->totalPrice(); //110が表示される

```


#コンストラクタに引数を設定する場合

```php
class Product
{
    private  $name;
	private  $price;
	private  $tax_rate;
 
	function __construct($name, $price, $tax_rate) {
		$this->name = $name;
		$this->price = $price;
		$this->tax_rate = $tax_rate;
	}
        function totalPrice() {
		return $this->price * (1 + $this->tax_rate);
	}
}
```

インスタンスを生成

```php
//コンストラクタの引数に$price=200, $tax_rate=0.1を代入してインスタンス化した場合

$pencil = new Product('えんぴつ', 200, 0.1);
echo $pencil->name . 'は、' . $pencil->totalPrice() . '円です'; 
//えんぴつは220円です
```

#結論
`__constract`はクラスのインスランスを生成した時に必ず実行されるメソッド

参考文献
以下のサイトを参照して記事を書かせていただきました。
https://uxmilk.jp/14376
Webpackerを用いてjQueryとAjaxを反映させる方法[Rails][Webpack][jQuery]

これはEC2を用いたRailsアプリの本番環境で、jQueryとAjaxが動作しないエラーが発生した際の解決策です。原因に関しましては、少し特殊ですが、RailsアプリでWebpackerを用いてコンパイルしたいという方には少し参考になると思います。

このエラーは以下の記事の後日談のような形です。

https://qiita.com/Ub_Iwerks/items/04bb5f7e5fe50f82fc79

## 結論

以下のコードはあくまでコンパイルの設定ファイルです。そもそものjsやjqueryのコードが存在しないと意味をなしません。

```ruby:アプリ名/config/webpack/environment.js
const { environment } = require('@rails/webpacker')
# ここから
var webpack = require('webpack');

environment.plugins.prepend(
    'Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery',
        Popper: ['popper.js', 'default']
    })
)
# ここまでを追記
module.exports = environment
```

## 現状

上記の記事からの続きで、Webpackerを導入できていることを前提とします。
その前提で、これまで開発環境ではjQueryとAjaxが正常に動作しており、本番環境ではwebpackerが導入されているにも関わらず、反応しません。またログにはエラーも見当たりませんでした。

## 解決まで

前回のエラーから学び、「環境が依存が原因だろ(๑˃̵ᴗ˂̵)」と考えていました。
しかしながら、`config/environments`配下の設定を見比べ、それぞれの設定を個別に比較したにも関わらず、原因を特定できませんでした（ここで結構時間を食う）。

そこで一度本番環境のコードを開発環境にgit pullし、そもそも環境依存が原因であるかどうか確定させよう、と思いました（まず最初にやるべきでした）。
その結果、開発環境でもjQueryやAjaxが動作しなくなりました( ・∇・)。

ということで、これまでの開発環境のコードと現状でpullしたコードのgit diff で確認してみると、以下の結果が分かりました。

```ruby:アプリ名/config/webpack/environment.js
const { environment } = require('@rails/webpacker')
- var webpack = require('webpack');

- environment.plugins.prepend(
-     'Provide',
-     new webpack.ProvidePlugin({
-         $: 'jquery/src/jquery',
-         jQuery: 'jquery/src/jquery',
-         Popper: ['popper.js', 'default']
-     })
- )

module.exports = environment
```

おおっ！設定できてない、というか設定消してるやん！

ということで、今回のエラーは、webpackを再設定などする過程で、過去に自分が設定したコードを削除していたということでした。
ちなみに、上記のコードを追加すれば、Webpackerを用いてjQueryとAjaxを反映させることが出来ると思います（多分）。

## まとめ

今回のエラーでは、webpackの設定変更という話ではなく、エラー対応への向き合い方をまた一つ学びました。
ライブラリなどを追加・再設定する場合には、これまでのコードが上書きされる場合がある為、まずはライブラリ導入後の差分を確認すること。

エラー解決日記でした。最後までお読み頂きありがとうございました。
"Chia" から生まれた"Silicoin" !!??

https://www.globenewswire.com/news-release/2021/07/02/2257302/0/en/Chia-Community-Announced-The-Launch-Of-Silicoin-The-Fair-Chia-Competitor.html

July 02, 2021 14:28 ET

Green Cryptocurrency としてsf9 が注目してきたChia Coin のChia Foundsationが　”Silicoin”を立ち上げるう〜〜？？！！
https://www.silicoin.cc/

コンセプトは” Proof of Work”と” Proof of Stake”を合わせた" Proof of Balance"!!

一度作成したplot を継続的にん使うことで電力の消費を少なくするコンセプトは引き継がれる。

　sf９はtestnet の　Nodeに参加中です

引き続きの情報をお待ちください。

To be continue