OmniAICreator/Qiita-1.07M huggingface dataset:
自身が経験したAngular7〜Angular16までの変遷について

Angular Advent Calendar 7日目の記事です。

# はじめに
私は元々バックエンドエンジニアで長く働いていましたが、ここ５年はフロントエンジニアとして働いています。（とはいえ、最初の２年は、あまりフロントを触って無いですが）

5年間で3つの現場を経験しAngularは7で始まり、現在は16を使っています。

その3つの現場で経験した内容について紹介していきます！

# 大手携帯会社のNW監視（Angular 7-10）
この現場で初めてAngularに触れました。
他にもrxjsやNgrxも使ってたので、最初の学習コストが高く、苦労したのを今でも覚えています。

この状態では、チケットをこなすことができないので、結局バックエンドでJavaをひたすら書いてました。

ただ、コードはあまり分からなくても仕様面などをチェックする名目でフロント（Angular）のコードレビューはやらせてもらってました。

で、少し慣れた頃に、Angular7から8にアップデートする話になり、他の方のサポートありで、私が対応することになりました。

[Angular Update Guide](https://update.angular.io/?v=7.0-8.0)を見ながらアップデートしたんですが、アップデート自体はスムーズに終わったので、少し安心して、起動したら、たくさんのエラーが出て、絶望したのを覚えてます。

正常に起動できるまでが一苦労で、ようやく起動できて少し動作確認した感じ問題なさそうだったので、念の為QAにも見てもらったら、ちらほら動きが怪しいところがあり、結果、全画面テストしてもらい、追加で修正したのも覚えてます。

その後、8から9は別の人がアップデートしたんですが、7から8の時よりは、エラーが少なかった印象です。
※個人的なイメージだとバージョンが上がるごとにアップデートはやりやすくなってそう。

## ポイント
- 昔のAngularは、アップデートが結構大変
- Angularの習得は大変（Ngrx,rxjsも大変　もちろん個人の能力による）

# 学校教育関連（Angular 12）
次の現場では、Angularに触れる機会が少なかったので、次の現場では、フロントエンドメインのところを選びました。

こちらは、システムのリプレース案件で、現在動いているものをAngularに置き換えていきます。

まず、自分が担当する機能のリポジトリを作成して、そこにリプレース用のコードを書いていきます。

まだまだAngularに慣れていないなか、リポジトリから作成するのは非常に良い経験でした。

分からないことが多かったので、もう一人の（若いけど、めちゃくちゃ出来る）エンジニアに色々聞きました。

私が担当したのはカレンダー機能で、ライブラリを使ってたので、Angularよりは、ライブラリの使い方に苦労したのを覚えてます。

あとrenovateが、まあまあコケてたな〜（つらかったな〜）

カレンダーライブラリを使うのに苦労したけど、コード書く時間が比較的多く取れたのと、分からないことを聞ける環境は良かった。

Angularが少し出来るようになった気がする。

## ポイント
- リポジトリ作るところから経験できたのは良かった
- Angularを習得するにはたくさんコードを書く

# 契約管理（Angular 13-16）
現在の現場は、さらにコードを書く時間が増えた。
打ち合わせもほとんどないので、ほぼ全ての時間でコードを書いてる。

また、最初の現場以来、Ngrx, rxjsを使ってて、さらにNxも使ってる。

この現場は、基本的に最新のAngularに追従しており、アップデートする際は、nx migrateでAngular以外のNgrx、rxjsや他のライブラリもまとめてアップデートしてます。

さらに、テックリードの人が、「新しいバージョンでこんなことが使えるよ」と、情報発信してくれるので助かる。

なので、ここではAngularがアップデートするたびに、コードの書き方も新しくなっていった。

## Angular 15
15といえば、Standalone Componentでしょう。

15に上げた後に、新しいアプリを開発するチャンスがあって、全てStandaloneで開発した。(apps/**/app.module.tsなし)

Standaloneのお陰で、そのComponent見れば、何がimportされてるか分かるし、テスト側はimportが不要で、非常に良かったです。

## Angular 16
16は、やはりSignalですよね！

まだまだ、書けるところは限定的ですが、それでも少しずつ書いてます。
初めて書いた時のポスト
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">会社のコードでsignal書く実績を解除した<a href="https://twitter.com/hashtag/Angular?src=hash&amp;ref_src=twsrc%5Etfw">#Angular</a></p>&mdash; takataro@フリーランスエンジニア (@beltway7) <a href="https://twitter.com/beltway7/status/1710169229037892052?ref_src=twsrc%5Etfw">October 6, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

あと、Self-closing tagも結構良くて、いっぱいつかってます！
```
<app-component></app-component> // <- これが

<app-component /> // <- こう出来る
```

## Angular 17
まだ、導入してないですが、Control Flow激アツですよね！！

### ポイント
- Angularアップデートの情報を社内共有してくれると新しい機能を知れて使う機運が高まる
- Angular15のComponent Store良い
- Angular16のSignal, Self-closing tagも良い
- Angular17のControl Flow激アツ
- 最近のAngularアップデートはすごい（やらなきゃ損）

# まとめ
今までの現場で経験して、苦労した点や、思うところを記載しました。

私の見解としては、Angularのバージョンが上がるほど、アップデートは簡単になるのと、最近のAngualrアップデートはアツいということです！

半年に1回、バージョンが上がりますが、新しい機能も使えるし、アップデートは大変じゃなくなると思うので、どんどんバージョンアップするのが良さそうです！！（最近自分じゃやってないので、自分でやったら大変かもしれないけど。。。）

明日は、[@KOHETs](https://qiita.com/KOHETs)さんです！
「逆行列(英:invertible matrix)」を調べた。sympyで


# wikipedia

https://en.wikipedia.org/wiki/Invertible_matrix

https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%89%87%E8%A1%8C%E5%88%97

# 過去問内部検索　(逆行列)
「大学入試数学問題集成」様 サイト内

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E9%80%86%E8%A1%8C%E5%88%97&oq=%E9%80%86%E8%A1%8C%E5%88%97&gs_l=partner-web.12..0i512j0i3i4i37j0i512i433i131j0i512j0i7i30l6.5359.7308.0.10237.6.6.0.0.0.0.160.702.1j5.6.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..0.6.702.TaRW7haWcp8

https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%E9%80%86%E8%A1%8C%E5%88%97&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fkamelink.com+%E9%80%86%E8%A1%8C%E5%88%97&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIGCAEQRRg60gEJMTIwMzVqMGo0qAIAsAIA&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%E9%80%86%E8%A1%8C%E5%88%97&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%E9%80%86%E8%A1%8C%E5%88%97&gs_lcrp=EgZjaHJvbWUqBggAEEUYOzIGCAAQRRg7MgYIARBFGDrSAQkxMzk0NmowajSoAgCwAgA&sourceid=chrome&ie=UTF-8

# ChatGPT-3.5　先生へ 

```
逆行列とは何ですか
```
　＞...数学や工学のさまざまな分野で重要な役割を果たします。

# WolframAlpha で

https://www.wolframalpha.com/input?i=%5B%5Ba%2Cb%5D%2C%5Bc%2Cd%5D%5D+%E3%81%AE%E9%80%86%E8%A1%8C%E5%88%97&lang=ja

結果
1/(a d - b c)(d | -b
-c | a)

# (勉強中) MATLAB 追加のオプションSymbolic Math Toolbox で

# sympyで
・ver0.2　**逆行列を因数分解したい。行列式を分母に表示したい。** 
　自作関数myInv_str()で文字列で、表示です。
```python
# ver0.2
from sympy import *

var('a,b,c,d',real=True)
def myInv_str(A):
     return "1/(" + str(det(A)) +")*" + str(A.inv()*det(A))
A=Matrix([[a,b],[c,d]])
print("#",                  A      )
print("#",                  A.inv())
print("#",        myInv_str(A)     )
print("#",sympify(myInv_str(A))    )
# Matrix([[a, b], [c, d]])
# Matrix([[d/(a*d - b*c), -b/(a*d - b*c)], [-c/(a*d - b*c), a/(a*d - b*c)]])
# 1/(a*d - b*c)*Matrix([[d, -b], [-c, a]])
# Matrix([[d/(a*d - b*c), -b/(a*d - b*c)], [-c/(a*d - b*c), a/(a*d - b*c)]])
```

・ver0.1
・Matrixの後ろの.factor()は動きませんでした。ページ後半で再確認しました。

inv(method=None, iszerofunc=<function _iszero>, try_block_diag=False)
https://docs.sympy.org/latest/modules/matrices/matrices.html#sympy.matrices.matrices.MatrixBase.inv

```python
# ver0.1
from sympy import *

var('a,b,c,d',real=True)
A=Matrix([[a,b],[c,d]])
print("#",A)
print("#",A.inv())
# print("#",A.inv().factor())
# Matrix([[a, b], [c, d]])
# Matrix([[d/(a*d - b*c), -b/(a*d - b*c)], [-c/(a*d - b*c), a/(a*d - b*c)]])
# AttributeError: 'MutableDenseMatrix' object has no attribute 'factor'
```

# いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート)

https://qiita.com/mrrclb48z/items/00dd08b0317069be9342

# いつもと違うおすすめです。

https://manabitimes.jp/math/1153

・Matrixの後ろの.factor()は動きませんでした。再確認しました。

https://qiita.com/mrrclb48z/items/a6a977db43bf29044573
Amazon SESを用いてHTMLメールを送信する

# SDKをインストールする
```
composer require aws/aws-sdk-php
```

# SDKを用いたコード
```PHP
use Aws\Ses\Exception\SesException;
use Aws\Ses\SesClient;


$ses =　new SesClient([
    'profile' => 'default',
    'region'  => 'us-west-2', //任意のもの
    'version' => '2010-12-01'
])

//送信対象のメールのリスト
$mailList = ['aaa@aaa.com', 'bbb@bbb.com'];

//HTMlメールのボディ
$html = '<h1>AWS Amazon Simple Email Service Test Email</h1>'.
        '<p>This email was sent with <a href="https://aws.amazon.com/ses/">'.
        'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-php/">'.
        'AWS SDK for PHP</a>.</p>';

//件名
$subject = 'test'

try {
    $result = $ses->sendEmail([
        'Destination' => [
            'ToAddresses' => [$mailList],
        ],
        'Source' => 'ccc@ccc.com',
        'Message' => [
            'Body' => [
                'Html' => [
                    'Charset' => 'utf-8',
                    'Data' => $html,
                ],
            ],
            'Subject' => [
                'Charset' => 'utf-8',
                'Data' => $subject,
            ],
        ],
    ]);
    echo $result['MessageId'];
} catch (SesException $e) {
    echo $e->getMessage();
}

```
redis 基本操作備忘録

先日仕事で唐突にredisデータベースを操作する機会が訪れました。
データ参照・削除などの単純な操作が求められたのですが、ネット上には構築など高度な操作のhackばかりで初心者向けの日本語情報が少なく苦労しました。
そのためredisの基本操作を備忘録として公開します。

### キーの参照
redisはキーによって値を管理しています。キーの名前が分からないと何もできないため、
`> keys *`
によってキーの一覧を取得します。以下のように正規表現によるパターンマッチングが可能です。
`> keys hoge[1-9]*`

### キーの種類
redisのキーには5種類のデータ型が存在します。種類の確認は以下のコマンドで行います。
`> type [key]` 
以下は各データ型の大まかな理解です。
| キーの種類 | 説明 | 
|:-:|:-:|
|  string | keyと値(value)が1対1の関係で管理されるデータ型  | 
|  list | 1つのkeyに対して複数の値(element)を順序付きで管理するデータ型  |
|  set | 1つのkeyに対して複数の値(member)を順序なしで管理するデータ型  |
|  zset | 1つのkeyに対して複数の組(score, member)を順序なしで管理するデータ型  |
|  hash | key、field、valueにより階層的に管理されるデータ型  |

### コマンド一覧
redisはキーに格納された値の種類によって操作コマンドが異なります。
よく使用するであろう参照・設定・削除のコマンドをまとめました。
| キーの種類 | 参照コマンド | 設定コマンド | 削除コマンド |
|:-:|:-:|:-:|:-:|
|  string | get [key]  | set [key] [value]  | del [key]  |
|  list | lrange [key] 0 -1  | lset [key] [index] [element]  | lrem [key] [count] [element]  |
|  set | smembers [key]  | sadd [key] [member]  | srem [key] [member]  |
|  zset | zrange [key] 0 -1 withscores  | zadd [key] [score] [member]  | zrem [key] [member]  |
|  hash | hget [key] / hgetall  |  hset [key] [field] [value] |  hdel [key] [field] |

[公式のチートシートはこちら(英語版)](https://cheatography.com/tasjaevan/cheat-sheets/redis/#downloads)
hashの参照コマンドにはfieldのみを返す`> hkeys [key]`、valueのみを返す`> hvals [key]`もあります。
lrangeやzrangeの第二、第三引数(0,-1)は参照の開始番号と終了番号を表し、任意の範囲を指定できます。
(例)
`zrange [key] 10 20 withscores`：zsetの11番目から21番目(スコア付き)
`lrange [key] -100 -1`：listの後ろから100番目から最後まで

また、削除コマンドには各データ型の特性がよく現れています。
* **del [key]** & **hdel [key] [field]** keyごと/fieldごと削除 
* **lrem [key] [count] [element]** elementに一致するデータを前(負の場合後ろ)からcount分だけ削除
* **srem [key] [member]** & **zrem [key] [member]** memberに一致するデータをすべて削除

#### 注記
[公式ドキュメント](https://mogile.web.fc2.com/redis/redis500/index.html)は参照しましたが、内容の理解については曖昧です。
ご指摘のある方は躊躇なくコメントお願いします。
コマンドは動くと思います。
REST APIについてまとめる

# はじめに
APIについて勉強をし始めました。
APIって何？という基礎的な部分から自身の理解のために言語化を行います。

# APIってなに？
<font color="red">A</font>plication <font color="red">P</font>rogramming <font color="red">I</font>nterfaceの略

他社が提供するサービス内の情報や機能を扱えるようにする仕組み。
あるアプリからほかのサービスだったりアプリの機能を使いたいときに使うもの。　
サービス側が提供しているもの。

という説明をよく見かけるが、もっと広く言うと仕組みと仕組みをつなぐもの。
<font color="red">必ずしも外部からの連携をAPIと呼ぶとは限らない。</font>

# APIには２種類ある
* 外部に公開しているAPI
サードパーティ製のアプリとの連携に使ったりするもの。
* 外部に公開されていないAPI
サービスそのものを構築するために存在しているもの。
そしてそれらのほうが圧倒的に数があるので開発数は一般公開されていないもののほうが多い。

# 身近なAPIって？
例えば、twitterのツイート取得がおこなえる、他社製のアプリなどが挙げられる。

twitter純正のアプリケーションではないが、
twitterのAPIを利用することでtwitterのサービスを利用することができている。

本例はtwitterのサービスとサードパーティ製アプリとの連携例

APIは「たたく」という言い方がされることが多い。
「フォロワー取得のAPIをたたくよ」というのは、「フォロワー取得のAPIを使うよ」という意味。

# REST APIとは
RESTful APIとも呼ぶ。
RESTは <font color="red">RE</font>presentatinal <font color="red">S</font>tate <font color="red">T</font>ransfer の略
直訳すると、代表的な状態転送。

Webサービス設計思想の１つ

REST APIはRESTの原則に従って実装されているAPIのことをいう。

<font color="red">
サービス利用者が便利に使える仕組みというところではなく、開発サイドの話というところがポイント。</font>

# REST APIの4大設計ルール

### アドレス可能性
URLを使うことで一意に結果表示ができる。
取得や削除などの処理内容でURLが変わらないということ。
同じURLでGETもPOSTもできるよ！っていうこと。

### 統一インターフェイス
HTTPメソッドを使ってリクエストをする。Json形式で返答をする。など
情報の送受信を決まったやり方を行いましょうということ。

### ステートレス性
直訳は状態を持たない。
サーバーがクライアントの状態を持たないように設計する。
昔の情報を保持してしまうと、煩雑になってしまうため、
ステートレスにし、シンプルなシステム構築を行いましょうということ。

つまり、クライアント情報によって処理が変わるということはなく
どのクライアントもあらかじめ準備した処理しか行えない。行わなない。

クライアント情報がないため、処理の選択肢を増やしたり、情報更新をする際には
シンプルにすることで拡張性が高いというメリットもある。

病院の個人カルテのようなものがある状態がステートフルな状態。
プランA、プランB・・・などの選択肢のみで、クライアント情報に依存しない仕組みがステートレスな状態。

### 接続性
1つの地点から様々なページへのアクセスが可能になるということ。
例えば、マイページから設定に遷移出来たり、投稿取得に遷移出来たりするということ。
Amazon EKS on EC2 - Container Insights with enhanced observability

# Amazon CloudWatch Observability EKS アドオン

このアドオンは CloudWatch エージェントと Fluent Bit をインストールし、インフラストラクチャとコンテナのログに関するインサイトを提供します。

- CloudWatch エージェント
  - クラスターノードから CloudWatch に主要なインフラストラクチャメトリクスを送信。
  - CPU、ネットワーク、ディスク、およびその他の低レベルのノードメトリクスをモニタリング。

- Fluent Bit
  - コンテナログをクラスターから CloudWatch Logs に送信。
  - コンテナからのアプリケーションログとシステムログについてのインサイトを収集。


# 利用するためには

Amazon CloudWatch Observability EKS アドオンをインストールします。

また、IAM アクセス許可を付与して、CloudWatch エージェントがメトリクスとログを CloudWatch に送信できるよう`CloudWatchAgentServerPolicy`を付与する必要があります。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Observability-EKS-addon.html


# 設定

今回は、eksctl で [addons](https://eksctl.io/usage/addons/) に追記しました。

```cluster-ec2.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: cluster-ec2
  region: ap-northeast-1
  version: "1.27"

iam:
  withOIDC: true

addons:
  - name: amazon-cloudwatch-observability
    version: v1.1.1-eksbuild.1
    tags:
      team: eks
    attachPolicyARNs:
      - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

nodeGroups:
  - name: node-ec2
    privateNetworking: true
    instanceType: t3.small
    desiredCapacity: 1
    minSize: 1
    maxSize: 2
```

CloudWatch エージェントと Fluent Bit が daemonset としてインストールされていることを確認しました。

```
kubectl get daemonset -n amazon-cloudwatch
```

```
NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
cloudwatch-agent   1         1         1       1            1           <none>          5m27s
fluent-bit         1         1         1       1            1           <none>          5m33s
```

# 動作確認

## CloudWatch > Container Insights 

![スクリーンショット 2023-11-28 16.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/f64dcc4d-e1d5-128c-356f-3ed27f988fa1.png)

## CloudWatch > Container Insights > パフォーマンスのモニタリング

![スクリーンショット 2023-11-28 16.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1780ad1f-ea25-a637-a1b5-2b57950a879b.png)

## CloudWatch > ロググループ

![スクリーンショット 2023-11-28 16.36.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2f67f6d1-b2d2-1ad3-ab4f-170b1e5a282a.png)


# 料金

保存されたメトリクスまたは取り込まれたログごとに課金されるのではなく、観測ごとに課金される。

https://aws.amazon.com/jp/cloudwatch/pricing/


# 確認可能なメトリクス

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-EKS.html


# 参考

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-cloudwatch-container-insights-enhanced-observability-eks/

https://aws.amazon.com/jp/blogs/news/new-container-insights-with-enhanced-observability-for-amazon-eks/
Workato：Connector SDKでカスタムコネクタを作成してCommunity Libraryへ公開する

# はじめに

Workatoには、カスタムコネクタ（Connector SDK）という機能があります。本機能を利用することで、Workato標準で提供されていないコネクタをRuby言語（Rubyサブセット）を用いて独自に開発し、Workato上で利用することができます。

また、Workatoにはコミュニティライブラリという機能があり、Workatoユーザー、あるいはベンダーによって作成されたレシピやカスタムコネクタが公開されています。コミュニティライブラリを活用することで、公開されたレシピをもとにユースケースに応じたレシピを短時間で構築することや、自社で利用するアプリに対応するカスタムコネクタがコミュニティライブラリ上で公開されていれば、独自にカスタムコネクタを開発することなく、それをインストールしてレシピで利用することができます。

今回は、作成したカスタムコネクタをCommunity Libraryへ公開するまでの手順について解説します。なお、カスタムコネクタの開発方法についてはここでは割愛します。

# 手順

## １．コネクタを開発する
Connector SDK上でコネクタを開発します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/554d15da-bedc-f17b-db72-2bca4bdb082b.png)

## ２．「Share」タブをクリックし、「Share version XX」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/48650a28-c7f0-1c49-8b62-df1eeb245cc4.png)

## ３．「Edit」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/406cd9dd-6b5b-d183-0869-9078c50b982f.png)

## ４．コネクタの説明を書きます。
マークダウン形式でカスタムコネクタの説明を書くことができます。このコネクタがどのようなコネクタであるのか、何が出来るのかを分かりやすく記述します。また、日本国外のユーザーの利用も想定し、日本語とあわせて英語による説明も記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/dbb8b674-34e6-615d-c98b-884c4f6fe032.png)

## ５．「Publish connector」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d7d2416d-4e06-19bb-e846-8c2165f496d4.png)

## ６．コミュニティライブラリへの登録情報を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8d440489-ae41-6f77-1add-1176d92e04f7.png)

- App： コネクタと連携するアプリの名称
- Category tags： コネクタに関連するカテゴリ
- Search keywords： 検索キーワード
- Prevent direct installation： 自社サイトを経由してインストールしたい場合に有効化（オン）にする　例：コネクタのソースコードを公開せずにカスタムコネクタをCommunity Library上へ公開したい場合

## ７．Workato developer agreementに同意（チェック）のうえ、「List connector」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/34832b41-ea4d-8322-4af4-b4ad9a77dda3.png)

## ８．審査が行われた後に、コミュニティライブラリ上に公開されます。
審査完了までに２～３日程度かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a21d5a8b-84ec-a123-c4ca-5a100bfe6e14.png)

## ９．審査が完了すると、コミュニティライブラリに公開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/452deaf8-f08e-0c8f-ff20-2c54433d7ee2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c0c655f6-a905-3452-c458-a80c991cd9c5.png)
VTK Reader Cube


サンプルコード
```c++
int main()
{
    std::array<std::array<double, 3>, 8> pts =
    {
        {{{0, 0, 0}},
        {{1, 0, 0}},
        {{1, 1, 0}},
        {{0, 1, 0}},
        {{0, 0, 1}},
        {{1, 0, 1}},
        {{1, 1, 1}},
        {{0, 1, 1}}}
    };

    std::array<std::array<vtkIdType, 4>, 6> ordering = { {{{0, 1, 2, 3}},
                                                     {{4, 5, 6, 7}},
                                                     {{0, 1, 5, 4}},
                                                     {{1, 2, 6, 5}},
                                                     {{2, 3, 7, 6}},
                                                     {{3, 0, 4, 7}}} };
    vtkNew<vtkPolyData> cube;
    vtkNew<vtkPoints> points;
    vtkNew<vtkCellArray> polys;
    vtkNew<vtkFloatArray> scalars;

    for (auto i = 0; i < pts.size(); ++i)
    {
        points->InsertPoint(i, pts[i].data());
        scalars->InsertTuple1(i, i);
    }

    for (auto&& i : ordering)
    {
        polys->InsertNextCell(vtkIdType(i.size()), i.data());
    }


    cube->SetPoints(points);
    cube->SetPolys(polys);
    cube->GetPointData()->SetScalars(scalars);

    vtkNew<vtkPolyDataMapper> cubeMapper;
    cubeMapper->SetInputData(cube);
    cubeMapper->SetScalarRange(cube->GetScalarRange());
    vtkNew<vtkActor> cubeActor;
    cubeActor->SetMapper(cubeMapper);


    // The usual rendering stuff.
    vtkNew<vtkCamera> camera;
    camera->SetPosition(1, 1, 1);
    camera->SetFocalPoint(0, 0, 0);

    
    vtkNew<vtkRenderWindow> renWin;
    vtkNew<vtkRenderWindowInteractor> iren;
    iren->SetRenderWindow(renWin);


    vtkNew<vtkRenderer> renderer;
    renderer->AddActor(cubeActor);

    renWin->SetSize(500, 600);
    renWin->AddRenderer(renderer);

    renWin->Render();
    iren->Start();
    return EXIT_SUCCESS;
}
```
Duneでキャプテン翼ライバルズのトークン価格抽出してみた

fillメディアの大枝です。

今日は、ブロックチェーン上のオンチェーン情報を抽出してデータ分析やグラフ化等が簡単に行える便利ツール、duneアナリティクスを使い、
ここ最近SNSで話題の人気ゲーム、キャプテン翼ライバルズのガバナンストークンの価格推移をグラフ化してみました。

※分散型取引所ユニスワップ上のトレード履歴のみ抽出しているので、実際のチャートとは乖離があります。

https://dune.com/fill_media/captain-tsubasa-rivals

こちらのゲームの場合、ガバナンストークン以外にもユーティリティトークンもデプロイされているので、そちらの分析クエリも追加していく予定です。

なお、私が所属しているfillメディアの編集部では、人気サッカー漫画「キャプテン翼」をモチーフにしたNFTゲーム、キャプテン翼RIVALS（ライバルズ）に関する日本語解説記事を公開しています。

[キャプテン翼RIVALS（ライバルズ）の始め方－ 選手カードNFTでチームを作り仮想通貨を稼ぐブロックチェーン・ゲームの仕組みとは](https://social-lending.online/nft-games/captain-tsubasa-rivals/about-captain-tsubasa-rivals/)

記事では、

- キャプテン翼RIVALS（ライバルズ）のゲームの始め方
- 選手カードの購入方法
- PVE、PVP、それぞれのプレイ手順
- 選手カードNFTのミント方法
- ゲームで稼いだトークンの出金・換金手順
- 選手カードの「リフレッシュ」の仕組み
- スマホアプリ版ゲームへの事前登録方法

等々、同ゲームに関する幅広い情報を掲載していますので、興味のある方は、覗いてみて下さい。
学習曲線から読み取れること

# 学習曲線とは

機械学習における学習曲線とは、trainデータ、validationデータそれぞれにおける学習時のパフォーマンスをプロットしたグラフのことである。

一般的な学習曲線のグラフは横軸がepoch数、縦軸がlossまたはaccuracyとなった折れ線グラフである。

この学習曲線を観察することで学習がうまくいっているか否か、またうまくいかない場合には何が原因かを大まかに把握することができる。

ここでは、よくある学習曲線の形状と、そこから推測されることを説明する。

## Example 1: Underfitting


### 特徴

- train lossが平坦な線を示す。
- もしくは、train lossが収束せず減少し続ける。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787754/edca99f9-7e93-8d51-800e-feb2d94907d6.png)
![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787754/6a7f5e30-97dc-c7a8-25bb-44f472a19c95.png)

### 主な原因とその対策

- 複雑な問題に対して単純なモデルを使用している。（画像分類にロジスティック回帰を用いるなど）
    → アンサンブル学習を採用したり、ニューラルネットワークなどのより複雑なデータを扱うことのできるモデルに変更する
    
- そもそも、学習データに共通するパターンが存在しない。
    → データセットの定義方法を変える
    
## Example 2: Overfitting

### 特徴

- train lossが減少し続ける。
- valid lossが途中から上昇し始める。

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787754/745fda66-2672-dccb-9123-4918e1ce9ab3.png)

### 主な原因とその対策

- 単純な問題に対して複雑なモデルを使用し、データからノイズを拾ってしまっている。
    → データセットに合わせた適切なモデルを選択する。
    → DLを使用している場合はDropout層を追加したり、weight decayを設定する。
    
- データセットの数が不十分で、モデルがパターンを認識できていない。
    → データ数を増やす。
    
- データの量に偏りがある。
    → UndersmplingやOversamplingなどを用いて、データを均一にする
    

## Example3: ****Unrepresentative Train Datasets****

### 特徴
train loss, valid loss どちらもスコアが小さくなっているにもかかわらず、両者の間に大きなギャップがある。

![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787754/e3fc9985-1219-93af-c2a4-dbed918befb6.png)

### 主な原因とその対策

- validationデータに対してtrainデータの数が少ない。
    → train dataの割合を増やす。
    → そもそものデータが少ない場合には、データの水増しを行う。

## Example4: ****Unrepresentative Validation Datasets****

### 特徴

train loss は収束しているように見えるが、valid loss は train loss の値の周辺でノイジーな動きをしている。

![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787754/b9d19275-39a9-4503-7d27-547c902dd110.png)

### 主な原因とその対策

- trainデータに対してvalidationデータの数が少ない。（Example3の逆）
    → validationデータの割合を増やす。
    → そもそものデータが少ない場合には、データの水増しを行う。
    
## Example5: Good Fitting

### 特徴

- train loss, valid loss ともに低い値で収束している。
- 回数を重ねるにつれて両者のギャップが小さくなっている。

![Untitled 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787754/0ffb4dac-1b87-532d-f966-3e654b9215df.png)

**【参考】**
[How to use Learning Curves to Diagnose Machine Learning Model](https://machinelearningmastery.com/learning-curves-for-diagnosing-machine-learning-model-performance/)
[Learning Curve to identify Overfitting and Underfitting in Machine Learning](https://towardsdatascience.com/learning-curve-to-identify-overfitting-underfitting-problems-133177f38df5)
プログラムの「プ」の字が書けるようになるために意識した5つのこと


医療系の専門学校を中退して、プログラムのプの字も書けない状態からIT企業に就職しました。現在はエンジニア歴5年目です。エンジニアになりたての時により早くプログラムが書けるようなるために意識していたこと・心掛けていたことを紹介します。
同じような境遇でスタートした方や、しようとしている方の何かのヒントや・参考になれば幸いです。

## 1.とにかくコードを書く、わからなくなったら図式化する

まずは、なんでこう書くのかとか考えずに、こう書くもの！と身体に覚えさせる感覚でとにかくコードを書くようにしてました。(考える前に指がカタカタと動き出すくらいに☜大げさ)

なのでエンジニアスタートして、1年くらいはソースレビュー時に「なんでこう書いたの？」と質問されても、「うーん、感覚的に？⭐️」みたいな感じでした。今思えばめちゃくちゃ危険ですね。

もちろん、最初から理論を理解できて、書ければそれに越したことはないですが、私の場合、それができなかったのでとにかく反復練習で身体に覚えさせました。
今すぐに全部を理解しようとは思わずに、まずは知識の"点"をたくさん作るようにしていました。そうすると私の場合は3年目くらいの時に「あれはそういうことだったのか！」とか「だからこう書いているんだ！」と点と点がつながっていくような感覚がありました。

そして、処理がどう流れていくかイメージを掴みやすくするために、よくコードや仕様を図式化してました。
[draw.io](https://app.diagrams.net/)や[Astah](https://astah.change-vision.com/ja/)を利用して綺麗に描くときもあれば、とりあえず作法は気にせずにメモ帳に殴り書きで描く時もありました。最初はやはり**イメージを掴む**ということが大事で、これができればコードもチャカチャカかけるようになるのかなと思います。


## 2.何かわからないけど、動いたらとりあえずめちゃくちゃ喜ぶ

何事も辛いことばかりだと続かないと思っているので、まずは開発するにあたって自分なりの喜びややりがいを見つけることは大事だと思います。
私の場合は、初めてプログラムを書いてコマンドプロンプトに"Hello World"が表示された時に、とてもとても嬉しかったです。なのでどんな時も一旦ソースの良し悪しは置いといて、動いたらスキップして喜びました。
気持ちをリセットしてから、ソースコードの良し悪しを考え改善できると、さらに大きな喜びが待っていると思います。

## 3.人のコードをたくさん読む(見る)

学ぶことは真似ることから始まると言われるように、まずはいろんな人がどのようにコードを書いているのか知ることが大事だと思います。
当時はWEB上に転がっているコードをよく見ていましたが、今思えば会社ごとにコーディング規約なども異なりますし、先輩方が書いたコードをたくさん見ていく方がいいのかなと思います。今でも合間時間などに自プロダクトのコードをPRで見ています。
最初は訳わからなくても、人のコードを見ていくうちにだんだんコードを読み解けるようになり、こう書けばいいのかという知識になっていって、気づいたら自分の知識になっていると思います。

## 4.質問をする時には頭の中で整理してから質問をする

はじめは自分がわかっていないこともわからずに猪突猛進的に質問をしていたので、

上司「何がわからないの？」
私「....何がわからないんでしょう。」
とただの時間泥棒になっていました。

調べたらわかるじゃんとも思いますが、この時はそもそもなんて調べたらいいのかわからない状態なのでこれも時間を溶かすだけになってしまっていました。
そのため、10分自分で調べてわからなかったら、人に聞くと決めて、聞くときには⇩をまとめてから聞くようにしました。

`1.実現したいこと`
`2.うまくいかないこと
    エラーが出ているのであれば、エラーの発生箇所やエラー内容`
`3.自分で調べてわかったことや、考察`

人に聞く(伝える)ためには頭を整理してから聞くため、聞こうと思ってまとめているうちに自分の中で閃いたり、話しているうちに自分の間違いに気付けたり、そういうことも多々あると思うので、まずは頭の中で整理してから質問をするといいと思いました。

## 5.プロフェッショナルという自覚をもつ

これは今でも一番大事にしてます。
エンジニアなりたての頃は、何か問題があっても**初心者だから**という言い訳を自分の中でよくしていました。
今思えば、入社して半年くらいは、"仕事"をしているという感覚ではなく"勉強している"という感覚だったと思います。
しかし、クライアントから見ると初心者が書いたコードとか熟練者がコードかとかは関係なく、「会社」からリリースされているもので、その**責任**は会社が担うものとなります。
その自覚があるかないかで仕事への取り組み姿勢に雲泥の差が出ると思います。

**私はプロフェッショナル**という気持ちで仕事をすると、時間を効率よく使おうと努力しますし、いいコードを書くために"勉強する"ようになるため、この心の持ちようで仕事の効率も、技術のキャッチアップ力も向上しました。
[Terraform Tips] Local Valueの値によってループでの処理を制御する

どちらかというと備忘のためなので、雑な記事でご容赦ください。

# Terraformでよくあるループ処理

```
locals {
    clouds = {
        aws = {
            company = "amazon"
            contury = "us"
        }
        azure = {
            company = "microsoft"
            contury = "us"
        }
        sakura = {
            company = "sakura-internet"
            contury = "jp"
        }    
    }
}

resource "sample_resource" "cloud_vender" {
    for_each = local.cloud

    description = "this is ${each.key} produced by ${each.value.company}"
    .....
}

```

Local Valueに作成するリソース分の変数を定義して、リソースをfor_eachでループさせることにより類似したリソースを複数作る方法です。

上の例だとcloudsにて定義された"aws", "azure", "sakura"の３つ分のリソースが作成されます。

# こういうケースありませんか？

ではcountry="us"となっているものだけ、リソースを作成したいという場合はどうすればいいでしょうか？

こうしましょう。

```
resource "sample_resource" "cloud_vender" {
    for_each =  { for k, v in local.clouds : k => v if v.country == "us" }

    description = "this is ${each.key} produced by ${each.value.company}"
    .....
}
```

for文とifによるフィルタリングを利用することで、country="us"の値を持つ変数だけリソース作成の対象になります。


for文の中をカスタマイズすることで、色々応用ができます。


# 参考

[for Expressions
](https://developer.hashicorp.com/terraform/language/expressions/for)
[]()
【Flutter】ウィジェット

[chatGPT に立ててもらったスケジュール](ceecf4a987d3f75b6d93)に準じてウィジェットを勉強。
> - Day 2: Flutterウィジェットの学習
>     - Flutterのウィジェットツリーの概念を理解する
>     - レイアウトウィジェットの使用法を学ぶ
# Flutterのウィジェットツリーの概念
Flutterのウィジェットツリーは[【Flutter】ツリー構造](0a420931a718dc98fa7f)でざっくり予習済。
# レイアウトウィジェットの使用法を学ぶ
主要なレイアウトウィジェット
- Container:
  - Container ウィジェットは、高さ、幅、マージン、パディングなどを指定できる。
  - 子要素を一つだけ持てる。
  - サンプル
    ``` dart
    Container(
        width: 100.0,
        height: 100.0,
        padding: const EdgeInsets.all(10.0),
        color: Colors.blue,
        child: Text('Hello'),
      )
    ```
    - margin や paddingの書き方が不思議
      - `EdgeInsets`は余白を付けるときに使うらしい
          |種類|指定できる|
          |---|---|
          |`EdgeInsets.all()`|四辺全部に同じ余白|
          |`EdgeInsets.symmetric(vertical, horizontal)`|verticalに上下の余白、horizontalに左右の余白|
          |`EdgeInsets.fromLTRB(left, top, right, bottom)`|四辺にばらばらの余白|
          |`EdgeInsets.only(top: 10.0)`|上辺のみに余白 topをleft,right,bottomに変えることでそれぞれの辺のみに指定可能。`,`区切りで複数指定もできる。|
- Row および Column:
  - `Row` は横並び、 `Column` は縦並びで子要素を並べられるウィジェット。
  - 子要素は順番に配置でき、必要に応じて拡張される。
  - サンプル Row
    ``` dart
      Row(
        children: <Widget>[
          Text('この文は'),
          Text('横に並ぶ'),
        ],
      )
    ```
  - サンプル Column
    ``` dart
      Column(
        children: <Widget>[
          Text('この文は'),
          Text('縦に並ぶ'),
        ],
      )
    ```
- ListView:
  - `ListView` ウィジェットはスクロール可能なリストを作成する。
  - サンプル Column
    ``` dart
      ListView(
        children: <Widget>[
          ListTile(title: Text('Item 1')),
          ListTile(title: Text('Item 2')),
          ListTile(title: Text('Item 3')),
        ],
      )
    ```
- Stack:
  - Stack ウィジェットは、子要素を重ねて配置できる。子要素は位置やサイズを調整できる。
  - サンプル Column
    ``` dart
      Stack(
        children: <Widget>[
          Positioned(
            top: 10.0,
            left: 10.0,
            child: Text('Hello'),
          ),
          Positioned(
            bottom: 10.0,
            right: 10.0,
            child: Text('World'),
          ),
        ],
      )
    ```
# 他にもウィジェット
  |種類|内容|
  |---|---|
  |Scaffoldウィジェット|HTMLでいうbodyの役割を担う|
  |Textウィジェット|テキストを出力する|
  |TextFieldウィジェット|キーボード入力を受け付ける|
  |Column, Row ウィジェット|整列で使う|
  |Buttonウィジェット|ボタンの役割を担う|
  |Imageウィジェット|画像を出力する|
# 参考
- [【Flutter】Widgetレイアウトの超基本！ | Zenn](https://zenn.dev/takuowake/articles/9fe0b16db6cdbe)
- [EdgeInsetsの使い分け | Qiita](https://qiita.com/Toitu_Prince/items/c852d581fae3fa2fe0c5)
- [Flutterの将来性は？メリット・デメリットや特徴も紹介！](https://tech.hipro-job.jp/column/5874)
[Ruby on Rails]既存のテーブルにカラムを追加するためのマイグレーションにえらい苦戦した話

## 経緯
初任教育研修で、既存のタスク管理アプリに機能を追加する際に苦戦したときのメモです。
タスク管理アプリに、タスクの期限機能を追加開発する際に、既存のtasksテーブルにduedateカラムを追加しようとしていました。

## db:migrateコマンドの実行
まずはTasksテーブルにduedateカラムを追加するためのマイグレーションファイルを作成するためにgenarateコマンドを実行します。

```terminal
rails g migration AddDueDateToTasks duedate:datetime
```
<br>

これで自動的に以下のようなマイグレーションファイルができました
```Ruby
class AddDueDateToTasks < ActiveRecord::Migration[7.1]
  def change
    add_column :tasks, :duedate, :datetime
  end
end
```

## マイグレーションファイルの編集の際に陥った勘違い

まず、自分が勘違いして書いた間違ったコードがこちら
```Ruby
class AddDueDateToTasks < ActiveRecord::Migration[7.1]
  def change
    add_column :tasks, :duedate, :datetime, null: false
  end
end
```

duedateのnull falseにしたいから、テーブル生成のときと同じ感覚でここに追記してそのままrails db:migrateを実行してエラーを連発していました。

<br>
私と同じ勘違いをしている方のために説明すると、このコマンドでは既存のデータにduedateカラムが追加された際に、それが空になってしまうので矛盾が生じていたというものでした。


<br>
<br>

そしてその理由がわからないままdb:rollbackとdb:migrateを繰り返して、DBをぐちゃぐちゃにして時間を溶かしていきました。。。。

もし同じように苦しんでいる方がいましたら（本番環境でなかったら）以下のコマンドを実行して次をお読みください。既存のデータが全部なくなるので注意。
```
rails db:reset
```

## マイグレーションファイルの編集（正解）
私の場合の正解はこんな感じでした。
```Ruby
class AddDueDateToTasks < ActiveRecord::Migration[7.1]
  def up
    # 最初にduedateカラムをnull許容で追加する
    add_column :tasks, :duedate, :datetime, null: true

    # 既存のレコードに現在の時間を設定する
    execute "UPDATE tasks SET duedate = NOW()"

    # null: false制約を適用する
    change_column :tasks, :duedate, :datetime, null: false
  end

  def down
    remove_column :tasks, :duedate
  end
end
```

<br>

基本的に継続開発を考えた際にはupとdownで記載するべきと知りました。
参考にした記事
[【Ruby on Rails】changeとup・downの使い分けについて](https://qiita.com/tkr_ld/items/f1c0b3bad6a49bd7894a)
<br>

また、先ほどの勘違いから流れを修正しました。
1. まずはnullを許容して新しくduedateというカラムを作成
2. 既存のレコードに対してduedateを記載
3. null falseを適用する


このように修正することで無事に
```
rails db:migrate
```
が実行できて既存のtasksテーブルにduedateカラムを追加することができました。

## up.downで記載したからレビューを受けた後に楽に修正できた
追加機能を実装してレビューを受けたら
『カラム名をduedateからdue_dateに変更してください』
というレビューを受けました。

<br>
カラム名を変更するためにまた、マイグレーションファイルを作成するのかと思いましたが、downによりロールバック時の挙動を定めていたので、

```
rails db:rollback
```
としてから、
マイグレーションファイルをdue_dateに修正して、
```Ruby
class AddDueDateToTasks < ActiveRecord::Migration[7.1]
  def up
    add_column :tasks, :due_date, :datetime, null: true

    execute "UPDATE tasks SET due_date = NOW()"

    change_column :tasks, :due_date, :datetime, null: false
  end

  def down
    remove_column :tasks, :due_date
  end
end
```

もう一回rails db:migrateを実行するだけでテーブルの修正は完了できました。よかった。

## まとめ
ということで機能追加のためにテーブルにカラムを追加することができました。誤っている部分がありましたらご指摘していただけると大変助かります。
何度転生しても情シスになってしまう！

この記事はHRBrain Advent Calendar 2023カレンダー3の4日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain


## はじめに
HRBrainで情シス・セキュリティを担当している@hrb-nagasakiです。
2023年（今年）にいわゆるアルムナイ入社というものをしており、巡り巡ってまた情報システムやセキュリティと向き合っています。

主に全社横断のセキュリティ対策を担当しています。
業務改善やこぼれ落ちたボール拾いもやっているなんでも屋です。

ところで、情シスにおいて大切なことはなんでしょうか？
より少ないコストで運用業務を回すことでしょうか？堅牢な社内IT環境を構築することでしょうか？
どちらも正解だとは思いますが、ここでは「愛」と表現します。
愛ですよ。アイ。

ということで、今回は転生した情シスの社内の問い合わせ対応はアイだということをお伝えします。
~~某作品のように、生まれ変わったら推しのアイドルの子供になってた。みたいな展開は存在しませんでした。残念。~~

## 問い合わせ対応について
一般的にはヘルプデスクと呼ばれたりします。
Slack有料プランであればワークフローが使えるので、現状はITSMツールを利用せず、ワークフローで運用しています。問い合わせしたデータは、Googleスプレッドシートに連携・蓄積でき、ダッシュボードはLooker Studioで構築できるので、コスパ良く問い合わせ管理したい場合はおすすめです。実装方法は需要があれば別途書くかもしれないし、書かないかもしれません。

## アイって？？？
HRBrainでは（HRBrainに限らないのですが）毎日多くの問い合わせが、ユーザー（従業員）から申請されます。

* 問い合わせ数/日 = 約5件
* 問い合わせメンバー数 = 3名

※参考：2023/12時点のHRBrainの従業員数は150名超

https://speakerdeck.com/hrbrain/introduction?slide=23

問い合わせ数は、基本的には従業員数の増加に比例していきます。今後のことを考えて問い合わせ業務は効率化しないといけません。

FAQや社内マニュアルを整えるのが対応の定石ですが、ここはあえて問い合わせする人（=申請者）に心がけてほしいことを2つ書いてみたいと思います。これこそが私なりの愛だ。

~~申請フォームを見直せ？それはそう。~~

**1\. 抱えている問題を正確に示す**

:::note warn
* 「PCの調子が悪いです」
* 「○○のツール使いたいんですがセキュリティ的に使ってもいいでしょうか？」
:::

よく聞かれます！
お困りなんですね！それは大変ですね！

って思ってるんですが、やはり細かくヒアリングしないと妥当性が判断できません。

:::note info
* 「web会議ツールの動作が重く、お客様との商談に支障が出ています。アプリとPCの再起動は試しました。他にできることはありますか？」
* 「開発業務の効率化のために、○○のツール使いたいんですが、ファイルアップロード機能がついており、セキュリティリスクがあるかもしれません。効率が上がるため導入したいのですが確認してもらえませんか？」
:::

おっ、先ほどよりわかりやすくなりましたね。

細かく伝えるのは面倒だと思う方もいるかもしれませんが、結果的に意思疎通が早く行えるようになって問題解決が早まる可能性も高いです。

何に困っているかを教えてもらえると、業務上にどんな影響が出ているかの想像もつくので、より解決のスピードを上げることもできます。お問い合わせの際は、是非困っていることを具体的に伝えるようにしてみてください！


**2\. 緊急性や優先度の明示する**

:::note warn
「いつまでに対応すれば良いでしょうか？」「なるはやで！」
:::
あるあるコミュニケーションですね！

なるはやと言いたくなる気持ちよくわかります。
なんなら今すぐに解決したいですよね。

でもちょっと考えて欲しいです＞＜
他の問い合わせ対応やそれ以外の業務があるので、毎回爆速で対応する体制を維持するのは結構むずいのです。
問い合わせ対応してたら1日が溶けてた。なんてこともあったのです。

:::note info
* 「お客様との期日が○○日までなので、余裕をもって××日までにライセンス発行していただいてもよいでしょうか？」
* 「打ち合わせが○○日の××時にあるため、事前に資料のアクセス権限をいただいてもよいでしょうか？」
:::

なるほど！これならなるはやよりイメージがつきますね！

ここまで読んでいただいた方はお気づきですね？
これは情シスの社内問い合わせだけでなく、業務上のコミュニケーション全般で大事ですね。
小難しいこと言わず「愛」を大事にすればみんな働きやすくなると思うので、是非意識してみてください！

## 最後に
転生モノは面白いのですが、現実の転生はそんなに甘くありません。
少しでも快適に働けるよう、コミュニケーションは気持ちよく取りましょうね。というお話でした。

あ、採用も全方位募集中です！

https://www.hrbrain.co.jp/recruit
パスワード作成 (paizaランク C 相当)

https://paiza.jp/works/mondai/string_primer/advance_step6

>K さんは paiza のアカウントを作成することにしました。そのためには、パスワードの設定が必要>なことがわかりました。
>そこで K さんは忘れないように、次のようなルールにのっとって N 文字のパスワードを設定するこ>とにしました。
>
>・ ルール
>K さんは N 文字のうち、 Q 文字だけ覚えておく文字を決めておく。
>具体的には n_i 文字目を c_i とだけ決めて、残りの全ての文字を C にする。
>
>K さんの設定したパスワードを当ててください。

という問題。

```py
N = int(input())     
Q = int(input()) 
for i in range(Q):
    A =[list(map(str,input().split()))]
C = input()
for i in range(1,N):
    if i == A[i-1][0]:
        print(A[i-1][1])
    else:
        print(C)

```
要するに、配列Aに条件を入れて、その後N回分ループして、Aのインデックスと同じだったら、Aの要素を出力、違ったらCを出力するということを考えた。

だが、これだとエラーになる。
なぜかというと、たとえば、上の場合、i=2のときA[1][0]を出力するわけだが、Aにはその要素は存在していない。つまり、条件配列は最後のインデックス番号まであるとは限らないため、インデックスがループを回る前に尽きてしまってエラーになるからである。

他にアイデアが見つからず30分を過ぎてしまいギブアップ。

答えは後ほど。

まず、配列は要素数をかけることで、型、要素数があらかじめ入った配列ができる。

```py
n = [0] * Q
c = [""] * Q
```
ここで、ｎにはi文字目を、ｃにはc_i を登録。values配列に入った値を使う。

```py
n[i] = int(values[0]) - 1
c[i] = values[1]
```
そして、ansという配列を作るパスワードのN文字分、全部Cで埋めてしまう。

```py
ans = [C] * N
```
この時点で
ans = [C,C,C,C,C,...C)となっているわけだ。

で、ここからN回分cをループさせ、
該当するものはn[i]番目のところなので、c[i]を上書きさせる
ans[n[i]] = c[i]

そして結果を出力、というわけだ。

なるほど。。。。
まだまだでした。。。

配列の作り方や、配列の要素の出し方など、勉強しておきます。。。



```py
N = int(input())
Q = int(input())
n = [0] * Q
c = [""] * Q

for i in range(Q):
    values = input().split()
    n[i] = int(values[0]) - 1
    c[i] = values[1]

C = input()

ans = [C] * N
for i in range(Q):
    ans[n[i]] = c[i]

print("".join(ans))

```
Reading : Kubernetes Resource Configuration Dilemma

article: https://levelup.gitconnected.com/kubernetes-resource-configuration-dilemma-bf2e7ca236b0
In this article, there are two reference article worth to read.
https://engineering.indeedblog.com/blog/2019/12/unthrottled-fixing-cpu-limits-in-the-cloud/
https://engineering.indeedblog.com/blog/2019/12/cpu-throttling-regression-fix/
とりあえずEXPLAINしたときに確認するポイント！

## EXPLAINとは
クエリを実行する際、ボトルネックとなっているポイントがどこにあるかを確認するために使用されます。
出力される項目を理解することで高速なクエリを作ることができます。

## 実行方法
確認したいクエリの前に`EXPLAIN`を付けるだけ

## このtypeが出ていたら見直し！
### ALL
見直し推奨！
フルテーブルスキャンが行われている。とても遅い。

### index
ALLよりは早いがフルインデックススキャンされている。
数行だけだったら問題ないが、クエリが返す行数が多い場合、パフォーマンスが悪い。

## Extraを見る！
### Using filesort
結果をソートするために一時テーブルでのファイルソートが発生している。
クエリの`ORDER BY`でインデックス使われてない可能性があるのでパフォーマンスが悪い。

`ORDER BY`でインデックスを使用する。

### Using temporary
クエリの実行中に一時テーブルが作成されていることを示している。
`JOIN`、`ORDER BY`、`GROUP BY`、`DISTINCT`などを使用すると発生することがあり、
一時テーブルの作成することでパフォーマンスのボトルネックになる可能性がある。

`tmp_table_size`や`max_heap_table_size`などの設定を調整することで解決する。
また、`ORDER BY`、`GROUP BY`を使用している場合は、インデックスを使うようにする。

## クエリを早くするには…？
- 否定を使わない
`<>`、`!=`、`NOT 〇〇`を使うとインデックスが使用されず、フルテーブルスキャンが行われてしまう。

- SELECTの`*`は使わない
必要なカラムのみ指定したほうが早い

- DISTINCTやUNIONなどの重複排除は使わない.
重複排除を行う際、一時テーブルが作成されるので避ける。

- 適切なインデックスを使用する
どのインデックスが使用されているか確認するには`EXPLAIN`の`possible_keys(使われるインデックス候補)`および`key(使われたインデックス)`を見る。

### 参考記事
- MySQLのEXPLAINを徹底解説!!
https://nippondanji.blogspot.com/2009/03/mysqlexplain.html

- EXPLAINのExtraの項目ちゃんと理解している..?
https://zenn.dev/miya_tech/articles/c1b9ca01e90a7b

- MySQL SlowQueryの対処法
https://qiita.com/nikadon/items/2f66b447ed6d3b26d78e

- <MySQL>クエリチューニングによる速度改善34項目
https://qiita.com/ichi_zamurai/items/fdbe3872a505c22ee431

- SELECTをアスタリスクと列指定したときの速度差
https://kagamihoge.hatenablog.com/entry/20130913/1379071941
【Unity 】Collab service is deprecated and has been replaced with PlasticSCMが一生出続ける！！

<h1>Unityでただ新規プロジェクトを立ち上げただけなのに……</h1>

![エラーメッセージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500311/2f125500-680d-a66d-a9e4-cc3085538494.png)

なんか謎にエラーが出続けちゃう！！
何事！？！？！
ざっくり訳すと

<blockquote data-sourcepos="9:1-9:89"><p data-sourcepos="9:3-9:89">Collab サービスは非推奨となり、PlasticSCM に置き換えられました。</p></blockquote>
<blockquote data-sourcepos="9:1-9:89"><p data-sourcepos="9:3-9:89">
アサーションに失敗しました</p></blockquote>

と言われても、「Unityもプログラミングもなんもわかんね。」な私には何が何だか……
ということで調べた。

<h1>CollabとかPlasticSCMってなに</h1>

CollabもPlasticSCMもUnityprofectを複数人で共同編集するための仕組みらしい。便利！
ただ私の場合、一緒に共同編集するお仲間なんていないので関係ない……（悲しい）
ずっとエンドレスで出続けるエラーメッセージの存在が気持ち悪いだけ……

<h1>エラー回避！</h1>

同様のエラーが出ていて、CollabもPlasticSCMも使わない人の記事を参考に
「Packages > manifest.json」から<code>"com.unity.collab-proxy": "1.6.0",</code>を
削除してみたけれど解決しない……ので、いろいろ触ってみたらめっちゃ簡単なことだった。<br>
![Unity Hub 3.6.1 2023_11_28 15_21_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500311/054f2bc9-eeef-bb72-0c18-eeba751a41b1.png)

<strong>「Unity Cloudとの接続を解除」</strong>するだけ。
解除してプロジェクトを再起動すれば、うんともすんともエラー吐かなくなってるはず。


<h2>参考</h2>

https://qiita.com/segur/items/0ce6876a8ea83dc58431

https://discussions.unity.com/t/collab-collab-service-is-deprecated-and-has-been-replaced-with-plasticscm-assertion-failed-on-expression-m-channelaccessleaseendtime-0-0/314155
【re:Invent 2023】EC2のReserve GPUのセッションを聞いてきた

re.Invent 2023 の、「Reserve GPU capacity with Amazon EC2 Capacity Blocks for ML」というセッションを受けたので、まとめておきます。（英語のリスニングが得意ではないので間違った解釈が入っているかもしれません。都度修正します）

# Capacity Blocks とは
Capacity Blocksは、機械学習（ML）ワークロードに特化したリソース予約システムで、高性能なGPUインスタンスを将来の特定の日に予約して、機械学習（ML）作業に利用することができます。↓の赤枠が今回追加されたやつですね。

![20231127_114559548.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/241fd867-467e-bc88-e068-fb9ff85b2b30.jpeg)

コンソール↓（リージョンはオハイオだけ？？そう言ってた気がする・・・）

![スクリーンショット 2023-11-27 18.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/4e289f0a-4a35-dca0-3682-cf0c4e13b43b.png)

# 何がいいのか
必要な時間分の料金のみを支払うので、基本的にはコスト削減になります。
従来の予約オプション（オンデマンドキャパシティー予約 + Savings Plans）で余分となっていたキャパシティーや、どのくらいコストが削減されるのか見せてくれました。


## 従来のキャパシティー
![20231127_115122647.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/beed8e59-a2ec-4897-76d3-dee0e766eb3c.jpeg)


## Capacity Blocks(必要な時間分の料金のみを支払う)
![20231127_115134036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/3623eeea-1429-1ee5-09d1-736996511427.jpeg)


## コストの比較
![20231127_115400311.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/fe16117f-5f11-eaac-19a5-0caf16b4a8b8.jpeg)

予約したキャパシティーを使う期間が長ければ（100%に近ければ）Capacity Blocksの方が高くなりますが、そうでない場合に削減できています。

# 操作してみた
リージョンを`オハイオ`にする。
EC2のコンソールを開き、サイドメニューから`キャパシティーの予約`をクリック。
必要な情報は以下。
- 予約するインスタンス数
- 継続時間（購入したい期間）
- 日付（いつからいつまで）

![スクリーンショット 2023-11-27 21.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/4f3295d4-9fd0-a39e-f627-f1eabd634752.png)

`キャパシティブロックを検索`を押すと、前払い料金が確認できます。`次へ`

![スクリーンショット 2023-11-27 21.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/9e123a36-7015-f71d-f19b-5870868508a8.png)


タグは今回は何も設定しません。`次へ`

![スクリーンショット 2023-11-27 21.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/76b014dd-8c63-c2bb-ac91-51eadae6de5d.png)

確認画面で`購入`を押すと、予約が完了します。

![スクリーンショット 2023-11-27 21.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/e28c3764-3b37-ea7b-4472-6c189d32bea4.png)
![スクリーンショット 2023-11-27 21.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823803/da94a383-6c7f-eb2a-8b38-1386f2e9f064.png)
日報の書き方

開発チームへのメモとして、日報の重要性と効果的な書き方についてまとめます。この内容は現在の実践例に基づいていますので、フィードバックがあれば幸いです。RRチームはこれに従って日報を作成してください。

# 前提

フルリモート開発チーム

# 日報の意味

- 日報は活動のハイライトを伝え、リモート環境で**特に**重要なアウトプットです。
- 日報作成は時間の無駄ではなく、業務の整理と次の日の計画に役立ちます。
- 日報は書く人とフィードバックをする人のセットで意味を成します。定期的なフィードバックでコミュニケーションの質が向上します。


日報書く時間は無駄とか、そんなこと高給取りにやらせるのか、みたいな声もありますが。コツを掴めば負担にもならなく、さらにいうと自分の業務内容が整理され、次の日もっとどうするべきかなど整理整頓できていいものになると思っています。　 

また、日報なんて書いても読まないよ、という声も聞こえますが、ごもっともで、日報読んでフィードバックする気がないなら、日報の意味は半減だと思います。それでも書くことに意味があると思いますが、日報は書く人とフィードバックする人でセットになります。毎日読む必要はないですし、毎度フィードバックする必要もありませんが、定期的に日報を見直してフィードバックすることで、お互いのコミュニケーションの質が俄然上がります。

## 日報の書き方

結論から言うと、日報は業務の最後にまとめて書くのではなく、まず日報書く準備を業務前にしてから、業務中に少しずつ書いていく、ちょっとづつアウトプットしていく癖をつけることが大切です。

## 業務を始める前に

- KPIやOKRなどの目標を確認し、明確な目的意識を持って業務に取り組みます。
- その日の業務予定を書き出し、可能であればチケット番号も記載します。

KPI、OKRなどの目標を確認する（組織としてなければ、自分で設定）。なんとなく業務は始めるのも、やってしまいがちですが、毎度どこを目指して業務しているのか、確認することをお勧めします。自分が決めたゴール以外のへの道以外は無駄道と思うぐらいのマインドがいいと思います。

そして、今日の業務で行うこと（予定）をまず書ききます。タスクをチケット管理できている場合は、チケット番号なんかもあるといいです。　

## 業務中

なんの問題もなく業務や開発が進めば、特に書くことなく業務終了まじかまで日報に触れなくて大丈夫です。　ただ、予定通りに物事がいかなかった場合はしっかりと、どうして予定通りに進まなかったのか記載しましょう。

例えば、
**そもそもタスクに対しての見立てが甘かった**　→ 今度はちゃんと見立てよう、見立てる力をつけよう、そのためにはどうすればいいのかアクションプラン考えみる、または相談してみる。

**予定外のタスクが入ってきた** → これはこれでウェルカム、でもそれがなんで、業務開始時に予定していたものよりも大切なのか。単純に入れ忘れたのか、であれば、忘れなうようにするためにはどうするのか、このアクションプランを記載してみる。　横槍刺されたのか、横槍刺された場合は、どうやってそう言うものに対して準備ができるのか、他責ではなくできるだけ自分でできることを考えてみる。ここでは全体の出力を重視する、確かに横槍はいやだ、でも全体の出力を上げられるならよしとする。ただ、その胸日報に記載しないと、チームは理解してくれない、理解してくれないだけじゃなくて勘違いされる。

**やる気が上がらなかった、効率が上がらなかった** → 疲れていたらやる気は出ない、これもしょうがない、こう言う時もある、でも今後どうやってメンタルも含めたケアをするべきなのか、これも考えてみてアクションプラン。　効率が悪かった場合はどうやったら効率が上がるのか考えてみて記載する。　業務前に体調万全に整えるのがプロフェッショナル。

このように、**書くことが大切**です。自分は手書きをお勧めしますが、電子でもなんでもOKです。思っていることを出力することが大切です。出力されるタイミングである程度整理されます。出力することは目的でなく手段、整理することが目的なのです。

# 業務終了10分前、5分前

自分は５分前で十分だと思いますが、余裕を持ちたい方、もしくは思うことがたくさんある時は１０分前に。ここでも、振り返ること自体は手段であり、目的は明日、または次回の業務開始の時のアクションプランが明確になっていること。明日だけでなく、その次の日も含めて中長期的にやらなくてはいけないことを整理する時間だと思ってください。

# テンプレート

こちらをご利用ください。ここから必要な項目などアレンジしていくことをお勧めします。

日付
名前
--
業務開始時：　
業務開始時間、何時何分
今日やることはコレ

--
業務中：
予定通りにいかなかったこと、なぜいかなかったのか、そうならないためのアクションプラン。

--
業務終了前：
業務終了予定時間、何時何分
予定通り行ったか、YES / NO
今日の気付き、アクションプラン

次回の業務開始予定はX月X日X時スタート予定。次回業務時の予定ざっくりとここに記載

--
その他、回答して欲しい事など
"4D"ー言語であり、開発環境であり、DBであり、IDEでもある歴史ある謎技術ー

あなたがここに辿り着いたということは、おめでとう。あなたも私と同じく「"4D"って何？」と問う探究者の一人なのでしょう。

ITエンジニアは様々な技術に触れますが、4D（4th Dimension）ほど初見で何がなんだかわからない技術も珍しいです。その主な理由は「何でもできすぎて、どこに分類していいのかわからない」こと。

2023年11月28日現在、Qiitaには「4d」タグのついた記事は（たった！）8記事あり（しかも半分くらいは違う「4D」の記事）、その中に有識者の方が書いた4Dの基本的情報の解説があります。

https://qiita.com/is3to4/items/d8cb52c3fe5c840b9591

> 4Dがどんなものか想像できない人には、Access + VBA + SQL Server + Visual Studio + Phpという説明をします。つまり、プログラムと実行環境とデータベースとIDEその他が全部一体化しちゃっています。
> 
> 他のサーバー、ミドルウェア、その他製品と比べてどこが良いかと言うと、、、
> 
> 開発のスピード
> 環境構築・配布の容易さ
> でしょうか。

無茶苦茶ですね。そんなことが可能なのでしょうか？　しかし、どうやらその通りなようです。

<h2>4Dはローコード開発実行環境？ ではない</h2>

私は現在株式会社治郎吉商店様の「4Dアプリ開発ガイド」をチュートリアルとして学習を進めており、何度か通読して触った現在の感触としては 「これはローコード開発実行環境なのでは？」 と感じています。

過去に触った技術の中で一番似ているな、と感じたのは「RPGツクール」でした。あれもゲームを作るためのローコード開発実行環境と呼べますが、同じようにGUIを駆使して、あまり実コードを意識せずにアプリをサクサク作っていけるのが4Dの強みなようです。

実際、普段使う際には独自言語としての4D言語でプログラミングを行いますが、プラグインを作る際にはC言語で実装することになります。また4D言語は一般的なコーディングよりも短めの行数・文字数でフロントエンドからバックエンドまで実装できるようです。

テンプレートなら一瞬で実装できるし、そもそも非エンジニアが業務システムを作る、ということまで想定することもできると。

約1ヶ月後の追記：
もう少し深く学んだ結論としては、「ローコード開発実行環境」は流石に違うかな、という印象になりました。バリバリコードを書くので。

「データベース特化型のオールインワン言語＆環境」という印象が強くなりました。入出力フォームやストラクチャー(テーブル定義)をGUIで設置して管理したりしつつ、4D言語でもSQLでも制御できます。4Dサーバーを立ててそこに多数の4Dクライアントからアクセスもできます。

<h2>4Dの歴史と規模間</h2>

歴史に関しては意外と深く、1984年に初期版がリリースされました。
ChatGPTに4Dについて質問すると、日本での圧倒的知名度の低さに反して流暢に答えてサポートしてくれるのですが、これは英語版Wikipedia記事などが充実していることに由来するのでしょう。

https://en.wikipedia.org/wiki/4th_Dimension_(software)

4Dは世界的に展開している技術であり、日本よりも他国でのシェアの方がかなり大きいようです。しかし日本支社もあり、日本語版のHPもあります。

https://jp.4d.com/

キャッチコピーは「4D: ビジネスアプリ向けの速いプラットフォーム」。

<h2>4Dの気になる点</h2>
現在の印象：

- バック/フロント共に凝った独自性のある開発には向かない
- 大規模開発にも向かない

しかし、これは「ローコード開発」と捉えれば利便性・迅速性・展開性とトレードオフなのはごく普通のことであり、用途さえ適合していればメリットのみを享受することもできるでしょう。

- "4D"という名称があまりに検索しづらすぎる

最大の問題点はこれなのでは？　「4D」でも正式名称の「4th Dimension」でも、単に「4次元」という一般名詞であるためありとあらゆる関係ない検索結果が引っかかりまくります。「CINEMA 4D」という全然関係ないグラフィックソフトの方が知名度も高いようです。

技術開発において技術情報を一意に検索困難、というのはわりとデメリットなので、それは困るなぁと感じているところですね。「どの4Dを指しているか」をすぐに識別する唯一の方法は、アイコンが青地に白文字の4D公式アイコンとなっているかどうかです。

現状、一番マシな問題解決手法は有識者に聞くか、文脈から既にどのソフトウェアを指すか理解させてあるChatGPTをコーチにして教わり、検証のためにググったり実装で試したりする方法でしょうか。
まぁしかし、本来の用途であるシンプルな実装のためならあまり困ることもなく、多機能ではあるのでその最初の頃に説明書代わりにするイメージですね。言い換えれば、公式ドキュメントで事足りるはずでもあります。

公式ドキュメント：
https://doc.4d.com/4Dv20/index.ja.html

<h2>まとめ</h2>
"4D"とはなんぞや？　というところまではなんとなく見えてきたので、実装部分について今後は試していく予定です。ただ、エター記事あるあるに名を連ねないためにも特にQiitaで書く予定はないと明言しておきます。そもそも技術的にはシンプルで、GUI使ってやれる範囲の方が多いぐらいなので、わざわざQiita参照するまでもなさそうですしね。

1ヶ月ぐらい後の追記：
「GUI範囲のが多い」は大嘘。次の記事は、書けたら書きたいですね。
ApiGatewayで出来る事をまとめてみた

AWS Certified Developer - Associateを勉強中にAPI Gatewayめっちゃ多機能やん…と思い始めたので出来ることをまとめてみます。

公式ドキュメント
- [Amazon API Gateway Documentation](https://docs.aws.amazon.com/apigateway/index.html)

## API Gateway＋lambdaでサーバーレス環境作成

まずは誰もが通るであろう鉄板構成です
REST APIなどすぐ作れて便利です

- [API Gatewayとlambdaを使ってみる](https://qiita.com/miyuki_samitani/items/f01f1bd49334f97fe84c)

## API Gateway＋AWSサービス

lambdaと連携させなくても、直接AWSサービスを呼ぶことも可能

- [API ゲートウェイを使用して Amazon S3 に画像や PDF ファイルをアップロードするには、どうすればよいですか?](https://repost.aws/ja/knowledge-center/api-gateway-upload-image-s3)
- [API Gateway からDynamoDBを直接操作してみた](https://zenn.dev/amarelo_n24/articles/ab083b0358e902)

## 認証

リソースポリシーでの制限やCognitoと連携させた認証、IAM認証、mTLS認証など色々できます。

- [API Gateway リソースポリシーを使用して API へのアクセスを制御する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-resource-policies.html)
- [Cognitoを使ってAPI Gatewayのアクセス認証をしてみた](https://qiita.com/ist-m-k/items/f956e3005b2e83272cb2)
- [API GatewayでIAM認証してみた](https://qiita.com/ita-k/items/5d6e8ceaf3f0a970b594)
- [REST API の相互 TLS 認証の設定](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/rest-api-mutual-tls.html)

## クォーター制御

APIキーというものを発行してちょっとした認証とクォータ、レート、バーストを設定できます。

- [API GatewayのAPIキーと使用量プランについて調べてみた](https://dev.classmethod.jp/articles/try-api-gateway-usage-plan/)

## WebSocket API

お恥ずかしながら自分は全然詳しくないですが、WebSocket APIもつくれます！

- [WebSocket API の操作](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-websocket-api.html)
- [API Gateway で WebSocket を利用したAPI作成](https://qiita.com/minsu/items/fcae56cd175d1d584709)

## デプロイ方法

Canary リリースデプロイがサポートされています

- [API Gateway の Canary リリースデプロイの設定](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/canary-release.html)
- [【新機能】 Amazon API Gateway が Canary Release Deployments (新しいバージョンへの部分的な振り分け) に対応しました #reinvent](https://dev.classmethod.jp/articles/reinvent2017-api-deploy-canary-release/)

## 最後に

ざっくりですが色々出来ることをまとめてみました。
まだまだ機能はてんこ盛りなので深掘りしていこうと思います！
Windows Backup：塩漬けシステムのハードウェア最新化方法

# はじめに
クラウドにおいてベアメタルを利用し続けていると、部品の在庫不足により、障害時に交換できないという状況に陥る可能性があります。そのため、事前にハードウェアの最新化を図る必要があります。
一方でしばしば稼働システムは塩漬けしたい。そこでOSはそのまま、ハードウェアのみアップデートする際の手順と注意点を記載します。


# 環境情報
- バックアップ元サーバー
    - プロセッサ：Broadwell
    - OS: Windows2012R2
    - 2017年デプロイ、以降Windows update適用なし
<br>

- backup ソフト
    - Windows Server Backup
        - Windows server backupでのリストアは以下記事を参照ください。
https://jpwinsup.github.io/blog/2022/05/09/Storage/Backup/Restore/
    - R1softについては[こちら](https://qiita.com/takason/items/10d677d0f9cdf0eea017)で紹介しています。


# 手順の検討
### 想定手順とエラー
Windows Server Backupでは、ISOイメージを使用してリストア先サーバーを修復モードで起動する必要があります。

1. リストア先サーバーをISOイメージからブート
    - エラー1：ISOイメージからストレージが見えない
    - エラー2：ISOイメージブート後、NICが見えない
2. Windows server backupによりリストアを実施

### 考察
- ドライバ不足によるストレージ参照失敗
- ドライバ不足によるNIC参照失敗

これらの考察が正しかったです。

# 最終的な手順
1. ドライバを比較して不足ドライバを洗い出し
2. Windows2012 ISOイメージへ不足ドライバを焼き直し
3. バックアップ取得＆リストアを実施
4. ISOイメージからリストアイメージへの不足ドライバ焼き込み

### 1. ドライバを比較して不足ドライバを洗い出し
ドライバをリストした結果、RAID Controller用ドライバとNICドライバが新規に利用されていることが分かりました。

```
> driverquery /v /fo table
```

### 2. Windows2012 ISOイメージへ不足ドライバを焼き直し
今回はドライバ不足により、ISOイメージからストレージ・NICが参照できない状態でした。
そのため、ISOイメージへドライバを追加します。
ISOイメージへのドライバ焼き直しについては以下記事を参照ください。
https://qiita.com/takason/items/e7ed8dbfe75c25c54a57

### 3. バックアップ取得＆リストアを実施
ISOブート後にストレージとNICが参照出来るようになったため、リストアを実施します。
Windows server backupでのリストアは以下記事を参照ください。
https://jpwinsup.github.io/blog/2022/05/09/Storage/Backup/Restore/

### 4. ISOイメージからリストアイメージへの不足ドライバ焼き込み
リストア後のシステムイメージ内には追加したドライバが含まれていません。そのため、ISOからシステムイメージにさらに焼き直す必要があります。
https://qiita.com/takason/items/e7ed8dbfe75c25c54a57
重複の削除 (paizaランク C 相当)

https://paiza.jp/works/mondai/string_primer/advance_step5

入力したものから重複を削除して出力せよという問題。
集合を使えばいけるってのは知ってたけど、ちょっとpythonでのやり方があやふやだったので
調べながら復習
知識として知っておくべきところは下記
・集合をつくるには`set()`
・集合の中の要素に同じものがあるかどうかを調べるには`not in`か`in`
・集合に追加するときは`add(element)`
（以下参考。詳しくは使う時に）
・要素を削除: `discard()`, `remove()`, `pop()`, `clear()`
・和集合: `|`演算子, `union()`
・積集合: `&`演算子, `intersection()`
・差集合: `-`演算子, `difference()`
・対称差集合: `^`演算子, `symmetric_difference()`


・ちなみに集合をつくってそれをソートすればいいやんと考えたけど、その場合、問題と意図が違う結果になる。つまり今の文字の順番のまま重複を削除した結果がほしいわけで、ソートしてしまうと他の結果になる可能性がある。
⇒>出力するのはあくまでも今の順番のままなので、正解としては集合に追加した後そのままその要素を半角スペースなしで出力する方法となる

```py
S =input()
A =set()
for element_S in S:
    if element_S not in A:
        A.add(element_S)
        print(element_S,end="")

```