OmniAICreator/Qiita-1.07M huggingface dataset:
Blender 4.2で可能な限り三角面を四角面に変換する（数理最適化）

## メッシュの四角面化

Blenderには、三角面を四角面にする機能があります。これは、辺の長さを考慮して溶解する辺を選んでいます。
これはこれで便利なのですが、**可能な限り三角面を四角面に変えたい**ことがあります。
ここでは、それを**数理最適化**で実現するアドオンを紹介します。

## 具体例

下記のメッシュで試してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/26141131-8915-b923-87f3-78e115397f85.png" width="300">

通常の「三角面を四角面に」を実行すると下記のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/21a01f16-46d2-1765-239a-17c19d654514.png" width="300">

隅の方に三角面ができています。

一方で、今回紹介するアドオンを実行すると下記のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/928d6e87-6d11-b922-2452-980fb8eeb984.png" width="300">

すべての三角面が四角面になっています。

## インストール方法

:::note warn
**注意**
最新のアドオンでは、**PuLPを同包している**ため、下記の「`PuLPのインストール`」の作業は不要です。
:::

### PuLPのインストール

本アドオンは、Pythonの[PuLP](https://github.com/coin-or/pulp)モジュールを利用しています。
そのため、下記のように、コマンドラインでBlenderにPuLPをインストールする必要があります。コマンドラインからBlenderを操作する方法については、「[Blenderのコマンドサンプル](https://qiita.com/SaitoTsutomu/items/6b70367455f843a979b1)」も参考にしてください。

※ バージョンは適宜変えてください。

- macOSの場合
```
/Applications/Blender.app/Contents/Resources/4.2/python/bin/python3.11 -m pip install pulp
```

- Windowsの場合
```
"C:\Program Files\Blender Foundation\Blender 4.2\4.2\python\bin\python" -m pip install pulp
または
"C:\Program Files\Blender Foundation\Blender 4.2\4.2\python\Scripts\pip" install pulp
```

※ Windowsで、インストールできるのに`import`で**エラーになる場合**は、一旦アンインストールしてから、**管理者権限のコマンドプロンプトでインストール**し直すとうまくいくかもしれません。

※ 実は、[Python-MIP](https://www.python-mip.com/)ライブラリーを使いたかったのですが、Blenderでは動かないためPuLPを用いています。

### アドオンのインストール

- GitHubの[Tris-Quads-Ex](https://github.com/SaitoTsutomu/Tris-Quads-Ex)から、下記のアドオンのZIPファイルをダウンロードしてください。ZIPファイルは解凍しないでください。

  - [アドオンのZIPファイル](https://github.com/SaitoTsutomu/Tris-Quads-Ex/archive/refs/heads/master.zip)

- Blenderのプリファレンスのアドオンで「ディスクからインストール…」ボタンを押し、ダウンロードしたZIPファイルを選択します

- 下図のように、`Tris to Quads Ex`にチェックを入れてください

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/65391d5d-1b63-d479-00a1-a1db48c901c1.png" width="600">


## 使い方

- 対象のオブジェクトを選んで、編集モードに入ります
- **対象の範囲を選択して、面メニューの「Tris to Quads Ex」を選びます**

※ **選択している辺の中でしか溶解しません**。すべてを対象にする場合は、`A`で全選択してください。

- 実行後、四角面以外を選択します

## 最適化について

「可能な限り三角面を四角面にする」ためには、溶解する辺の数をなるべくたくさん選ぶ必要があります。
一方で、選びすぎるとNゴン（頂点が5以上の多角形）になってしまうので、できる多角形の頂点を4までに抑える必要があります。
このような問題は混合整数最適化問題になります。
混合整数最適化問題とは何かについては、「[組合せ最適化を使おう](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)」を参考にしてください。
ここでは、混合整数最適化問題を定式化し、PuLPでモデル化し、CBCソルバーで解きます。

### 定式化

変数は以下の条件を満たす辺ごとに0-1変数を作成します。1が溶解する、0が溶解しないに対応します。

- 選択されている
- 両側の面がともに選択された三角面である

ここでは、下記の定式化を解いて、溶解する辺を求めています。

| 目的関数 | 溶解する辺の数 + 0.1×正規化した辺の長さの和 → 最大化 |
| :------: | :--------------------------------------------------: |
| 制約条件 |          三角面ごとに、溶解する辺は1本以下           |

三角面に対し2本以上を溶解するとNゴンになるため、上記の制約条件になります。

## アドオンのコード（Python）

https://github.com/SaitoTsutomu/Tris-Quads-Ex/blob/master/__init__.py

実際に辺を溶解するのは、`execute()`メソッドになります。

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

以上
GORMを使ったDockerのPostgreSQLへの接続方法

最近 GORM を使った開発をしていて Docker の PostgreSQL への接続に躓いたので、接続方法をまとめました。

GORM のバージョンは v2以降です。

# Dockerfile

docker-compose.yml
```yml
version: '3'

services:
  server:
    ...
    ...

  db:
    ...
    ports:
      - "5332:5432"
    ...
    ...
```

データベースのサービス名は db にしてます。

# 接続

docker のデータベースに gorm で接続する際は、host と port に気を付ける必要があります。
host は Docker のサービス名にする必要があります。

```go
dsn := "host=db user=gorm password=gorm dbname=gorm port=5432 sslmode=disable TimeZone=Asia/Tokyo"

	db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("DB error(Init): ", err)
	}
```

これで接続出来ます。

# まとめ

gorm を使い Docker のデータベースに接続する際は、host に気を付けてください。
私は、これに気付くのに結構な時間を使ってしまいました。

ご指摘があればよろしくお願いします。
minicondaを完全削除する方法

## Mac ver.
### ①miniconda3というファイルを削除する
ディレクトリのpathは下記の2パターン考えられる
```
・~/miniconda3
・~/opt/miniconda3
```

フォルダ削除の実行コマンドも載せておくが、CLIに不慣れな人はFinderから削除すると良い
```
rm -rf ~/miniconda3
```

### ②.zshrc もしくは .bashrc  に記述されている下記のcondaの記述を削除
```
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/xxxxx/opt/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/xxxxx/opt/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/Users/xxxxx/opt/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/Users/xxxxx/opt/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
```

### ③~/.condaというディレクトリを削除

## Windows ver.
### ①miniconda3というファイルを削除する
```
C:¥Users¥ユーザー名¥miniconda3
```

windows用のフォルダ削除の実行コマンド
```
rd /s /q %HOMEPATH%¥miniconda3
```



### ②環境変数から下記のcondaのpathを削除
環境変数の削除の仕方は以下の通り
```
ⅰ デスクトップ左下の検索窓で「環境変数を編集」と検索し環境変数の設定画面を開く
ⅱ 「ユーザーの環境変数(U)」の中にある「Path」をダブルクリックする
ⅲ 下記の5つのPathを全て削除する
・C:¥Users¥ユーザー名¥miniconda3
・C:¥Users¥ユーザー名¥miniconda3¥Library¥mingw¥-w64¥bin
・C:¥Users¥ユーザー名¥miniconda3¥Library¥usr¥bin
・C:¥Users¥ユーザー名¥miniconda3¥Library¥bin
・C:¥Users¥ユーザー名¥miniconda3¥Scripts
```

### ③~/.condaというディレクトリを削除
C:¥Users¥ユーザー名¥.conda

## 補足
Mac ver.でもWindows ver.でもminicondaを再インストールしたい場合は①のみの実施でも良い。
だが、たまに①だけでは既にインストール済みとなりインストールできないことがあったため、③まで実施してインストールする方が確実ではある。
細かいところまで調べきれていないが、もし詳しいことを知っている人がいたらコメントで教えて欲しい。
MacVimインストール


この頃 MacVimを使っていると描画乱れが発生するようになったため。
MacVimのノーマル版をインストールしてみた。
## インストール
https://macvim-dev.github.io/macvim/
公式サイトからダウンロードしてそのままインストール

## 初期設定
https://chocoby.com/blog/2021/05/04/macvim

https://qiita.com/shinichinomura/items/d786f1d84d1713b168e8

以前使ってたkaoriya版
https://github.com/splhack/macvim-kaoriya

Beep音をとりあえず消す。
https://qiita.com/jz4o/items/57806f6ee74c0b91e9c1

set belloff=all


とりあえず初期設定
```
set columns=80
set lines=50
set expandtab
est tabstop=2
set nobackup
set noswapfile
set number
set guifont=Andale\ Mono:h14
```

### 色テーマを変える
https://chaika.hatenablog.com/entry/2021/04/04/164400

https://github.com/altercation/vim-colors-solarized
NLBとALBを使って固定IPアドレスでのパスベースルーティングを実現する

# はじめに
AWSのALB（Application Load Balancer）のパスベースのルーティングを利用することで、1つのALBでパスごとに複数のアプリケーションを公開することが可能です。強力な機能ですが、ALBはIPアドレスが動的に変化してしまうため、オンプレミスとのハイブリット環境等でDNSの名前解決に制約がある場合や、セキュリティポリシー等でIPアドレスにてアウトバウンドの通信制限をしなければいけない要件などがあった場合にハードルがあり、利用を断念することがこれまでありました。
またIPアドレス固定については、ALBの前段に[Global Accelerator](https://aws.amazon.com/global-accelerator/)を置く手段はありましたが、特に閉域環境では利用が難しい状況でした。

そんな中、2021年9月に[NLBのターゲットとしてALBを設定可能になるアップデート](https://aws.amazon.com/blogs/networking-and-content-delivery/application-load-balancer-type-target-group-for-network-load-balancer/)がありました。これを利用することで閉域環境でもNLBでIPアドレスを固定しつつ、ALBでパスベースのルーティングを実現することができるようになったため、動作検証を行いました。

# 検証したアーキテクチャ
検証したアーキテクチャは以下の通りです。
![Screen Shot 2022-03-20 at 11.45.32 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165095/bd5b0d9b-e025-4c7e-642b-a95e738587f6.png)

VPC（10.0.0.0/16）内に二つのSubnet（10.0.10.0/24、10.0.11.0/24）を配置し、NLBとALBをInternal Load BalancerとしてVPC内に配置しています。またNLBのターゲットとしてALBを設定し、さらにALBのターゲットとして、3つのターゲットを設定しています。1つ目は`/`パスでアクセスできるデフォルトのアプリケーション（nginxのデフォルトページを出力）、2つ目は`/app1`でアクセスできるApp1（アクセスすると`app1`と出力するアプリ）、3つ目は`/app2`でアクセスできるApp2（アクセスすると`app2`と出力するアプリ）です。
またそれぞれのアプリケーションはECSのタスクとして定義して配置しています。

# 検証環境のデプロイ
検証に利用したAWS環境およびコンテナアプリケーションは下記に公開していますので、適宜ご参照ください。
https://github.com/moreyhat/nlb-alb-ecs

# 設定の確認
ポイントとなる設定を確認していきます。
## NLBのIPアドレス
NLBではSubnetごとにプライベートIPアドレスを固定しています。
![Screen Shot 2022-03-21 at 12.13.08 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165095/fd5d885e-f381-28d4-7376-b0d974bebc1b.png)
## NLBのターゲットグループ
NLBのターゲットグループには「Application Load Balancer」がターゲットとして登録されています。
![Screen Shot 2022-03-21 at 12.16.09 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165095/a06527fd-4592-8fc5-69a9-175d1bd4ec68.png)
## ALBのリスナールール
ALBのリスナールールは`/app1*`と`/app2*`でそれぞれ対応するターゲットグループにルーティングするように設定されています。また`/`はデフォルトのルーティング先にフォワードされます。（今回はヘルスチェックのパスとして利用）
![Screen Shot 2022-03-21 at 12.19.46 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165095/3e142bb6-a44e-f7bc-fcd3-c5db2ee98aa9.png)
## ALBのターゲットグループ
ALBのルーティング先となる3つのターゲットグループはそれぞれECSで起動されたタスクがターゲットとして登録されています。
![Screen Shot 2022-03-21 at 12.24.14 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165095/3852e5a5-76ac-ee69-1f21-3df0352a678d.png)
![Screen Shot 2022-03-21 at 12.24.23 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165095/e5b948bc-9e46-b973-355f-86b1ee421cb1.png)
# 動作検証
動作検証ではVPC内にEC2インスタンスを立てて、そこからNLBのIPアドレスに対してそれぞれのパスでアプリケーションにアクセスできるかを検証しました。その結果、下記のような出力が得られたため、期待通りに動作しているのを確認しました。（`/`はnginxのデフォルトページが表示されるため、省略しています。）

```shell
$ curl -L 10.0.10.30/app1
app1
$ curl -L 10.0.10.30/app2
app2
$ curl -L 10.0.11.30/app1
app1
$ curl -L 10.0.11.30/app2
app2
```

# まとめ
NLBのターゲットとしてALBが設定可能になったことで、今回検証したようにALBの機能をIPアドレスを固定しながら実現できたり、その他にもPrivateLink経由でのアクセスなども可能になり、より広い用途でALBの機能を利用できるようになったと思います。
AWS公式資料で挑むSCS認定(19)-こんな時どうする(分野1:インシデント対応)

##### [前回] [AWS公式資料で挑むSCS認定(18)-模擬テスト](https://qiita.com/mingchun_zhao/items/54406ec28b3fda554977)

## はじめに

「最強の敵は自分自身だ」
こうなりたいと願っても、意志や覚悟が足りず、ついさぼり出したい自分が。。。

各種AWSサービスの視点から勉強してきましたが、試験対策としては不十分でした。
模擬テストからは、以下のように
「あなたはセキュリティ担当者です、不審なアクセスが報告されました、どうしますか」
シチュエーションに対し、最適なソリューションを選ぶといった形がほとんど。

## そうだ、「こんな時どうする」集をまとめてみよう

有効な試験対策になるかも。
なんか楽しくなりそう。

ネタはぶれず、AWS公式資料の「ユーザガイド」と「よくある質問」などからピックアップします。
下記出題対象の分野別、「こんな時どうする」を作ってみます。

- 分野1: インシデント対応
- 分野2: ログとモニタリング(監視)
- 分野3: インフラストラクチャのセキュリティ
- 分野4: アイデンティティ(ID)及びアクセス管理
- 分野5: データ保護

## 「分野1: インシデント対応」基本知識のおさらい

### インシデントとは

- 認証情報漏洩(キーの紛失)
- データ整合性侵害(機密情報改竄)
- アクセス制限欠損(機密情報窃取)

### インシデントの検知方法

- ログとモニタリング
    - これが基本か
- AWS請求の記録
    - 設定金額を超えアラートが送られたら
- 脅威インテリジェンス
    - 攻撃手段のナレッジを取得し、脅威分析を自動化、ML化
- AWSサポートからの通知
    - あなたのアカウントに不審なログイン試行がありました
- パブリックレスポンス
    - ユーザからの報告

### インシデント対応に使用されるサービスとツール

- AWS Trusted Advisor
- AWS Cloud Formation
- AWS Service Catalog
- VPC フローログ
- AWS Config
- Amazon API Gateway
- AWS CloudTrail
- Amazon CloudWatch

## 「分野1: インシデント対応」の「こんな時どうする」

- IAMアクセスキーが誤って公開された
    - 公開されたIAMアクセスキーを無効にする
    - IAMアクセスキーがどのユーザに関連付けされたか確認
    - IAM拒否ポリシーをユーザにアタッチ
    - 残っているセッションをすべて取り消す
    - アクセスキーに関連付けされたポリシーの範囲を確認
    - AWS CloudTrail, AWS Configでリソースや設定が変更されていないか確認
    - 他のIAMアクセスキーや認証情報に問題ないか確認

- EC2インスタンスアクセス用のSSHキーが盗まれた
    - SSHキーが使用されていないか確認
    - SSHキーを使用しているEC2インスタンスへのポート22をブロック
    - SSHキーを使用しているEC2インスタンスのauthorized_keysファイルを変更

- EC2インスタンスから不審なトラフィックが検知されたので分離しインシデント調査したい
    - EC2インスタンスをAuto Scalingグループから分離
    - フォレンジック用にセキュリティグループ(SG)を作成
    - EBS スナップショットを用いてSGへボリュームコピー
    - フォレンジックSGにて問題EC2インスタンスを調査

- 複数パブリックサブネットに含まれる特定EC2インスタンスを簡単に自動分離させたい
    - セキュリティグループを変更するLambda関数を作成、インバウンドトラフィックをブロック

- EC2インスタンスから既知のC&Cサーバーへ不審なリクエストがないか確認したい
    - GuardDutyの結果タイプ(Finding)から確認
      - C&CサーバーのIPをクエリしている場合「Backdoor:EC2/C&CActivity.B」が通知
      - C&Cサーバーのドメイン名をクエリしている場合「Backdoor:EC2/C&CActivity.B!DNS」が通知
    - ※ C&Cサーバーとは、ボットネットのメンバーに悪意あるコマンドを発行させるコンピュータ

- CloudFrontディストリビューションへ不審なリクエスト発生、その送信元IPアドレス、元のリクエスト、リファラー、プロトコルを特定したい
  - CloudFrontのアクセスログに記録されたユーザーリクエスト情報から特定
    - 前提条件: ログ保存するS3バケットのACLに対し変更が必要
        - awslogsdelivery アカウントを追加し、FULL_CONTROL のアクセス許可を付与
        - awslogsdelivery アカウントにより、アクセスログがバケットに書き込まれる
  - ※ S3バケットのアクセスログからは、送信元IPアドレスを確認できない(リファラーは確認できる)
  - ※ CloudTrailからは、元のリクエストを確認できない(APIコールは確認できる)

## おわりに

試験対策として「こんな時どうする」をまとめ始めました。
本質をしっかり理解しながら、追記して行こうと思います。
お楽しみに。

##### [次回] [AWS公式資料で挑むSCS認定(20)-こんな時どうする(分野2:ログと監視)](https://qiita.com/mingchun_zhao/items/1bd86bf67119be51fd19)
モバイルフレンドリーなWEBページを構築するための参考資料

モバイル向けレスポンシブデザインが苦手なので参考資料まとめました。Google社の、もしくはGoogle社が引用に使っているものです。多分随時追加していきます。

優れたモバイルサイトの条件とは
https://developers.google.com/web/fundamentals/design-and-ux/principles

ユーザフレンドリーなフォームについて
https://developers.google.com/web/fundamentals/design-and-ux/input/forms#choose-the-best-input-type

モバイルフレンドリーテスト
https://search.google.com/test/mobile-friendly

ページスピードテスト
https://pagespeed.web.dev/?utm_source=psi&utm_medium=redirect
今日のトリビア Excelで丸付き数字は全角数字扱いなので、うっかりすると半角数字まで置換される

# そうだったんだ・・・
## 環境
Excel　2022年で最新
OS　2022年で古いWin10
## 下準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/909c3bdb-658c-8f49-a8f4-b75fced10fde.png)
131-1111というのは郵便番号のつもり。
それか電話番号
A列は半角数字。
B列はテキスト
表示形式はいずれも標準
いずれも自動で数字やテキスト扱いされるものです。
文字コードも確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/d2352504-d094-bbfc-1030-639cd3e1d311.png)


A3に入っているのは49
B3に入っているのは9312

## ここで置換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/7d7669c4-7f80-5b8d-f66f-5145c0f06f1e.png)

9312を「正（文字コード27491）」に置換します。

Enter


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/c5af1589-e7fd-f52f-e780-cd7782fee8db.png)

ファっ！？

いや、これは種明かしをすると、セル内容が完全に同一であるものを検索するにチェックを入れてないからや。

## やりなおし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/d80f4129-f71b-1186-f0b9-86e69662a72d.png)

今度はチェックを入れてみた。

Enter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/b0bb8ec0-25b0-fa8a-6b2d-03b9c0730a8c.png)

ファッ!?
なぜかA列の1まで変換されてしまった。

## 正解はさらに「半角と全角を区別する」にチェックを入れるらしい

いやちょっと待って文字コード9312、半角も全角も関係ないですやん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/ee68c7e4-657f-26f5-a1d5-bca04028f27c.png)

Enter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/fd1b87f7-656c-48ec-ae80-8b8b33ad7f5a.png)

ちょっと信じがたい結論ですが。
確かにIMEで変換候補にあがるが、丸つき数字が全角数字扱いだったとは。。
さらに数字扱いのセルも置換されるときはうっかりするとテキスト扱いで一部が置換されてしまうという。
丸つき数字が実は全角の1扱いだったとは驚きです。
新卒クラウドエンジニアの1年間を振り返ってみる②

# 昨日の記事の続きです
https://qiita.com/cakofei/items/30aa5d7ea177ea601f4a

# 8、9月(引き続きリリース準備やPoC検証など)
さて昨日の記事にも書きましたが、7月の病み期から無事立ち直りまして、8、9月からは普通に業務に復帰しました。

10月にある2次リリースへ向け、CloudWatchでのログ収集やサブスクリプションフィルターを用いたアラート設定などを行っていました。

それが完了すると開発環境での作業がほとんど完了したので、基本設計書や詳細設計書の更新を行いつつ、サービスの全体理解に努めていました(1次リリースの時は案件にいなかったので、サービスの全容はまだ把握し切れていませんでした)。

他にも別案件にてPoC検証用の構築作業も並行しており、LambdaでCSVファイルを加工する構成を検証していました。
この作業にてLambdaやAPI Gatewayを使用することができ、サーバーレスな構成も体験することができました。

プライベートでは自社ブログの執筆を行い、EC2インスタンスにSSM接続する方法という記事を書きました。

https://www.isoroot.jp/blog/4027/

この頃になると社会人にもようやく慣れてきて、土日に色々活動できるようになったので都内を自転車で巡ったり、友達や彼女と遊びに出かけていました。

# 10月(リリース作業や資格勉強)
10月にはサービスのリリース作業に向けて色々頑張っていた時期です。
開発環境やステージング環境でのリリースリハーサルもパスし、リリース作業も無事に終えることができました。

リリースまでの流れを一通り体験することができたので、エンジニアとして少し自信がつきました。

大きなリリースが終了したとは言っても、細かいリリースはその後も続き、SSMエージェントのログ収集やKinesis Data Firehoseを用いたS3へのログ2次保存の対応も行なっていました。

https://www.isoroot.jp/blog/4426/

その際、SSMエージェントのログの一部がなぜかCloudWatchに収集されない事象が発生し、初めてAWSサポートに問い合わせました。
AWSに状況を一から伝え問題点を共有するのはなかなか難しかったですが、おかげで報連相スキルが向上したと思います。

プライベートでは、AWSで一番メジャーな資格のSAA(ソリューションアーキテクトアソシエイト)を受験し合格しました。
AWSでメジャーなサービスを一通り学ぶことができ、また欠けていた知識も補強できたので、その後大いに業務で役に立ちました。

かなり大変でしたが、特に初学者の方にはかなりおすすめの試験だと思います。

# 11、12月(別案件に参画し、第二回病み期へ)
10月にリリース作業が一旦完了したことで、11月からAWSアカウント内にある環境を別アカウントに移行するプロジェクトに参画しました。

開発案件ではなかったので当初は残念でしたが、アカウントの運用ルールの策定や環境の再設計を自分中心に任せてもらえたことで、仕事の進め方やスケジュール管理、報連相や他社の方とのやりとりなど社会人としてのスキルがかなり向上したことに加え、AWSのネットワーク知識や各サービスについてかなり詳しくなれました(移行するにあたって各環境に影響が出ないようにするため、各サービスを念入りに調査しました)。

11,12月は移行先アカウントの運用ルールの策定や、移行対象のリソースの洗い出し、IAM権限周りの策定などの作業を中心に行なっていました。

その中でも運用ルールの策定はどこまでルールを明文化したらいいのかが分からず、資料作成にも時間がかかり本当にしんどかったです。

変数が多い業務といいますか、「自分が挙げたルールで本当に合っているか分からない」、「上手くいかずチームメンバーに失望されたらどうしよう」、「たかが資料作成になんでこんな時間がかかってしまうんだ。。。」などと悩み続けた結果、12月初旬に体調を崩しました。

この時Linucの資格勉強で忙しかったり、プライベートでの人間関係もあまり上手くいっておらずメンタルもかなり不安定な時期でした。

すぐに上司の方に相談し、同僚の方にお薦めされた「コピー１枚とれなかったぼくの評価を１年で激変させた ７つの仕事術」という本を読んだところ、自分の中のモヤモヤもだいぶ晴れて、数日後には再び業務に戻ることができました。

その後は週次定例にて自分主軸でアジェンダを作成し、アカウント移行までのスケジュールや案件の状況の連携、検討事項などを提案・進行を任せてもらえ、プロジェクトリーダー的な経験もさせていただきました。

またアカウント内の不要なコストを調査する仕事も任せてもらえ、そのタイミングで各サービスの料金や見積もり方法、調査方法やアラート設定などAWSのコストに関する知見を一気に伸ばし、プライベートのアカウントでも各サービスの料金感覚を掴めたことで、色んなサービスを恐れずに触れるようになり、さらにAWSについて詳しくなれました。

https://www.isoroot.jp/blog/4530/

他にも前案件の仕事もリリース後もちょくちょく依頼があったのでそれの対応も行っていたのですが、「AWS BackupとLambdaを用いてAMIを日時で起動テンプレートに装着する」というなかなかマニアックの構成も体験できました。

# さらに続く、、、
また続きは明日書きます。

https://qiita.com/cakofei/items/8dfcee10129c0f9208fa
Scalaの勉強はじめました 2 〜文字列検索と深さ優先探索〜

## はじめに
N予備校の「Scala基礎」を受講しています。

## 検索
### 索引型検索
文章の中からあらかじめ単語の文字列を抜き出して、単語ごとに索引を作っておく検索方法

あらかじめインデックスを作るイメージ

### 非索引型検索
与えられた文字の情報のみを用いて検索を行う

文章を全て走査するので時間がかかる

```scala
val text = "ネコネコネコネコイヌイヌイヌイヌネコネコワンコイヌイヌネコネコワンコ".toSeq
  val pattern = "ワンコ".toSeq
  val matchIndexes = search(text, pattern)

  def search(text: Seq[Char], pattern: Seq[Char]): Seq[Int] = {
    // 型を明示する
    var matchIndexes = Seq[Int]()
    // 文字列を検索
    for (i <- 0 to text.length - 1){
      // i文字目から3文字取り出す
      val partText = text.slice(i, i + pattern.length)
      if (isMatch(partText, pattern)) {
        matchIndexes = matchIndexes :+ i
      }
      println(partText)
    }
    matchIndexes
  }
```

`isMatch`は検索に引っ掛かれば`true`を返すようにする。

### 正規表現を使う
```scala
val matchIndexes = pattern.r.findAllIn(text).matchData.map(_.start).toList
```

`String`の`r`メソッド
文字列を正規表現のRegex型に変換する

`findAllIn`
`Regex`型のメソッドで、与えられた正規表現にマッチする`Iterator`を取得し、`MatchIterator`型を返す

`matchData`
`MatchIterator`の`matchData`フィールド
マッチした文字列に対するさまざまな情報を含む、`Iterator[Match]`型を返す

`Iterator`
イテレータという何らかの要素の集合を巡回しながらアクセスできる型。 巡回可能なコレクションのような振る舞いを提供する。

`_.start`
`Match`型を start: Int というマッチした時の出現箇所のインデックスに変換。`_`を使うことで、`map`関数を適用しようとしているコレクションの要素のメソッドも呼び出すことができる

## 深さ優先探索
:::note
1 回の呼び出しの中で、数列の 1 番目の要素を「足す場合」と「足さない場合」の 2 つの 再帰呼び出しをすることで、 最終的に全てのパターンを網羅する実装方法
:::

部分和問題
```scala
val a = Seq(3, 6, -5, 7)
  val n = a.length
  val k = 9
  
  def isMatchAndResult(index: Int, partial: Seq[Int]): (Boolean, Seq[Int]) = {        
    println(s"index: ${index}, partial: ${partial}")
    if (index == n){
      return if (partial.sum == k)(true, partial) else (false, Seq())      
    }
    
    val (isMatchNotAdd, resultNotAdd) = isMatchAndResult(index + 1, partial)
    if(isMatchNotAdd) return (isMatchNotAdd, resultNotAdd)    
    
    isMatchAndResult(index + 1, partial :+ a(index))    
  }
  val (isMatch, result) = isMatchAndResult(0, Seq())
```

正直これ見てもちょっとわからなかったです。
絵を見てようやく理解できた感じ。

## まとめ
再帰呼び出しはそもそも何を実現しようとしているのかを把握しないと、自力で変数の中を追うにも限界があるなと。
【AWS】LambdaでIAMロールを付与していないとこんなエラーが出る件

## 経緯
EventBridgeをキックしてLambdaでEC2を停止するスケジューリングを立てようとしたところ、Lambda実行で権限のないエラーが発生したので、調査した結果を記事にしてみようと思った。

## 構成
![stop_ec2_at_lambda.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/cc627c27-6fc6-b0c0-8084-13c3e6ea35cf.jpeg)

## Lambdaのコード
言語は「Python３.9」です。

```
import boto3

region = 'ap-northeast-1'

instances = ['i-0cfa865823946e45e']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
```

## Lambda実行後のエラーメッセージ

StopInstancesを実行するための権限がありません。といったところでしょうか。
Lambdaの権限ロールを確認してみます。

```
[ERROR] ClientError: An error occurred (UnauthorizedOperation) when calling the StopInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: zSo5Msmd-JQRo8ygxWtAmj9ZRU78GGqhzYCssr7BAb4WksmLG1uYqGnZFwkDluF00PB58j1hl9aThYkwLJn_6sFw3YhHS57HwAIyPXm_6vuMI7KHwiwPEB8pPpvLjwP0sW8lDItpzRGQf7_KZTHEurtVAOj5GXRHkk8eKexR6JgLSDxTrYTfqdBc9LJd11pJF31IgrLYYbyglhmoolKOZ1xgHQQMdkg7pJXP1pKLPIBNyyCGQxXovyQkPWhgOf8Ex4cxPNzKuDjKU0qbHkqY8iUWNozgWP_nzFyWQqV0DSMe8sg_931OZYHmX0uaV-r4sX93KtbqXkb3P_C8J_jg9Qt-01DwNgaACzG_QDubyjUJikLAlreRBGmtdTFGm0a9AhrrecGM5OnJYLBnc-7IPzagKe-fZFRZOz6V3AekXxQhMK_mlUO-9tPbAngWSE1X5fk1Y_Jc8YF6HOnquJ2nIytNMmI54k9RvpG9cRl14oc4EckmTWPkGM5VjyVD1qDZjIhu7DJ_mOjg5CqG28Sue9VH9RL31eCqv8U7hPhIvah1c0zP8W_vdJYQMcze1RyENQQmqXJtp5kX9Etl1urBHnNtXILgZmLFmANUphlUuo4ZBuG21FVL1cT_rex7LoAoQOk_60nBfgXP4GZJ5NctBvVg95lsbxluvXgHlXdgW_JrwXTPv8MMHThx45Y2wtltYjPEBxGqT6kH
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 9, in lambda_handler
    ec2.stop_instances(InstanceIds=instances)
  File "/var/runtime/botocore/client.py", line 386, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 705, in _make_api_call
    raise error_class(parsed_response, operation_name)
```

## Lambdaの実行ロール権限確認

どうやら、Lambda関数作成時のデフォルトロールが適用されていたようです。
正しいのは、事前に作った「Lambda_execution_role」というものです。

このロールには、"Logsの権限"・"EC2の停止権限"が入っています。
デフォルトで作成されるとロールにはEC2の実行権限がついていないのでエラーが権限不足のエラーが発生したと思います。

![スクリーンショット 2022-03-21 15.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/315f463a-5d8d-683f-87ef-28df47951573.png)
Google Chromeをコマンドプロンプトでインストール


# 概要

・Webブラウザ未導入のWindowsPCにGoogleChromeブラウザをコマンドラインでインストールする方法
・Windows 10 Pro＠インターネット接続環境で作業実績あり（2022年3月21日時点）

# 手順

### 1. コマンドプロンプトを管理者権限で起動
「コマンドプロンプト」を右クリックしてコンテキストメニューの「管理者として実行」をクリック
→以下の図例では検索フィールドに「cmd」を入力して「コマンドプロンプト」をリストアップしました。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225489/61ca010d-2a8a-f8f6-490a-ce42893b4d92.png">

以下のようなコマンドプロンプト画面が開きます。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225489/5fe157f3-dab5-14b0-72d5-ead796f78f72.png">

### 2. 作業フォルダに移動
コマンドプロンプト上で以下を入力
→「ダウンロード」フォルダにGoogle Chromeインストーラをダウンロードするために作業フォルダを移動します。

```winbatch
 cd C:\Users\%username%\Downloads
```

以下のような結果となります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225489/9946023d-a899-8bb9-8d0b-b0c5155ee354.png">

### 3. Google Chrome インストーラをダウンロード
コマンドプロンプト上で以下を入力
→ Windows OSのアーキテクチャ（32bit版/64bit版）と一致するmsiファイルのURLを指定してダウンロード
　どちらかわからない場合は、下記の「Windows OSのアーキテクチャを確認する方法」を参照してください。
→ msiファイルは100MB程度です。インターネット回線速度にもよりますが数分でダウンロードできると思います。

・64bit版の場合
```winbatch
bitsadmin /TRANSFER "download" https://dl.google.com/chrome/install/GoogleChromeStandaloneEnterprise64.msi %CD%\GoogleChromeStandaloneEnterprise.msi
```

・32bit版の場合
```winbatch
bitsadmin /TRANSFER "download" https://dl.google.com/chrome/install/GoogleChromeStandaloneEnterprise.msi %CD%\GoogleChromeStandaloneEnterprise.msi
```

以下のような結果となります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225489/4f16808d-87cb-3bd5-79b0-925b126dc6bd.png">

:::note info
Windows OSのアーキテクチャを確認する方法
:::

コマンドプロンプトで以下を入力
```winbatch
echo %PROCESSOR_ARCHITECTURE%
```

| コマンド実行結果 | アーキテクチャ |
|:-----------|------------:|
| AMD64      | 64bit       | 
| x86        | 32bit       | 

### 4. Google Chrome をインストール
コマンドプロンプトで以下を入力
→「3. Google Chrome インストーラをダウンロード」でダウンロードしたmsiファイルをダブルクリックでもOK :)
→ダウンロードフォルダ配下のmsiファイルを指定してインストール
※もしもインストールが失敗する場合は、先に「5. （参考）Google Chrome をアンインストール」を実施したほうが良いかもしれません。
```winbatch
msiexec /i %CD%\GoogleChromeStandaloneEnterprise.msi
```
### 5. （参考）Google Chrome をアンインストール
コマンドプロンプトで以下を入力
→ダウンロードフォルダ配下のmsiファイルを指定してアンインストール
→「この製品をアンインストールしますか？」の画面で「はい」をクリックします。

```winbatch
msiexec /x %CD%\GoogleChromeStandaloneEnterprise.msi
```
### 6. （参考）Google Chrome を起動

デスクトップのGoogle Chromeアイコンをダブルクリック

## 参考文献
msiexec
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/msiexec
bitsadmin
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/bitsadmin
Entity Framework CoreのMigrationをクラスライブラリに対して実施したい

## はじめに
あるシステムを開発するのに、複数のプロジェクトに分けて開発するケースがあります。例えば、WebAPIはスマートフォンなどのアプリから呼び出され、Webアプリケーションはシステム運用で利用するみたいな例が考えられます。
あるいは、Webアプリケーションのプロジェクトと、Azure Functionsのプロジェクトの2つから構成されるものとか。

この時、Entity Framework CoreのEntityクラスとDBContextクラスは、どちらのプロジェクトでも共通なので、これも別のクラスライブラリ・プロジェクトとして独立させることになります。

以下のようなプロジェクト構成ですね。

Sample.sln
　    Sample.Web　Webアプリケーション。Sample.Dbを参照
　    Sample.API　Web APIプロジェクト。Sample.Dbを参照
　    Sample.Db 　DBのEntityクラスを定義したクラスライブラリ

## 課題
Entity Framework Coreのコードファーストで開発する場合、Migrationコードは、やはりSample.Dbプロジェクトに置きたいと思うのが普通だと思います。

しかし、Sample.Dbのあるフォルダに移動して、

```
dotnet ef migrations add NewMigration
```

のようにしても、このコードは以下のメッセージを出して失敗します。

```
Unable to create an object of type 'AppDbContext'. 
For the different patterns supported at design time,
```


実際に利用するデータベースプロバイダーやDBContextを見つけることができないからです。

Sample.WebやSample.APIのフォルダに移動して、上記コマンドを実行すれば成功しますが、それだとMigrationコードは、Sample.Dbには作成されません。

まあ、それでもいいのですが、やっぱりSample.Dbに作成したいですよね。少なくとも僕はそう思います。


## 解決策

こんな時は、以下のようなコマンドを打てばOKです。

```
dotnet ef migrations add NewMigration --startup-project ..//Sample.API
```

databaseに反映させるには、

```
dotnet ef database update --startup-project ..//Sample.API
```

Sample.APIのところは、Sample.WebでもOKです。


## 別解

Microsoftの公式ドキュメントの「[別の移行プロジェクトを使用する](https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/projects?tabs=dotnet-core-cli)」のページでは、別の方法も示されています。
こちらは、Webプロジェクトあるいは、APIプロジェクトのソースに、どのアセンブリにMigrationコードを生成するかを指定するコードを追加するというものです。

どちらも一長一短がありますが、ソースコードに手を入れたくない場合は、ここで示した`--startup-project`オプションを使うのが良いと思います。
外部コマンドのstdout/stderrをzapに送る

`exec.Command`及び`exec.CommandContext`で実行した外部コマンドの標準出力や標準エラー出力を`zap`でログに記録するには、 [`zapio.Writer`](https://pkg.go.dev/go.uber.org/zap@v1.21.0/zapio#Writer)を使うと良い。

```go
logger, _ := zap.NewDevelopment()
w := &zapio.Writer{
    Log: logger,
    Level: zap.DebugLevel,
}
defer w.Close()

cmd := exec.Command("echo", "hello world")
cmd.Stdout = w
cmd.Stderr = w
cmd.Run()
```

## 参考
- [Possible to set exec.Command Stdout and Stderr to zap?](https://github.com/uber-go/zap/issues/929)
【3分】global install用のyarnをこ◯してnpmに統一した

# npm経由でしかglobalにinstallさせないようにする

```
# global addされたnode packageの在処を特定
yarn global dir

# 上記で特定した場所に移動
cd ${LOCATION}

# node_modulesを削除
rm -rf node_modules

# 再度新しいnode_modulesを作成
(at the same location) yarn
```

これで完了
【Rails】アパレルショップを簡単に検索できるポートフォリオを作成してみた！

![スクリーンショット 2022-03-03 22.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/54f6f23f-6e03-3fa7-849e-b8b36e815a68.png)


# アプリの概要

アプリ名: **FASHION-ONE** 

都内エリアのアパレルショップを、様々な情報や口コミを参考にしながら検索できるアプリです。

* 都内にあるお店を様々な条件で検索できる
* 行ったお店の口コミ投稿ができる
* 気になるお店を保存済み機能で保存することができる

１つのアプリだけでお店を調べることができることをコンセプトに、名前を**FASHION-ONE**にしました。

下記URLにて公開中です。

https://fashion-one-app.com

GitHubのURLはこちら。

https://github.com/shutheonetokyo/fashion-one-app

# アプリの作成背景

ファッションが好きな私は、上京して初めて服を買おうとした時に土地勘が掴めておらず、どの地域にユニクロやH&Mなどがあるのか分からなかったので、最初のお店探しが大変でした。

もし複数のブランドやセレクトショップをひとつのサイトで検索でき、都内のある地域だけに絞って検索することができれば、服好きの人、都内に上京したばかりの人、観光で東京を訪れた人は便利に感じるのではないかと思い、この悩みを解決しようと思い、アプリ開発に至りました。

アパレル店舗といってもファストファッションからラグジュアリーブランドと、価格帯が大きいので、今回はユーザー人口が一番多い、ファストファッションやセレクトショップをジャンルメインのアプリにすることにしました。

# アプリの使い方

### お店の検索方法

キーワード検索でお店を探すことができます。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/8291b922-40e5-1d8b-e7bf-95d3b1bdb624.gif)

エリアからお店を探すことができます。

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/39720a37-9fcc-57f8-03bf-4c8f2ecfbd55.gif)

ジャンルからお店を探すことができます。

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/6163be69-5a36-e3c2-ead1-af636e4e3202.gif)

ブランドからお店を探すことができます。

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/74584694-4650-9455-8113-1753fbfb8658.gif)

### 検索したお店を保存済みにすることができます。

![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/59a7f575-41fc-b10f-8965-3d0db58d3ed1.gif)

### お店に対して口コミ投稿することができます。

![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/c10752b7-2db5-2d5a-f37c-de222f07858a.gif)

### 保存済みしたお店、口コミ投稿したお店はマイページで確認できます。

![7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/e6f64fe1-2b0d-78eb-c8b3-aa579dafcfb2.gif)

# 工夫した点

* ransackで複数の検索機能を実装
* Bootstrapでレスポンシブデザインに対応
* Active Adminでお店を登録、編集、削除できる
* 星５段階評価を表すために、jQueryのプラグイン（Raty）を使用
* 共同開発を意識
① Git,Githubを用いたソース管理
② Projectsのカンバン方式でタスクを管理
③ 適度にcommitし、プルリクエストをし、マージする流れで開発

# 機能一覧

|  | 機能 |Gem |
:---:|:---:|:---:|
| 1 | ログイン・ログアウト機能 | Devise |
| 2 | アカウント登録、マイページ編集機能 | Devise |
| 3 | アカウント削除機能 | Devise |
| 4 | ゲストログイン機能	| Devise |
| 5 | 検索機能 | Ransack |
| 6 | 画像投稿機能　| carrierwave |
| 7 | ページネーション機能 | Kaminari |
| 8 | 管理者画面機能 | ActiveAdmin |
| 9 | レスポンシブデザイン機能 | Bootstrap |
| 10 | 口コミ投稿機能	| x |
| 11 | 保存済み機能(Ajax) | x |
| 12 | フラッシュメッセージ機能 | x |

# ER図

![スクリーンショット 2022-03-03 23.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944601/da743f2e-b93e-ca6e-b820-173f30f17557.png)

# 使用技術

* 言語：Ruby(3.0.0)
* フレームワーク：Ruby on Rails(6.1.4.1)
* フロントエンド：HTML&CSS/Bootstrap/JavaScript/jQuery
* DB：PostgreSQL
* インフラ：Heroku(Heroku Postgres,Papertrail,PointDNS)+AWS(S3)
* ドメイン:お名前.com
* ソースコード管理：Github
* その他使用ツール:Visual Studio Code, draw.io, Font Awesome

# 今後追加したい機能

* AWS（VPC、EC2、RDS、S3、IAM、Route53、ACMを使用）へのデプロイ(現在実装中)
* テスト(Rspec)を記述
* GoogleMapsAPI連携
diff コマンドの大小記号がどっちだったかわからなくなったら見てね

# 結論
* **左** にある引数側の差分が **`<`**
    * `colordiff` の場合は **赤色**
* **右** にある引数側の差分が **`>`**
    * `colordiff` の場合は **緑色**

| 引数 | 記号 | 色 |
| :---: | :---: | :---: |
| **左** | **`<`** | **赤色** |
| **右** | **`>`** | **緑色** |

# 検証
## 左側 (`test1.txt`)

```shell:Shell
cat test1.txt
```

```
Hello world
test1 side
```

## 右側 (`test2.txt`)

```shell:Shell
cat test2.txt
```

```
Hello world
test2 side
```

## diff

```shell:Shell
diff test1.txt test2.txt
```

```
2c2
< test1 side
---
> test2 side
```

**左** の引数 (`test1.txt`) 側にだけある差分が **`<`** で表示され、**右** の引数 (`test2.txt`) 側にだけある差分が **`>`** で表示される。

## colordiff

![](https://raw.githubusercontent.com/noraworld/developers-blog-media-ja/master/diff-operator/Screen%20Shot%202022-03-21%20at%2015.04.46.png)

左 (`<`) が赤色、右 (`>`) が緑色で表示される。

# おわり
毎回忘れるので備忘録として記録しておくことにした。
オブジェクト指向の設計の目標

実行効率より、保守性や再利用性
実行効率に関してはここ最近になって、ハードウェアの能力が著しく上がっているため、そこまで重要視されなくなった。

## 保守性と再利用しやすいソフトウェア構造の目標

1. 重複を排除する
2. 部品の独立性を高める
3. 依存関係を循環させない

### 重複の排除

- 機能の重複があればあるほど、その分だけ規模が大きくなるため、テストが大変になり、理解もしづらくなる。
- しばらく時間がたってから、プログラムの変更時に修正漏れが起きやすくなるため。

### 部品の独立性を高める

- 簡単に言うと、個々の部品の機能のまとまり度合いが強く、部品間の結びつき度合いが弱いと良い設計と言われる。クラスを例にするなら、クラス内の変数やメソッドのまとまりは強く、クラス同士の結びつきが弱いと良いということ。

### 依存関係を循環させない

- 依存関係を循環させると、循環させている部品のどこかを修正した場合に、全てを調べる必要が出てくるため。
現実世界とソフトウェアのギャップを埋めるモデリング

## コンピューターの得意技

### 決まり切った仕事

- コンピューターはプログラムに書かれた命令に忠実に、猛烈なスピードで実行するから。ハードウェアが故障しない限り間違えないし、条件が同じである限りは何回実行しても同じ結果になるため。

### 覚える仕事

- 記憶装置が備わっているため、故障しない限り、忘れることがない。

### 現実世界とソフトウェアのギャップを埋めるステップ

1. 業務分析: 現実世界の仕事の進め方を整理する (why)
2. 要求定義: コンピューターに任せる仕事の範囲を決める(what)
3. 設計: ソフトウェアをどう作るかを決める(how)

### モデリング目的

1. 業務分析: 現実世界の様子をそのままとらえる
2. 要求定義: コンピュータの性質を考慮して、肩代わりさせる仕事の範囲を決める。
3. 設計: ハードウエアの能力、OSやミドルウェアの特性、プログラミング言語の表現能力などを考慮して、ソフトウェアの構造を決める。
メーンフレームの頃のCRUD

メーンフレームの頃のCRUDシステムはこう作ってた。

一覧のスクロールは望めないので、基本はキーダイレクトで参照。

じゃぁキーはどうやって知るの？って話。普通に業務システムの中にキーは登場する。

従業員は自分の従業員番号を知ってる。

氏名しか分からないときには「カナ氏名順従業員一覧」が別途印刷されているからそれをみればいい。
並び順さえ決まっていれば、印刷物ってそんなにサーチに負荷がかかるものではない。

選挙に投票に言ったときにも選挙の券をだすと何かしらの帳票を参照されている。コンピュータを使った検索に比べて遅いかっていうとそんなこともない。もちろんエクセルやスプレッドシートでも十分可能。

また入力時にもすべてを新規入力することなどありえなくて、何かしらののデータを複製する形でスタートする。だからといってテンプレート機能みたいな専用の機能など必要なくて以下のような機能の画面を作る。

- 編集画面で更新キーを押すと以下の動作をする
    - キーがNULLの時にはcreate
    - キーが入ってるとupdate
- 編集画面で複製キーを押すと以下の動作をする
    - キーがNULLの状態になる
    - キー以外のカラムを編集して更新キーを押すことでcreateできる

CRUDにはDuplicateが存在しないんだけど、キーをNULLにするだけで複製っぽい動きができる。

普段ファイルを作成するときには、複製→一部修正という作業を多用してるにも関わらず、CRUDの画面設計をする際には複製をおろそかにしがちなので、それくらい大した機能要らないんだからやりゃぁいいのにねって思ってる。
GOFのデザインパターン(23種)

# デザインパターンとは

- その名の通りで設計パターン
- 機能拡張や再利用がしやすいソフトウェアを作るための先人が工夫したノウハウ集

## 生成に関数パターン

|デザインパターン|概要|
|-|-|
|Abstract Factory|関連する部品を組み合わせて製品を作る|
|Builder|複雑なインスタンスを組み立てる|
|Factory Method|インスタンス作成をサブクラスにまかせる|
|Prototype|コピーしてインスタンスを作る|
|Singleton|たった1つのインスタンス|
## 構造に関するパターン
|デザインパターン|概要|
|-|-|
|Adapter|一皮かぶせて再利用|
|Bridge|機能の階層と実装の階層を分ける|
|Composite|容器と中身の同一視|
|Decorator|飾り枠と中身の同一視|
|Facade|シンプルな窓口|
|Flyweight|同じものを共有して無駄をなくす|
|Proxy|必要になってから作る|

## 振る舞いに関するパターン
|デザインパターン|概要|
|-|-|
|Chain of Responsibility|責任のたらい回し|
|Command|命令をクラスにする|
|Interpreter|文法規則をクラスで表現する|
|Iterator|1つ1つ数え上げる|
|Mediator|相手は相談役1人だけ|
|Memento|状態を保存する|
|Observer|状態の変化を通知する|
|State|状態をクラスとして表現する|
|Strategy|アルゴリズムをごっそり切り替える|
|Template Method|具体的な処理をサブクラスに任せる|
|Visitor|構造を渡り歩きながら仕事する|
【クエリビルダ】作成したクエリと抽出したデータを保存してみる

[Sharperlight](https://sharperlight.jp/)製品群共通のクエリ設計ツール**クエリビルダ**には、クエリのデバッグツールとして**プレビュー**機能が備わっています。クエリを設計したあと[プレビュー]ボタンを押すことで機能します。SQL文を確認するオプションもこのプレビュー機能の一部です。
![2022-mm-dd Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5d2b254b-fa85-0065-07e7-275d2f1d592c.png)
このようにクエリにより抽出されたデータを見ることができます。
![2022-mm-dd Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8c604741-2ab0-c54e-3b11-2d789414e984.png)
このプレビュー機能にはいくつかのオプションがあります。グリッド上部のアイコンメニューから利用できます。
設計したクエリの保存や抽出されたデータの保存もこのオプションの中のひとつです。
このようにクエリもデータもそれぞれ様々な形態で保存する事ができます。

**クエリの保存オプション**
[ファイル]オプションは、クエリ定義をファイルに保存。[クエリのインポート]オプション->[ファイル]で読み込み可能。
[URL]オプションは、クリップボードにURLが保存されるので、ブラウザのアドレスバーに貼り付けて動かすことができます。
その他のオプションは、クリップボードに保存されるので、[クエリのインポート]オプション->[クリップボードから]で読み込み可能。
![2022-mm-dd Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0450de0a-18f2-25af-d6b1-2d893f56d625.png)
**データの保存オプション**
![2022-mm-dd Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/64237806-f26c-33b7-a634-fcc66edc28e0.png)
## あとがき
クエリの保存の[URL]オプションを選択すると下記のメッセージが英語のままで表示されます。:sweat:
![2022-mm-dd Figure 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/75e4af6a-bd7c-4595-66a7-8a20149ff66b.png)
日本語訳は、「クエリURLの詳細はクリップボードにあります。
URLベースアドレスとポート番号をあなたの環境に合ったものに変更する必要があります。 
例えば。```http://localhost:80/``` を```http://myservice.com/```などに変更します。」です。

:postbox:[Sharperlight](https://sharperlight.jp/)
ピボットテーブルをSQLでつくるには

エクセルおなじみの機能のピボットテーブル。クロス集計と呼んだりもする。このピボットテーブルは、SQLでやろうとすると実は難しい。

そもそもRDBの表構造というものが、「列は固定で行は可変」というのが鉄則。ピボットテーブルは集計が終わるまで列の数が定まらない。列が可変の表構造はそもそも認められない。

### 列方向を集計を予めルール化する方法

一本のSQLで最初から表構造にしちゃう。

列の集計軸が固定なら、SQLでは以下のように実装できる。

```sql
SELECT DATE_FORMAT(updated_at, '%Y-%m-%d') as tm,
sum(status=0) '未処理' ,
sum(status=1) '処理済',
max(updated_at)
FROM `jobs`
WHERE updated_at > (CURDATE() - INTERVAL 7 DAY )
order by tm desc
```

実はこれでこれでメリットがあって、存在しないレコードの集計を0件とカウントすることができる。

ただしこの方法では、予めデータの範囲を知っておく必要がある。上の例ではstatusが0と1しか存在しないことを知ってることが前提。そういうのが面倒だからピボットテーブルを使いたいのだ。

### 一旦は二つのカラムでのグループ化をする

```sql
group by カラム1, カラム2
```

でグループ化する。そのままだとピボットテーブルにはならないけど、情報量としてはピボットテーブルと同じ。
その結果をうけて、表示のタイミングでピボットテーブルにする。
metabaseのピボットテーブルはこの方式。

SQL一発ではできないので必ずプラスアルファのプログラムが必要。
そもそものグループ化は存在しない行はグループ化できないのがちょっとつらい。
docker-compose普通の環境設定2022「Mac darwin aarch64 M1」


### 環境
Mac M1チップ
Docker入ってる前提
　入ってない人はここから入れてください。定期的にアップデートしないと動かなくなったりします。
　https://docs.docker.com/desktop/mac/install/

### docker-composeのバージョンを選ぶ

Composeファイル形式のバージョンは書き換えればいいけど、結局どれをインストールすればいいのってのがあります。

下記でいうところのv2.2.2の部分です。最新を選ぶなら最新をとってください。
過去のを取る場合は今お使いのDocker Engineのリリースの時期にちかいtagを見つけてダウンロードしてください。

公式gitからどれをインストールするか選んでください。
![スクリーンショット 2022-03-21 14.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/e390a8e4-4311-9550-53cc-326dd0d11378.png)

https://github.com/docker/compose/releases
mac以外の人はdarwinのところをlinuxとか変えれば動くと思います。



```sh:
curl -Lo docker-compose https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-darwin-aarch64
mv docker-compose /usr/local/bin/
```



### Composeファイル形式

あまりインストールに関係ないですがcomposerファイルには初めにversionってのが書いてます。
多分composeのバイナリが古くなってくると、フォーマットが古くなって更新しないと動かなくなると思います。
そうなると感な感じのエラーになると思います。

```
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version ("2.0", "2.1", "3.0") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
```

下記の例では3.9になってますね。
バージョンが足りない時はdocker-composeを更新してみてください。

```docker:docker-compose.yml
version: '3.9'

services:
  mysql:
    build:
      context: .
      dockerfile: docker/mysql/Dockerfile
```


![スクリーンショット 2022-03-21 14.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/340ad0f4-bb5f-bb95-a9b4-d5d02bf9f0a3.png)

最新情報は下記を参考

https://docs.docker.jp/compose/compose-file.html



それでは良いエンジニアライフを！

フォローして意見とか雑談とかで絡んでもらえると喜びます。
https://twitter.com/miyamotok0105
UML

# UMLとは

- Unified Modeling Languageの略語
- 日本語では「統一モデリング言語」と呼ばれている
- 言語という名前がついているが、実体はソフトウェアの機能や内部構造を図で表現する描き方のこと

## UMLのダイアグラム(13種類)

### 1.**クラス図（class diagram）**

クラス図とは、**クラスの定義や関連付けを示す図**です。

オブジェクト指向開発で作成する「クラス」の定義や「他クラス」との関連性を示す図であり、具体的には、以下のような形式でクラス図を作成します。

### 2.**オブジェクト図（Object Diagram）**

オブジェクト図とは、オブジェクト指向開発で作成する「クラス」を実体化させる**インスタンス（オブジェクト）の関係性をあらわす図**です。

### 3.**パッケージ図（Package Diagram）**

パッケージ図とは、オブジェクト指向開発で作成する**「クラス」などが、どのようにグループ化（パッケージ）されているかをあらわす図**です。

### 4.**コンポーネント図（Component Diagram）**

コンポーネント図とは、処理を構成する複数のクラスを1つのコンポーネントと見なし、**「コンポーネントの構成」や「他コンポーネント」との関係をあらわす図**です。

クラス単位のクラス図とは違い、コンポーネント図は部品（機能）単位で構成されます。

### 5.**複合構成図（Composite Structure Diagram）**

複合構成図とは、複数クラスを内包する**クラスやコンポーネントの内部構造をあらわした図**です。

### 6.**配置図（Deployment Diagram）**

配置図とは、**システムを構成する物理的な構造をあらわす図**です。例えば「Webサーバ」や「アプリケーションサーバ」「DBサーバ」などの物理的な構造を示す際に使用されます。

### 7.**ユースケース図（Use Case Diagram）**

ユースケース図とは、**利用者視点でシステムがどのように利用されるかを非常にシンプルな図であらわしたもの**です。コンピューターの仕事の範囲を表現する。

### 8.**アクティビティ図（Activity Diagram）**

アクティビティ図とは、**システムの一連の流れや状態遷移を分かりやすく図で表現したもの**であり、[フローチャート](https://medium-company.com/%e3%83%95%e3%83%ad%e3%83%bc%e3%83%81%e3%83%a3%e3%83%bc%e3%83%88/)に似た図でもあります。現実世界の仕事の流れを表現する。

### 9.**状態マシン図（State Machine Diagram）**

状態マシン図とは、**イベントによって起こる、オブジェクトの状態遷移をあらわした図**です。

外部からのイベントによって、状態変化を表現する。

### 10.**シーケンス図（Sequence Diagram）**

シーケンス図とは、**オブジェクト間の処理の流れを時系列であらわした図**であり、ソフトウェア開発の設計段階でよく利用される有名なUMLです。

### 11.**コミュニケーション図（Communication Diagram）**

コミュニケーション図とは、**クラスやオブジェクト間の関連と、そこでやり取りされるメッセージをあらわす図**です。

### 12.**相互作業概要図（Interraction Overview Diagram）**

相互作業概要図とは、**「ユースケース図」や「シーケンス図」などを構成要素として、より大枠な処理の流れをあらわす図**です。

### 13.**タイミング図（Timing Diagram）**

タイミング図とは、**クラスやオブジェクトの状態遷移を時系列であらわす図**です。
プログラムのメモリ管理領域

## 静的領域

- プログラム開始時に確保され、以降プログラムが終了するまで、配置が固定される領域
- グローバル変数とプログラムを実行可能にした形式に変換したコード情報が格納される。

## ヒープ領域

- プログラム実行時に動的に確保するための領域
- インスタンス生成のたびに使われる領域でもある。

## スタック領域

- スレッドの制御のために使う領域。
- 呼び出されたサブルーチンの引数、ローカル変数を格納される。
プロセスとスレッド

## プロセス

- メーラーやWEBブラウザ、表計算ソフトといった、パソコン上で独立して動くアプリケーションプログラムの実行単位。

## スレッド

- プロセスより小さな単位で１つのプロセスの中に複数存在することが可能。アプリケーションは複数のスレッドにより実現されている。
- 身近な例としてはワープロソフトの文書作成や印刷処理、Webブラウザのリクエスト処理、中止ボタンの処理などが挙げられる。
Herokuの使い方（基本）

#herokuの基本コマンドの流れ


```
heroku login --interactive // Herokuの画面を表示させず、ターミナル上でログイン
　→その後　メールアドレス、パスワードを入力

heroku create // herokuのアプリを作る

git push heroku main // github上にプッシュしているプロジェクトをアップロード

heroku logs // herokuの直近のイベントを表示する

heroku logs --tail // イベント発生のたびに自動表示する（Ctrl-Cで終了）
```

アプリケーションにDBを使用していて以下のエラーが出た時
```
ActionView::Template::Error (PG::UndefinedTable: ERROR:  relation "users" does
not exist
```
以下のコマンドを実行する

```
heroku run rails db:migrate
```
これでSQLも反映される。
オブジェクト指向

# OOP(Object  Orient Programingの略)
3つ優れた仕組み
### クラス
- オブジェクト指向において、基本的な仕組みで、対となるのがインスタンス
- クラスは分類や種類を表す「同種のものの集まり」を指します。インスタンスは「具体的なモノ」、つまり「実例」という意味を持ちます。

### ポリモーフィズム
- 英語で「色々な形に変わる」と言った意味を持つ言葉で、日本語では「多相性」「多態性」などと訳されます。
- プログラミング言語の持つ性質の一つしてはある関数やメソッドなどが、引数や返り値の数やデータ型などの異なる複数の実装を持ち、呼び出し時に使い分けるようにできる。

### 継承
- 似たモノ同士のクラスの共通点と相違点を整理する仕組み
- 全体集合をスーパークラス、部分集合をサブクラス
- スーパークラスを定義することにより、サブクラスを楽に作成することができる。

# プログラム命令基本3構造
### 順次進行
- 文字通りプログラムに書かれた命令を上から順に実行させること
### 条件分岐
- 何らかの判定を行い、その結果によって、次の命令を決めること
### 繰り返し
- 一定回数またはある条件が成立する間は特定の命令群を繰り返し実行すること

# インスタンス変数の性質

- 別のクラスのメソッドからアクセスできないよう隠すことができる。
- 一旦インスタンスが作られたあとは、必要なくなるまでメモリ上に残される。

- 仲間内だけのグローバル変数というイメージ。

- ちなみにグローバル変数と言うのは、プログラムのどこからでもアクセスできてしまう変数。

- 変数領域の複製が可能で、インスタンス実行時ににいくつでも作れてしまう。

- 要するにインスタンスごとで使える変数。

# カプセル化

特定のデータ構造とアルゴリズムなどをまとめたソフトウェアの複合体の内側の詳細を外側から直接参照できないようにすること。
rails webpacker:installのエラーで躓いた時の対処法

# rails webpacker:installでエラー

``` rails webpacker:install```
を実行したところ

```
rails webpacker:install
rails aborted!
Don't know how to build task 'webpacker:install' (See the list of available tasks with `rails --tasks`)
```

上記エラーが表示されてた。


## 対処法
Gemfileに
```gem 'webpacker', '~> 3.0'```
を追記して```bundle update   ```を行いその後改めて```rails webpacker:install```で解決した。
【Linux】サーバ間の到達性がない場合のファイルコピー方法

# 1. 概要
サーバ間の到達性がなく`scp`や`ftp`コマンドが使えない場合に便利。

# 2. 手順
## 通常のファイルコピーの場合
(1) コピー元のLinuxサーバで下記コマンドを実行し、出力された文字列をコピーする。
   　※ファイルは複数でも可能。

```
# tar zcf - file1 | base64
H4sIAP9MDmIAA+3RMQrCQBAF0K09RY6waybxPBYRBCGQrPd3tbRQLIIE3mt+MVN8Zuq01rSx3IwR
r2zeM+dSUolj7iPG/tT2So5hSF3eutjTfa3npevSMs8fD/FtvlO1/f9yvU2HfxcBAAAAAAAAAADg
Jw9jPVaqACgAAA==
```

(2) コピー先のLinuxサーバで下記コマンドを実行し、(1)で出力された文字列をペーストする。

```
# cat | base64 -d | tar zxf -
H4sIAP9MDmIAA+3RMQrCQBAF0K09RY6waybxPBYRBCGQrPd3tbRQLIIE3mt+MVN8Zuq01rSx3IwR
r2zeM+dSUolj7iPG/tT2So5hSF3eutjTfa3npevSMs8fD/FtvlO1/f9yvU2HfxcBAAAAAAAAAADg
Jw9jPVaqACgAAA==
```
※「ctrl + d」で抜ける
## zipファイルのコピーの場合

(1) コピー元のLinuxサーバで下記コマンドを実行し、出力された文字列をコピーする。

```
# base64 file.zip
UEsDBAoAAAAAAEpDUVQV07B3CQAAAAkAAAAEABwAdGVzdFVUCQAD/EwOYv9MDmJ1eAsAAQQAAAAA
BAAAAAB0ZXN0ZmlsZQpQSwECHgMKAAAAAABKQ1FUFdOwdwkAAAAJAAAABAAYAAAAAAABAAAApIEA
AAAAdGVzdFVUBQAD/EwOYnV4CwABBAAAAAAEAAAAAFBLBQYAAAAAAQABAEoAAABHAAAAAAA=
```

(2) コピー先のLinuxサーバで下記コマンドを実行し、(1)で出力された文字列をペーストする。

```
# cat | base64 -d > file.zip
UEsDBAoAAAAAAEpDUVQV07B3CQAAAAkAAAAEABwAdGVzdFVUCQAD/EwOYv9MDmJ1eAsAAQQAAAAA
BAAAAAB0ZXN0ZmlsZQpQSwECHgMKAAAAAABKQ1FUFdOwdwkAAAAJAAAABAAYAAAAAAABAAAApIEA
AAAAdGVzdFVUBQAD/EwOYnV4CwABBAAAAAAEAAAAAFBLBQYAAAAAAQABAEoAAABHAAAAAAA=
```
※「ctrl + d」で抜ける
途中からMySQLを使用する方法

# なぜ、MySQLに変更したのか
初めは、PostgreSQLを使用していましたが、私が作成しているアプリを見るとMySQLを使用している記事が多く、利用者も多くなっているのでニーズに合わせて変更しました。

# MySQLとは
大容量のWebサイトや基幹業務システム、パッケージソフトウェアの構築にもっとも利用されているデータベースです。
私は、無料で高機能で誰でも扱いやすいデータベースという認識です。

# 環境
ruby 3.0.2
rails 6.1.4
Homebrew

# 本題へ
### 1, HomebrewでMysqlをインストールします。
```
brew update
brew install mysql
```
### 2, MySQLがインストールされているか確認します。
```
# mysqlを起動
mysql.server start

# mysqlにログイン
mysql -u root -p
```
ログインする際にパスワードを聞かれますが、まだ設定していないのでそのまま「Enterキー」でログインできます。

ログインできると、mysql>という表示なります。接続を抜ける場合は、exit;を入力してください。

### 3, MySQLにRailsプロジェクト用のユーザーを登録
今の段階ではrootユーザーしかないと思うので、Rails用のユーザーを作ってみましょう。以下のコマンドを実行してください。
```
# mysql>から以下のコマンドを実行
# 「sampleuser」と「password」というところを変えてください
create user sampleuser@'localhost' identified by 'password';

# 権限付与
grant all on *.* to sampleuser@'localhost';
```
### 4, 設定ファイル・Gemfileを変更
Gemfileとdatabase.ymlファイルを変更します。
```
# Gemfile
# gem 'sqlite3' # 削除
gem 'mysql2' # 挿入
```
```
# config/database.yml
# 適宜username,password,socket,databaseを先ほど設定したものに書き換えてください。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: sampleuser
  password: password
  host: localhost
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: Sample_development

test:
  <<: *default
  database: Sample_test

production:
  <<: *default
  database: Sample_production
  username: Sample
  password: <%= ENV['Sample_PASSWORD'] %>
```
### ※こちらのファイルは、あくまで例なので使いたい環境に応じて変更して下さい。
その後bundle installを実行してください。

### 5, データベースを作成・テーブルを作成
```
# データベース作成
bundle exec rails db:create

# テーブル作成
bundle exec rails db:migrate
```
以上となります。

参考URL
https://shinmedia20.com/rails-db-mysql
# 反省
アプリ設計の段階で、どんな構成でどんな技術を使用するなどをあらかじめ決めておけば、途中から変更することなく進めていけたのではないかと思いました。
今後、作成するときは設計計画をきちんと決めてから作成しようと思いました。
DynamoDB Global Tables CloudFormation テンプレート記法メモ


* DynamoDB Global TablesをCloudformationテンプレートで作成する場合の記法について、個人用にメモする。

## テンプレート

```yaml
Type: AWS::DynamoDB::GlobalTable
Properties: 
  AttributeDefinitions: 
  	- AttributeDefinition 
  BillingMode: String
  GlobalSecondaryIndexes: 
    - GlobalSecondaryIndex
  KeySchema: 
    - AttributeName: PK 
    - KeyType: HASH
  LocalSecondaryIndexes: 
    - LocalSecondaryIndex
  Replicas: 
    - ReplicaSpecification
  SSESpecification: 
    SSESpecification
  StreamSpecification: 
    StreamSpecification
  TableName: mytable
  TimeToLiveSpecification: 
    TimeToLiveSpecification
  WriteProvisionedThroughputSettings: 
    WriteProvisionedThroughputSettings
```

* **`AttributeDefinitions`**※必須

  * 属性定義
  * 属性名と型を指定する。

* **`BillingMode`**※任意

  * 課金形態
  * 定義域：`PAY_PER_REQUEST`or`PROVISIONED`

* **`GlobalSecondaryIndexes`**※任意

  * グローバルセカンダリインデックス
    * あるテーブルをベースに、異なるパーティションキー・ソートキーのテーブルを作成する仕組み。
  * 最大20個作成可能。

* **`KeySchema`**※必須

  * 主キーを構成する属性

* **`LocalSecondaryIndexes`**※任意

  * ローカルセカンダリインデックス
    * あるテーブルをベースに、パーティションキーはそのままに、異なるソートキーのテーブルを作成する仕組み。
  * 最大5個作成可能。

* **`Replicas`**※必須

  * グローバルテーブルのレプリカリスト

  * 記載例

    ```yaml
    Replicas:
    	- Region: us-east-1
          PointInTimeRecoverySpecification: #特定時点への DB インスタンスの復元設定
          	PointInTimeRecoveryEnabled: true
          SSESpecification:
          	KMSMasterKeyId: alias/dynamodb-key-useast #暗号化に使用するKMSキーを指定
          Tags:
          	- Key: Name
          	  Value: testtable
          	- Key: Region
          	  Value: east
     	- Region: us-west-1
          PointInTimeRecoverySpecification:
          	PointInTimeRecoveryEnabled: true
          SSESpecification:
           	KMSMasterKeyId: alias/dynamodb-key-uswest
          Tags:
          	- Key: Name
          	  Value: testtable
          	- Key: Region
          	  Value: west
    ```

    

* **`SSESpecification`**※任意

  * サーバー側の暗号化を有効にするための設定
  * 定義域※暗号化方式：AES256 | KMS

* **`StreamSpecification`**※任意

  * ストリーム(データ変更時に、その変更情報を暗号化してログに保存しておく)設定
  * グローバルテーブルに複数のレプリカが含まれている場合は指定する
  * 定義域： `KEYS_ONLY | NEW_AND_OLD_IMAGES | NEW_IMAGE | OLD_IMAGE`

* **`TableName`**※任意

  * テーブル名

* **`TimeToLiveSpecification`**※任意

  * TTL設定
  * TTL設定を行う属性名を指定する。

* **`WriteProvisionedThroughputSettings`**※任意

  * 書き込み容量の自動スケーリングポリシー
  * 全レプリカに適用される。
  * `BillingMode`が`PROVISIONED`に設定されている場合は設定が必要



## 参考情報

* [AWS::DynamoDB::GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html)
オンライン整数列大辞典(On-Line Encyclopedia of Integer Sequences, 以下 OEIS）について調べてみた。

# OEIS

https://oeis.org/community.html


https://en.m.wikipedia.org/wiki/On-Line_Encyclopedia_of_Integer_Sequences


## 日本語
公式ページ:日本語は、topページだけです。

http://oeis.org/?language=japanese


無料で利用可能<


https://ja.m.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E6%95%B4%E6%95%B0%E5%88%97%E5%A4%A7%E8%BE%9E%E5%85%B8

# WolframAlpha(Integer Sequences) でOEIS番号で数列を指定する：



OEISの6桁の識別番号 (ID number) が使える?リンクされています。

Specify a sequence by OEIS number:OEIS A000219

Recurrence relation

a_0 = 1

a_n = ( sum_(k=1)^n σ_2(k) a_(n - k))/n

https://ja.wolframalpha.com/examples/mathematics/discrete-mathematics/sequences/


# OEISででてきた

Sorry, but the terms do not match anything in the table.

If your sequence is of general interest, please submit it using the form provided and it will (probably) be added to the OEIS! Include a brief description and if possible enough terms to fill 3 lines on the screen. We need at least 4 terms.
railsアプリ作成準備

### Ruby on RailsのアプリをGithubからクローンしてからhello worldするまで

```git clone URL```
でクローンする。

```bundle _2.2.17_ install```
を実行する。

そうすると
```
n error occurred while installing pg (1.1.4), and Bundler cannot continue.

In Gemfile:
  pg
```
上記エラーが出る

これは、**pg Gemは開発環境には不要**な為、最初に

```
bundle _2.2.17_ config set --local without 'production'
```
をする必要があった。

この後に```bundle _2.2.17_ install```

```rails server```

でlocalhost:3000にhello world表示
ランニングコスト0の書籍管理webアプリ！　google driveのホスティングってどんなもの？

# ランニングコスト0の書籍管理webアプリを開発！　google driveのホスティングってどんなもの？

※こちらの記事の内容は2022/3/21に執筆したものです。

## 初めに
この記事は、[以下の元記事](https://qiita.com/keisuke_suzuki_engineer/items/3be494864dffb3b5543b)で紹介しているアプリを構築する際に使ったGASの機能について紹介している記事です。よろしければ元記事からご覧ください。

https://qiita.com/keisuke_suzuki_engineer/items/3be494864dffb3b5543b

## google driveのホスティングってなに？
google driveはご存じの方も多いと思いますが、googleが提供している基本無料のストレージサービスです。ファイルを保存できるほかに、google drive上で起動や編集ができる様々なサービスが存在します。

そしてgoogle driveで利用できるサービスの一つに、drive上のフォルダを指定してのホスティングサービスがあるのです！

## どうやって始めるの？
ざっくり2ステップで公開できます(強い)。

1. 公開用のフォルダを作成し、共有設定を仕掛ける。
フォルダを作成しまして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/4e3f68e8-0f71-4ab6-be09-fd2fafe576bb.png)
右クリックからリンクを取得を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/2f03fd0a-3697-6317-44eb-1f1d84284b86.png)
こんなのが出てくるので、リンクの下の選択肢をリンクを知っている全員に変更して完了しましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/a2f78962-1461-61f9-bedb-2e15b2ea0d78.png)
公開設定が完了したら、確認用に拡張子がhtmlのファイルを配置しておきましょう。

1. driveのホスティング設定用のページにアクセス。
driveとは別タブを開いて[こちら](https://www.drv.tw/)のリンクにアクセスするとこのようなページが開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/c8b3e8e4-ce1b-8ffa-8992-13f2ace04526.png)
上の画面でgoogle driveのアイコンを選択するとログイン画面が出てくるので、出てきたらホスティングに使用するアカウントでログインしましょう。
すると許可するかの選択が出てくるので許可しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/e8b04a25-a222-ba5b-626d-65559b6ed1a8.png)

はいこれで完了です！
ログイン後にこんな画面に遷移したと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/8b032f15-29e9-4ef3-9b5d-7ab72004ec14.png)
ぼかしている部分に、リンクを知っている人全員が閲覧できるフォルダ内のhtmlへのリンクがでいるはずです！
ここには表示されていませんが、cssやjsや画像もこのホスト名でアクセスできます！

以上google driveでのホスティングについての簡単なあれこれでした！