OmniAICreator/Qiita-1.07M huggingface dataset:
【UiPath】業務的データテーブルの使い方その1


## はじめに
データテーブルってとっつきにくいし、データテーブルに対するテクニック・解説などは載ってても、実際の業務で使える考え方・パターンは載ってないかなーと思って、
私が業務作業でやっているデータテーブル操作を書いていこうと思います。
参考になれば幸いです。:grinning:

## 対象者
・日々の業務でエクセルのVLOOKUP関数を多用する人
・2種類のデータテーブルを使って、目的の行や列に対して操作・更新をしたい方

## サンプルで使うデータテーブル
データテーブルA
![データテーブルA.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/b843025d-6baa-f94d-55e8-588ca6e81abd.png)


データテーブルB
![データテーブルb.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/6df7adc6-6d47-af72-f5b8-39331048597f.png)

県と特産物のような形でデータテーブルをつくりました。

# データテーブル活用パターン1
2つのデータテーブルの中で条件が合う行を出力したい！という場合はこちら
**データテーブルを結合**アクテビティを使います。
結合ウイザードの中はお互いの「列名」を指定します。
結合型を「**Inner**]に指定します。
指定した列名で値が合致するものが**データテーブルC**へ出力されます。
![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/f398efba-fba4-c7dc-8d10-20969a11b8e2.png)

今回はお互いのデータテーブルでは「東京」が合致するので、該当の行が出力されるか見てみましょう。

### 実行結果
![キャプチャ出力結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/35b01255-02c4-a323-c3ac-c6872430a121.png)
こんな感じになりました！条件が合う行が互いに合体したようなイメージです。
気を付けないといけないのは、条件指定した列に関して、お互いのデータテーブルに格納されている値は一緒でないと、データテーブルCは狙ったデータテーブルにはなりません。
地名で例をあげると「市ヶ谷」と「市谷」とか、「アルプス」と「ｱﾙﾌﾟｽ」とかね笑
右と左は一緒でないといけない。つまり、ドラゴンボールでいうとフュージョンみたいなイメージでしょうか:point_right::point_left_tone2:
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/e31ca6cd-a648-2fed-5049-d2d107ec1b89.jpeg)

さて、日々の業務でデータの出力だけが目的であれば、この後「データテーブルをフィルター」アクテビティを使って、データテーブルCの余計な行を削除し、「CSVに書き込み」アクテビティなどで利用することが可能です。

# データテーブ活用パターン2
どちらかのデータを軸にして、片方にある行や列に更新をかけたい場合は2種類のアクテビティを組み合わせて使います。
**繰り返し（データテーブルの各行）アクテビティ** 
**データテーブルを探索 アクテビティ**
組み合わせはこんなイメージです。繰り返しの中に検索アクテビティを入れる感じ。
![繰り返し.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/7fdf5dff-e9ff-c1b5-9fc7-ad6fb5b4632c.png)
![繰り返し2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/0175ac03-6602-4df6-e4b8-fa5040c6aef2.png)


**繰り返しアクテビティ**から解説すると
**CurrentRow**にはデータテーブルの1行が格納されます。
列に格納された値を出力したい場合は「**CurrentRow("データテーブルAの列名").ToString**」で値を取得します。今回のデータテーブルAでは、1回目の繰り返し実行では「山梨」、2回目の繰り返し実行では「東京」の値が取得できます。

さて、**データテーブルを検索アクテビティ**では、どのデータテーブルの中から探したいか指定するので「データテーブルB」を指定しました。「列」「列名」「列番号」とありますが。どれかが入力されていれば大丈夫です。今回はデータテーブルBの列名はわかっているので、**列名**を入力しています。
検索値にはデータテーブルBの中から探したい値を入力します。今回は繰り返しの際には「山梨」「東京」が入っていくような形です。
また、出力結果に「行インデックス」という項目があります。この出力結果はInt32型になります。
データテーブルBに値が存在しない場合-1が返ってきます。値が見つかった場合はデータテーブル内の行番号を整数で返します。

データテーブルBに値が見つかったときに、目的の列の値を更新したいのでこのように表現します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/e5fc9887-f5ca-2367-7a6b-334976a92550.png)

つぎに発見行インデックスが-1以上であれば、データテーブルBに該当する行が存在するので、else ifアクテビティなどでふるい分けます。
データテーブルBの行へアクセスするには「データテーブルB.Rows(発見行インデックス).Item("Bの列名").tostring」で行のデータを取得できます。す。:santa::writing_hand:



## 実行結果
![キャプチャ98.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/466ca1b7-bbfc-41af-2785-72d2d644523d.png)
実行結果はこのようになりました。
最初に「山梨」っていう値でデータテーブルBを検索したところ、ヒットしないので「-1」が返ってきます。
次に「東京」っていう値でデータテーブルBを検索したところ、「0」が返ってきます。
「0」なのはデータテーブルの1行目はゼロから始まるからです。（ゼロオリジン）
目的の行が見つかったら**行項目を更新アクテビティ**で更新をすれば大丈夫です。
EC2 Instance Connectを使用して特定のEC2インスタンスに接続できるユーザーを設定する

https://qiita.com/ran/items/7ae62f7dba2bba49e330

EC2インスタンスを作成したりできるIAMユーザーでEC2 Instance Connectを使用したssh接続をする場合は、権限など特に気にしませんでしたが、特定のインスタンスだけに接続できるユーザーを作りたい場合もあると思います。

# IAMの設定
## ポリシーの作成
EC2 Instance Connectを使ってssh接続するための権限を設定した以下のようなポリシーを作ります。
ec2-instance-connect:OpenTunnelのResourceには、目的のEC2インスタンスに接続できるEC2 Instance ConnectエンドポイントのARNを入れ、ec2-instance-connect:privateIpAddressには、目的のEC2インスタンスのプライベートIPv4アドレスが含まれるものを入れてください。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Resource": "arn:aws:ec2:ap-northeast-1:XXXXXX:instance-connect-endpoint/eice-XXXXXX",
            "Condition": {
                "IpAddress": {
                    "ec2-instance-connect:privateIpAddress": "192.168.XXX.0/27"
                },
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "22"
                }
            }
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:osuser": "ec2-user"
                }
            }
        }
    ]
}
```

## ユーザーの作成

新しくユーザーを作成し、先程作ったポリシーをアタッチします。
『セキュリティ認証情報』タブでアクセスキーを作成し、このアクセスキーでawsコマンドを実行します。

## (おまけ)aws-cliのプロファイル追加
test-userという名前のプロファイルを追加して、先程作ったアクセスキーとシークレットキーを設定します。
```
aws configure --profile test-user
```

# ssh接続
## ec2-instance-connect ssh
```
aws ec2-instance-connect ssh --instance-id i-XXXXXX --profile test-user
```

## open-tunnelを使ってsshする
### EC2インスタンスを作成した時のキーペアを使用する場合
```
ssh -i ~/.ssh/鍵ファイル -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-XXXXXX --profile test-user' ec2-user@i-XXXXXX
```

### 独自の鍵を作って使用する場合
#### 鍵を作成(my_key)
```
ssh-keygen -t rsa -f my_key -N ""
```
(パスワードを設定する場合は、`-N ""`を削除して実行してください。)

#### パブリックキーをインスタンスにプッシュする(send-ssh-public-key)
```
aws ec2-instance-connect send-ssh-public-key --instance-id i-XXXXXX --instance-os-user ec2-user --ssh-public-key file://my_key.pub --profile test-user
```

#### ssh接続(send-ssh-public-keyを実行して60秒以内に接続する)
```
ssh -i my_key -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-XXXXXX --profile test-user' ec2-user@i-XXXXXX
```

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html
座席統合・移動機能について

![Advent Calendar 2023 Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143450/c579cfe6-969a-9917-8a28-f9b6a13939e8.png)


この記事は、Chompy アドベントカレンダー 21日目の記事です。

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

## はじめに
はじめまして。エンジニアのKazukiです。
Chompyには、約3年ほど前にGoを勉強し始めて間もない頃にインターンとしてジョインしました。今はバックエンドに限らず、Webやモバイルのフロントエンドも含め開発に携わっています。

Chompyでは、飲食店に関わる様々なシステムを開発しており、その1つとして、飲食店に特化したレジ × ハンディ × CRMツールであるChompy Studio(以降Studio)を提供しています。

https://apps.apple.com/jp/app/chompy-studio/id6449987456

## 概要
今回は、そのStudioの機能として開発した座席の統合・移動機能について書いていきたいと思います。
恐らくみなさん馴染みがあるように、飲食店では、4名の来店客用に2名席をくっつけたり、途中から人数が増えたので大きい席に移動したりというオペレーションが発生します。今回の座席統合・移動機能はそれを店舗のデジタルツール上で管理できるようにするためのものです。Studio上で統合されている卓が分かることで、商品の提供タイミングをコントロールしたり、各スタッフが移動後の空席状態の把握等に役立ちます。

座席統合・移動は飲食店のオペレーションとしては馴染みがありますが、
それをシステム上実現するには考慮する点が多く、既に注文が入っている卓同士は統合してしまって良いのか、統合ミスのリスクをどのようにカバーするか、移動・統合が複数回行われたときに問題が起きないか、など様々な懸念がありました。ここからはどういう仕様・実装方針でこの機能を開発したのかについて書きます。

## 仕様について
つらつらテキストで書くより実際の機能を見せた方が仕様のイメージがつきそうなので、簡単に機能をお見せします。

1つの画面で統合・移動のどちらもすることができ、元々選択していた座席以外が選択されれば移動、元々の座席も含めて他の座席が選択されていれば統合になります。

![Screenshot 2023-12-22 at 15.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143450/dcd8fa03-0a3f-fb01-24d4-3d2720140106.png)
※画像は統合のパターン

## 実装について
イメージ感がざっくり掴めたところで、実装について書きたいと思います。

今回行った実装について話す前提として、注文と座席がどう管理されていたのかについて軽く触れます。Chompyでは、注文のエンティティ(Order)と座席のエンティティ(Table)があり、
Orderが紐づいているTableの情報を持つことで、座席と注文を1対1の関係性で紐付けて管理していました。

ここまで座席の統合・移動と一括りに呼んできましたが、実際には統合と移動で難易度がだいぶ異なります。

*移動*
座席の移動は比較的簡単で、移動元のOrderの紐づく座席を変更し、もし移動先に既に注文があれば、移動先の注文も吸収する。移動は、OrderとTableの関係性が1対1で変わらないため、既存の実装の延長で比較的容易に実装できました。対して考慮する点が多かったのは統合の方で、統合側の実装に関して話したいと思います。

*統合*
統合に関しては大きく2つの実装方針がありました。1つは、Orderが統合されたTableの情報も保持し、1対多の関係(親Tableと統合された子Table)で管理する。もう1つは、OrderとTableの1対1の関係性を残したまま、統合状態は別のコレクションを作って管理する。という方針の2つです。
最初は前者の方針で実装を進めていたのですが、1つ詰まりポイントになったのがQRコードを読み込んでのWebオーダーへの対応です。Chompyの提供サービスとして、卓上のQRコードを読み込むと卓番号が指定された状態で注文が行えるWebオーダーがあります。
基本的にQRコードは卓ごとに配置されてあることから、A,B,Cの3卓が仮に統合されていたとしても、どの卓のQRコードから注文が入るのかはわからないので、OrderとTableは1対1の関係性を保った方が楽にその点クリアできるのではないかということで、後者の方法で実装を検討し直しました。が、実装を進めていくと注文した商品の履歴や会計処理など、1つのOrderに対する操作を前提として作られている画面を複数のOrderにも対応させるのが非常に困難なことが分かり、統合時にOrderを1つにまとめる前者の方針に落ち着きました。問題であったQRコードを読み込んでの注文への対応は、統合されている卓のQRが読み込まれた場合には、選択している座席をバックエンド側で親の卓にセットする形で、親のOrderに注文が追加されていく形にしました。

(文章に起こしてみると、そんなに悩む点でもなかったかなwと思ってしまうのですが、こういう判断がもっと早く正確にできるようになっていきたいですw)

## 終わりに
この機能は統合も移動もログが残るようになっているんですが、ログを見ると日常的に使われていて、顧客が必要なものを作れている感があり嬉しいです。ただ、現時点で100%完成しているとは言えない機能で、個人的には近い将来、統合や移動をミスってしまった時に復元を簡単にする分割機能が作れたらいいな〜と思っています。割に長文になってしまいましたが、ここまで読んでいただきありがとうございました。
ESLint(TypeScript)の指摘の直し方

手元で表示されたものだけ

# Arrow function should not return assignment
カッコで囲む

❌
```typescript
    () => a = b
```

⭕
```typescript
    () => { a = b }
```

# Block must not be padded by blank lines
`{`の直下の空行を消す

# 'xxx' is never reassigned. Use 'const' instead
`let`を`const`に変える

# Don't use `Boolean` as a type. Use boolean instead
`Boolean`を`boolean`に変える

# Expected { after 'if' condition
`if`文を`{}`で囲む

# Expected '===' and instead saw '=='
`==`を`===`に変える

# Expected blank line between class members
クラスメソッドの前に空行を入れる

❌
```typescript
export class CAiueo {
   public aaa (): void {
   }
   public bbb (): void {
   }
}
```

⭕
```typescript
export class CAiueo {
   public aaa (): void {
   }

   public bbb (): void {
   }
}
```

# Expected error to be handled
コールバックで渡ってきた引数を使う

# Expected indentation of 2 spaces but found 4
インデントは4文字では無く2文字

[8文字教](https://www.kernel.org/doc/html/latest/process/coding-style.html)の人からしたらどんな感じなんだろう

# Extra semicolon
`;`(セミコロン)つけるな

# Missing return type on function
関数の戻り値の型が設定されていない


❌
```typescript
function aiueo () {
```

⭕
```typescript
function aiueo (): void {
```

# Missing space before function parentheses
カッコの前にスペース入れる

❌
```typescript
function aiueo(): void {
```

⭕
```typescript
function aiueo (): void {
```


# More than 1 blank line not allowed
2行以上の連続空行は認めない

# Newline required at end of file but not found
ファイルの最後に改行しろ

# Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the `void` operator
これはよくわからないけど指摘のところに`void`を入れるとなおる。
おそらく `vscode.window.showInformationMessage`が非同期処理だからだとかそんな感じかなぁ

❌
```typescript
  vscode.window.showInformationMessage("Hello, world")
```

⭕
```typescript
  void vscode.window.showInformationMessage("Hello, world")
```

# Strings must use singlequote
`"`(ダブルクォーテーション)使うな

# Unexpected literal in error position of callback
コールバックI/Fの第1引数は`Error`で無いとだめらしい

参考：https://stackoverflow.com/questions/50755653/unexpected-literal-in-error-position-of-callback-in-vue-js

# Unexpected nullable object value in conditional. An explicit null check is required

❌
```typescript
  if (!err) {
```

⭕
```typescript
  if (err == null) {
```

# Unexpected object value in conditional. The condition is always true
❌
```typescript
  if (err == null || !err) {
```

⭕
```typescript
  if (err == null) {
```

# Unexpected string value in conditional. An explicit empty string check is required
`string`の `null`チェックは要らんらしい
❌
```typescript
function aaa (arg: string) {
  if (arg == null) {
```
条件文ごと削除


# Unexpected tab character
タブ使うな

# Variable name `xxx_xxx` must match one of the following formats: camelCase, PascalCase, UPPER_CASE

アンダーバーがあって、小文字だけの変数名は認められないらしい

❌
```typescript
  let aaa_bbb: string = 'aiueo'
```

⭕
```typescript
  let aaaBbb: string = 'aiueo'
```
Pandoc用のwordスタイルテンプレの作り方

Pandoc用のリファレンスDocのWordスタイル変更方法を解説した記事が全く見当たらないので、
書き出しました。
普段からWordで文章作ってる方は当たり前なんでしょうが
エンジニアのWordの使い方は・・・でして・・


# 本題
pandocでは
```
pandoc wikifiles.txt 
    --from=markdown --to=docx --standalone 
    --reference-doc=custom-reference.docx 
    --output=output.docx
```

と言う感じでいろいろ指定するんですが、
さて、custom-reference.docxはどう作ればいいんだ？って話。


ひとまず空のword docxファイルを指定して、wikiでいろんなmakedown記述すると
個々にスタイルが設定されたdocxファイルが作られる。

これを元にスタイルをいじっていけばいいと思うので、
makedown記述にはわかりやすく
```
#見出し1
##見出し2
```
って書いてておくとよいかと。


で、出力されたwordファイルをWordで読み込むわけですが
何をいじればいいかというと、
MacWordだと、「ホーム」に「スタイルウインドウ」ってのがあるのでクリック。

見出し1も部分をクリックすると現在のスタイルに「見出し１」となるので、その右にマウスカーソルを持っていくと下矢印になるのでクリック
スタイルの変更...をクリック

![スクリーンショット 2023-12-22 15.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/84229fba-0f6a-36d6-9790-cc42ab7d539a.png)

ここでスタイルの変更をしていく感じになります。

![スクリーンショット 2023-12-22 15.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/36398e24-6336-fa93-1207-3e91a203fed7.png)

行間をいじる場合はココを押すと狭まります
![スクリーンショット 2023-12-22 15.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/3df6d656-6e8b-4b06-ae94-b7782bd0803b.png)

上下の行間をいじる場合は書式から段落をクリック
![スクリーンショット 2023-12-22 15.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/365761e3-2a64-accd-7048-023d0ebf5f7d.png)

後はいつも通り(?)かと
![スクリーンショット 2023-12-22 15.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/c353690e-4870-d821-3990-7596f7f43b5d.png)



一通り変更したら、このファイルを保存し、このファイルをpandocコマンドの--reference-doc=に指定すればいいです。



がんばってきれいなテンプレート作りましょうね！！
いいの出来たらぜひ共有ください！！ｗ
Matlab備忘録

## 背景
最近Pythonじゃデータが処理できなくてmatlabに手を出してみた．
今のところで使用した関数をここに書いていく

### tableから列をarray型で取り出す

```matlab
array = table2array(table(:,"抜き出す列名"))
```
Aに列の値がarray型で抜き出される．
tableのままでは計算ができないので，別の型にする必要があった．

### 差分を取る
```matlab
diff = diff(x)
```
要素間の差分を計算する．
diff(x)を使用したあとはxの要素数に比べて要素数が一つ少なくなる．
微分するときに使った．

### グラフをプロットする
```matlab
plot(x,y)
```
xの値に対応するyのデータのグラフを作成する．
```matlab
plot(table,"timestamp","data")
```
timestampがあるテーブルで上記のように書くとx軸が時間，y軸がデータのグラフがプロットできる．

```matlab
subplot(a,b,c)
```
figureをa行b列のグリットに分割して，cで指定した位置に座標軸を作成する．
例えば
```matlab
subplot(2,1,1);
plot(x,y);
```
のような感じ．
次の位置にグラフを書きたい場合は
```matlab
subplot(2,1,2);
plot(x,t);
```
のようにsubplotで切り替える必要がある．
### 表示幅の設定
```matlab
xlim([a,b])
ylim([a,b])
```
軸の表示範囲を変更できる
```matlab
xlim([datetime("YYYY-MM-DD hh:mm:ss"), datetime("YYYY-MM-DD hh:mm:ss")])
```
上記のように書くとdatetime型での表示範囲を変えられる．

### 配列の要素数を確認する
```matlab
len = length(x)
```
length(x)でxの要素数を確認できる
```matlab
height = height(table,"要素名")
width = wigth(table)
size = size(table)
```
height(table,"要素名")で指定した列の要素数を確認できる．
width(table)で指定したテーブルの行の要素数を確認できる．
size(table)で指定したテーブルのサイズを確認できる

## 終わり
今のところで使用した関数はこんな感じです．
まだmatlabになれていませんが，コツコツ調べながらやっていけたらなと思います．
Flutter Widgetの表示を制御する方法(if文、for文)

# はじめに
開発をしていると、ColumnやTextなどのWidgetを繰り返し表示したい時や、ある条件に当てはまった時のみWidgetを表示したい時があるかと思います。

私はあるタスクを任されて実装を行っていた時、画面にWidgetを繰り返し表示する必要が出て来ました。Flutterでもfor文が使えるという事で、そこで試しに以下のように記述(例)してみた所、エラーが発生してしまいました。
```dart:sample.dart(エラー)
Column(
    children: [
        for(final str in strList) {
            Row(
                children: [
                    SampleWidget1(),
                    SampleWidget2(),
                ],
            ), // Row
            Text('ああああ'),
        }
    ],
), // Column
```

Column列の中にRowとTextを繰り返し表示するというようなことがやりたかったのですが、この書き方では無理だったようです。

因みに、for(if)文の{}を省略して処理のWidget表示を1つだけ書く事は出来ました。
```dart:sample2.dart
Column(
    children: [
        for(final str in strList) 
            Row(
                children: [
                    SampleWidget1(),
                    SampleWidget2(),
                ],
            ), // Row
    ],
), // Column
```

# 解決策
ただ、｛｝を使って複数個のWidgetを表示したい！と思ったが調べても方法が見つからず、先輩に相談したところ、｛｝の前に...(ピリオド3つ)を付けることで実現する事が出来ました。
```dart:sample3.dart
Column(
    children: [
        for(final str in strList) ... { // ここ
            Row(
                children: [
                    SampleWidget1(),
                    SampleWidget2(),
                ],
            ), // Row
            Text('ああああ'),
        }
    ],
), // Column
```

これでRowとTextを繰り返しColumnに表示する事が出来ました。めでたしめでたし。
配色にカラーユニバーサルデザインを取り入れる

# カラーユニバーサルデザインとは

カラーユニバーサルデザインとは、誰にでも見やすく使いやすい色使いを行うことです。
対象が色覚異常を持つ人だけだと思われがちですが、白内障や緑内障など病気により後天的に色の見え方が変わる可能性や加齢によっても見え方が変化する可能性を考慮すると、カラーユニバーサルデザインを行うことは全ての人に優しいデザインとなります。
また男性の20人に１人が色覚異常を持つと言われているので、見えにくさで困っている人は意外と身近にいるかもしれません。

# 見え方の違い
正常色覚、1型色覚、2型色覚では色の見え方がかなり異なります。

- 正常色覚
![正常色覚.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/6ffc892f-71ed-4b24-cf13-dd6c5311b06e.png)

- 1型色覚
![色覚1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/e9e4f85c-e442-9f63-9943-33cfc70eb049.png)

- ２型色覚
![色覚2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/27e3884c-ae84-b725-69bf-06592a50716f.png)

１型色覚、２型色覚で特性は異なりますが、大きく見れば赤系統と緑系統の間の区別がつきにくいという特性があります。
また赤と茶、オレンジと黄緑、オレンジと黄色、青と紫、暗めの赤と黒、ピンクと水色なども区別がつきにくい色となります。

高齢者の場合は水晶体の黄変により、視界が黄色がかって見えるようになります。
- 通常
![fantasy_dragon_blue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/1a51a4ef-1214-4c50-920c-a2a0c3b4d707.png)
- 高齢者で水晶体の黄変が起こっている場合
![fantasy_dragon_yellow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/fdf08d5e-98da-57d7-0970-a7daf973348e.png)
また、青と黒、白と黄色が区別がつきにくい色となります。

※このページの見え方はわかりやすいようにイメージした画像です。実際の見え方には個人差があります。

# わかりやすいカラー設計のポイント
1. 色の明度差をつける
![明度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/1039891f-c8b5-8469-c9a7-4e9e42fd7e9d.png)

2. 色の間に境界線を入れる
![境界線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/7c09b0be-42bb-0d31-7bc0-d4b67668813f.png)

3. 色の彩度差をつける、低彩度色の組み合わせは避ける
![彩度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/f04661b1-051a-b9dc-6575-a0a6e2424b3f.png)

4. 微妙に色を変えて見やすい色を使う
![微妙な色変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/faa1beb5-c83a-f33a-ec75-b56132932ce1.png)
この場合は紫がかったピンクから黄みのピンクに変更しています。

# 便利ツール
実際の色覚異常の見え方を確認するためにはツールを使うのが便利です。

**color oracle**

https://colororacle.org/

**adobeの校正設定機能**

![校正設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/b9b4d139-fc23-34d9-a9fd-478852bf0ad3.png)

**Chromeの開発者ツール**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654222/1eaf8d4a-022e-a4da-c777-1f3d527cf009.png)

# さいごに
デザインというとWebやアプリ制作の際だけ使われることのように思えますが、資料作成などの色使いでもカラーユニバーサルデザインを意識すると、全ての人に見やすく優しくなり、より伝わりやすいものになるのではないかと思います。

# 追記
色だけではなくて文字や記号を用いてわかりやすくする方法もありますが、それはまた別の機会にまとめます。
１列内にある、区切り文字(改行やカンマなど)を含む文字列を列展開にする(SPSS Modeler データ加工逆引き7-18) 

# １列内にある区切り文字(改行やカンマなど)を含む文字列を列展開にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c057e68f-9eb7-3a5a-fbda-77c48302cf01.png)


## 1.想定される利用目的

・履歴やタグのようなリスト構造を持つフィールドの利用

## 2.サンプルストリームとデータのダウンロード


https://github.com/hkwd/spsssample/raw/master/231222%E5%88%97%E5%86%85%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E5%88%86%E5%89%B2/231222DvideColumn.str

https://github.com/hkwd/spsssample/blob/master/231222%E5%88%97%E5%86%85%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E5%88%86%E5%89%B2/MachineHistcrlf.csv

https://github.com/hkwd/spsssample/blob/master/231222%E5%88%97%E5%86%85%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E5%88%86%E5%89%B2/MachineHistlfcomma.csv

## 3.サンプルストリームの説明

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/93f748a5-78a8-fb93-bd9c-d18ba9e9d2e4.png)

### a.入力するデータは以下の通りです。
「改行」が区切り文字で複数のデータが一つのフィールドに記録されています。データ数は行によって異なっていてもかまいません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fee0268f-5fe5-5648-9138-1daff16fa1ad.png)

### b.[フィールド作成]ノードを編集します。　
まず、「HISTORY」列に何件のデータがあるかを数えて、何列用意すればいいかを調べます。
```python
count_substring(HISTORY,'\n')+1
```
で区切り文字の数をカウントします。「\n」は改行コードを意味しています。区切り文字の数＋１がデータ数になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/27ce84e1-4370-80e4-df13-a3238478c857.png)

[プレビュー]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/220af80c-47fa-b05a-cc33-0e536da150c2.png)

### c.[レコード集計]ノードを編集します。
[履歴数]列の「最大」を集計します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8d7a4e4f-144b-cadc-f5a6-4fcf84b9b9a7.png)

結果は3件でしたので、３列用意する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/14f4ae75-7478-0bc9-7ed2-72286a374793.png)

### d.[フィールド作成]ノードを編集します。
[HISTORY]列を区切り文字（改行コード）で一つずつ取り出していきます。
3列分の[フィールド作成]ノードを作ります。
```python
textsplit(HISTORY,1,'\n')
textsplit(HISTORY,2,'\n')
textsplit(HISTORY,3,'\n')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/30517922-deec-409e-6abb-02a1af9d310f.png)

[テーブル]を実行します。3列に分割できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/85bfc7e7-805e-4739-bdd5-ed3d6399a1d0.png)

#### 注意事項

カンマ区切りの場合は区切り文字を変える必要があります。
```python
textsplit(HISTORY,1,',')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/342842ea-5697-10c0-f19a-b26f1e9da744.png)


## 4.参考情報

#### 区切り文字を含むフィールドの値を縦持ちする(SPSS Modeler データ加工逆引き7-16) #SPSS - Qiita 
当記事では横持で展開しましたが、こちらは縦持ち展開する記事です。

https://qiita.com/416nishimaki/items/fc892638dc4eca265dd4

#### アンケートの複数回答可 (MA)列をフラグに分解する(SPSS Modeler データ加工逆引き2-14) #SPSS - 
当記事では展開データは不明という想定でしたが、中身がわかっている場合にはこちらの記事のようにフラグ化するようなことも可能です。

https://qiita.com/416nishimaki/items/7cdd7556afe07f0b1748

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【AWS】【Rails】ログインリクエストをSQLiだと判定されてしまった際のメモ

# はじめに
※当記事にはWAFの設定に関しての具体的内容は含まれていない旨ご了承ください🙏
Rails及びAWSを活用した案件開発を行っていたある日のことでした

# 問題
「特定のユーザーがログインしようとした際、必ずエラー画面が表示されてしまうので調査頂きたい」といった趣旨のお問い合わせがありました。
ひとまずアプリケーションのログをAthenaで追ってみても問題事象に関連していそうなログが残っておらず、一見して原因が分からないという状況でした。


# 今回の対処法: WAFの検証ルールを緩和
アプリケーションのログに何も残っていないという点から、より前段で止まっていると仮定してWAFのログを確認しました。すると以下のようなログが残っていました
~~~
AWS-AWSManagedRulesSQLiRuleSet
MANAGED_RULE_GROUP
BLOCK
[{conditiontype=SQL_INJECTION, location=BODY, matcheddata=[authenticity_token, &, user, [login_name], --dayo&user[password]=test_password&commit=ログイン]}]
~~~
内容を確認すると、ユーザーからのログインリクエストがWAFによってSQLインジェクションと判定されブロックされてしまっているようです。  

そして対象ユーザーのアカウント情報を改めて確認した所、ログインIDが`tky--dayo`といった`--`を含む形になっていました:scream::scream::scream:

SQLにおいて`--`を使用すると以降の記述がコメントとして扱われるという性質があるため、このような検出がなされたようです。
(例えばログインID、パスワードの一致を要求する所、ログインIDに`--`を混ぜることでパスワード部分の判定を回避しようとするなど)

アカウント登録周りの実装を確認した所、`'`, `"`, `;`, `#`あたりは禁止文字として入っていたものの、`--`は抜けてしまっていたようでした...😢

以前当案件において実施された外部脆弱性診断等の結果も加味して、アプリケーション上の当該処理部分はSQLiへの耐性を十分持っていると開発チーム内で判断しましたので
今回はWAFを統括管理しているSRE部署にWAFのルール設定緩和(特定のパス、パラメータにおいて`--`を許容する)をお願いして、事象の解決という運びとなりました🙏

# おわりに
このような問題に後から対応しようとすると
- 都度のWAFのルール緩和
    - 無停止で比較的楽に対応出来る反面、セキュリティ的に弱くなることには変わりないですし、この文字・パターンもダメだった～的なイタチごっこに...:scream:
- 既存ユーザーのログインID変更＋アカウント登録時の禁止文字・パターン追加 
    - ~~単純に色々と辛いです:scream:~~

といった対応が必要となってくると考えられるため、
ログイン処理周りなどはWAFの存在等も加味した上で最初にしっかりと設計しておくことが肝要であるという学びを得ました

# 参考にさせて頂いた記事など

https://wepicks.net/itglossary-injection/  

https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html
Swallow-7b-instruct-hfはパソコンのキーボードを知っているのか

[昨日の記事](https://qiita.com/KoichiYasuoka/items/60c44df1740efb38e04e)の続きだが、[Swallow-7b-instruct-hf](https://huggingface.co/tokyotech-llm/Swallow-7b-instruct-hf)に「[パソコンのキーボードは，なぜABC順・五十音順ではないのですか](https://kotobaken.jp/qa/yokuaru/qa-35/)」と尋ねてみることにした。プログラムはこんな感じ。

```
#! /usr/bin/python3
from transformers import pipeline
tgn=pipeline("text-generation","tokyotech-llm/Swallow-7b-instruct-hf",max_new_tokens=128)
nlp=lambda txt:tgn(f"以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。\n\n### 指示:{txt}\n\n### 応答:",do_sample=True)[0]["generated_text"]
print(nlp("パソコンのキーボードは，なぜABC順・五十音順ではないのですか"))
```

実行してみたところ、私(安岡孝一)の手元では以下の結果が出力された。

> 以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。
> 
> \### 指示:パソコンのキーボードは，なぜABC順・五十音順ではないのですか
>
> \### 応答:パソコンのキーボードは、キーボードの配列にアルファベット順や五十音順ではなく、QWERTZ配列を採用しています。QWERTZ配列は、英語圏ではあまり使われていない配列で、ドイツやオーストリアなどのドイツ語圏で主に使われています。

そうきたか。もう一度やってみよう。

> 以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。
>
> \### 指示:パソコンのキーボードは，なぜABC順・五十音順ではないのですか
>
> \### 応答:パソコンのキーボードは、英語圏の人が使うことを想定して作られたため、アルファベット順になっています。しかし、日本語を使う人にとっては、アルファベット順ではなく、五十音順の方が使いやすいということがあります。

まあ7bモデルだと、この程度ということだろうか。13bモデルや70bモデルも試してみたいのだが、Swallow-7b-instruct-hfですらメモリが40GBほど必要なので、私の手元のマシンだと苦しいなぁ。
MiLiveTokyoのフォトコンテストで知らんうちに入選して知らんうちに投票特別賞をとっていた話

2023/12/22

最初の注意なんですが、言葉を選んで一応書いていますが、自慢っぽくみえたらすみませんっていうのと、
合う合わないあると思うので、合わないと感じたら読むのをやめてください。

今回は「フォトコンにおいての所感」になります。
フォトコンにおいて有用な撮影テクニックの話などはしておりませんので、それを求める場合も他の記事を読んでください。

ちなみに今回投票特別賞をとったのはこの写真です
![サメひなた.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/032bcb2c-5c65-3da2-e40b-884b4b265bac.jpeg)
投票特別賞入賞は素直にめっちゃ嬉しいです、ありがとうございます。



さてMiliveフォトコンについてですが
応募しようとおもった動機→いろんなフォトコンに応募してて、その延長線上で。
締め切りの１日前か２日前に商品がtwitterで発表されてて、それが豪華だったからさらに写真枚数マシマシで応募しました。
たしか合計５点くらいかな？

締め切りなんですが、本来は12/12じゃなかったんですが、
たしか本来の締め切りの１日前に公式のtwitterのほうで、応募締め切りを12/12の12:12まで伸ばしてくれたので、
追加で合計５点くらい応募しました。
本来の締め切りまでは１～２点くらいしか応募してなかったハズ（超うろおぼえ）

Q:なんで知らんうちに入選してたの？
A:知らないッス
「Vkerリアル2023冬の会場で、来場者の投票で、選ばれる写真になりますよ」って旨の連絡がDMもリプも私に一切なかったので、
まーじで
Σ（・□・；）
こんな感じ。
ある日突然通知がきて「えっ入賞してたん！？」ってなりました。それがコレ↓
https://twitter.com/MiLive_official/status/1736683354865750380

私の写真以外にも良い写真いっぱいあるからみてくれよな↑↑↑

まあマジでびっくりしたよね。
ちなみに二位とは１票差の僅差だったとか。恨まないでくださいオナシャス！なんでもしますから！！
ちな１位はindexトラッカー3.0一個ですね
一個ォ！？どこにつけろと・・お尻は腰とかぶっちゃうしなあ
胸？
本当はおヒザに二個つけたいです


写真なんですが、普段はフレンドさんといっぱい撮ってるんですよね。
構図とかワールドとかポーズとか！！！！２人なりに考えてやってるの！！！！！
それも見てってくれよ！！！（普段はこんな写真撮ってます）
![フレンドがとったやつ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/eb20ffaf-87b7-9b7e-9baa-8afe2cd71b5f.png)
![フレンドが２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/0dac8a60-03a4-94f1-5ba5-6ef8aebf79a9.png)
![フレンドが3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/9ac45700-a0c7-683c-a0ef-c8b9f2268098.png)
![フレンドが4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/1593f04c-4a43-56ce-357c-d7d32a20cbea.png)
![フレンドが5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/7194ecea-d7cb-d153-e7e6-8d60db282ffd.png)

いい写真ばっかりですよね。
３枚目はひだりうえに光輪があるのが良いし、全体的に、目線も意識してとってもらってます、すごい（確信）
撮る時に位置とかも指定してもらったりしてる＆枚数も結構撮ってもらってるので本当に助かってます
おはツイでは撮ってもらった写真を中心に載せてるんですが（最近はストックがなくなってきて自分で撮ってる）
ＳＮＳでも以前の↑の時期は「おはツイのあの写真よかったね～」って多数のフレンドさんに言ってもらったりしてました
こんどは撮ってもらった写真で入賞したいものです
いつもありがとう～

今回まめひなた一人で、ネタ写真のために撮ったやつが当選したっていう（苦笑）
写真ってわからないものですねえ～
ちなみにこの「意気込んでつくったのがあまりＨＩＴしない」は写真・・というより創作全般あるあるみたいで、
有名な方々がよくtwitterでツィートしてますねコレ関係の

ちなみにVRの写真でも、よく撮ってる方が似たような事を言ってた可能性があるみたいです
（私はフォトコン１回しか入賞してないんで比べるのもおこがましいですが）

ちなみに今回入賞した『さめひなた』ですが、
ヒレを本来海から出して、映画『ジョーズ』みたいな感じにしたかったんですよね本来は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638409/e7b9d968-7c1b-f689-7b90-bc098ff4bac1.png)
↑こんな感じ

で、インデックス３点＆フルトラで四苦八苦してたんですが、あーもうめんどさっ
ってなってテキトーに立って撮ったのがコレです。
構図とか一切考えておらず・・ｗ
なんてこったい／(^o^)＼ﾅﾝﾃｺｯﾀｲ
結局は自然体が一番！という事なんでしょうか？
今後も記事作成や動画作成、服作成などでもこういったことはしばしありそうですね、お覚悟を。（自分への戒め）
でも本当に入賞嬉しいですね。
フレンド曰く「本人が知らなかった＝告知できなかったから、一切組織票が働いてない状態で入賞した写真」ってことで・・たしかに

というわけで、サメイベントや動画や写真の合同出演のお誘いお待ちしておりますｗｗｗ
あとフレンド各位、見せて～っていっていただければサメひなたアバター見せます！
サメひなたってゴロがいいな・・・

あとフレンドさん達へ、フォトコンあったらぜひ私に教えてください！
これからもVRで面白い事いっぱいしていきたいです！
フォトコンの応募、動画収録などなど！！ＶＲ３年目を楽しみつくすぞ～
初学者がJavascriptと戦う

# はじめに
プログラミングの勉強を始めて半年ほど。
これまではRubyやJavaなど、バックエンド側の基礎を一通り舐めた感じの学習をしてきました。
フロントの知識も一通り触れておくため、Javascriptについて、学習を進める。

# Javascriptってなんぞ？
フロントエンド側の言語の1つ。Javaとは全くの別物。
よく「HTML/CSS/Javascript」と一緒に語られることが多い。
動きやロジックを組むことができる。

個人的にバックエンドはデータベースが絡むイメージ。
フロントエンドはデータベースが絡まないロジックイメージ。

# Javascriptだけではサイトは作れない
勉強し始める前は、1つの言語で1つのサービスが出来上がっていると勝手に思っていたがそうではない。
HTMLやCSSやJavascript、その他いろいろな言語がそれぞれ絡み合って、1つのサービスやサイトの作成が行われる。

# JavascriptとHTML
HTMLに対してJavascriptを効かせるためには2つの方法がある。
* `<script>`タグでHTMLファイル内にJavascriptの記述をする。
* `<script src = "~.js">`で外部の.jsファイル(javascript)を読み込む

# 超基礎文法

### console.log();
()内の内容を検証ツールのコンソールに表示できる。
検証ツールに表示されるので、HTML上には表示されない。
文字列は`""`で出力できる。

### alert();
()内の内容をポップとして出すことができる。
文字列は`""`で出力できる。

### const/let/var
変数の設定をすることができる。
* const　変数の中身は編集できない
* let　変数の中身を編集することができる
* var　少し古め、あまり使わない

```javascript:例
const animal = "tanuki"; //上書きできない
let animalCount = 0; //上書きできる繰り返しとかでよく使うねanimalCount++;とか。
```

## if文と合わせてみる

if文はいろんな言語であるんですネ。

```javascript:if文でconstとalertを使う
const animal = "tanuki"; //変数animalの中身がtanuki

if(animal === "neko"){ //animalはneko??
    alert("neko");
}else if(animal === "tanuki"){ //animalはtanuki??
    alert("tanuki");
}else{ //nekoでもtanukiでもないの??
    alert("君の名は");
}
```

文字列が等しいか調べるときには`===`をつかうよ。

余談、`===`と`==`の違い。
`===`は厳密等価演算子、`==`は等価演算子と呼ぶ。

```javascript:余談
const left: any = null;
const right: any = undefined;

// falseと表示される
console.log(left === right);

// trueと表示される
console.log(left == right);
```

nullとundefinedは一見違うように見えるが
意味は同じなので`==`だとtrueになるのかぁ。ほえ～。

▼参考にしたサイト

https://zenn.dev/shibari_yo/articles/672a795d66f569




# DOMってなに？
Document Object Modelの略。



# 随時更新！！！！！



forとifには「;」がいらない
まずはこれだけ！Qiita 初心者向け書き方【5選】

# <font color="MidnightBlue">はじめに</font>
まずはこれだけ知っておけば、<font color="DarkBlue">視認性の高いQiitaの記事</font>が作れる！
という記事作成のTipsを「5つ」抜粋して纏めてみました。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657521/9242ce24-9c2c-7ba1-eb0b-4e19ae774999.jpeg)

# 📖 <font color="MidnightBlue">目次</font>
[- ① 見出し](#1-①見出し)
[- ② ノート記法](#2-②ノート記法)
[- ③ 引用](#3-③引用)
[- ④ コードの記述](#4-④コードの記述)
[- ⑤ 文字色の変更](#5-⑤文字色の変更)

# <font color="MidnightBlue">①見出し</font>
:::note
💡 概要
「#」を使用します。#の数が少ないほど文字は小さくなります。
:::

> ### <font color="MidnightBlue">①の記入例</font>
> ```
> # Pokémonが海外で人気の理由
> ## Pokémonの定義
> ### Pokémonの種類
> ```

> ### <font color="MidnightBlue">①の結果</font>

> # Pokémonが海外で人気の理由
> ## Pokémonの定義
> ### Pokémonの種類

# <font color="MidnightBlue">②ノート記法</font>

:::note
💡 概要
「>:::note」を使用することで、緑の枠を使用することができます。
「:::note warn」、「:::note alert」についてもご紹介します。
:::

> ### <font color="MidnightBlue">②の記入例</font>
> ```
>:::note
>情報、Tips 
>:::
>:::note warn
>注意
>:::
>:::note alert
>警告
>:::
> ```

> ### <font color="MidnightBlue">②の結果</font>
>:::note
>情報、Tips 
>:::
>:::note warn
>注意
>:::
>:::note alert
>警告
>:::

# <font color="MidnightBlue">③引用</font>
:::note
💡 概要
「>」を使用します。>の数が多いほど入れ子が深くなります。
インデントを下げることにより、視認性の向上にも寄与します。
:::

> ### <font color="MidnightBlue">③の記入例 </font>
> ```
> 引用元: NTTデータ先端技術 Intellilink Training Academy
>>　https://www.intellilink.co.jp/ita.aspx
> ```

> ### <font color="MidnightBlue">③の結果 </font>
> 引用元: NTTデータ先端技術 Intellilink Training Academy
>>　https://www.intellilink.co.jp/ita.aspx

# <font color="MidnightBlue">④コードの記述 </font>

:::note
💡 概要
「```」を用いることで、黒いコーディング画面にコードや文字を挿入することができます。
:::

> ### <font color="MidnightBlue">④の記入例 </font>
> ```
> > ```
> > ```: POINT
> > 前後に「```」をつけることで、
> > コードや文字をこの黒いコーディング画面に表示することができます。
> > ```
> ```

> ### <font color="MidnightBlue">④の結果 </font>
> ```: POINT
> 前後に「```」をつけることで、
> コードや文字をこの黒いコーディング画面に表示することができます。
> ```

:::note
💡 ④補足
「:」の前に言語を指定することで、コードに色付けをすることも可能です。
:::

> ### <font color="MidnightBlue">④補足の記入例 </font>

> ```
> ```python: コード
> print('Hello World')
> ```


> ### <font color="MidnightBlue">④補足の結果 </font>
> ```python: コード
> print('Hello World')
> ```

# <font color="MidnightBlue">⑤文字色の変更</font>
:::note
💡 概要
「<font color="">」で色を指定することで、文字色を変更することができます。
:::

> ### <font color="MidnightBlue">⑤の記入例 </font>
> ```
> <font color="ForestGreen">緑文字</font>
> <font color="MediumVioletRed">赤文字</font>
> <font color="MediumBlue">青文字</font>
> ```

> ### <font color="MidnightBlue">⑤の結果 </font>
> <font color="ForestGreen">緑文字</font>
> <font color="MediumVioletRed">赤文字</font>
> <font color="MediumBlue ">青文字</font>

# <font color="MidnightBlue">終わりに</font>
今回は初心者向けに5つの書き方をご紹介しました。
個人的な見解ですが、視認性の高い記事を書くコツは
<font color="ForestGreen">余分な情報を省き、シンプルにすること</font>だと考えています。

![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657521/87fff319-79ba-1176-bbf7-ecbcbe64cdf7.jpeg)
勉強が苦手な人の勉強方法（AWS-SAA）

# 1. はじめに

　エンジニアにとって勉強は永遠の課題だと言われています。そして今期のSREは、これまで以上に資格取得の雰囲気が熱いです。私も一応SAA(AWS Certified Solutions Architect – Associate)の取得を今期のMBOに書きました。しかしやることが多い、勉強はしたくないという言い訳で放置。そして数ヶ月が経過し、いつの間にか寒くなった天気。さすがにこれ以上は後回しにできない。頭は自然と一つの質問に執着します。合格のための最も効率的な方法は何だろう？

# 2. 最短期？いや、最低限の努力で合格したい！

　合格のための逆算が始まります。まずは他の人のSAA合格のレビューを読んでみました。勉強そのものよりも勉強法の検索により多くの時間を使った気がします。勉強が嫌いな人のパターンですよね。レビューにはUdemyの動画と模擬試験、そして過去問順に突破していくことが定番だと書かれていました。余裕を持って2,3ヶ月、早ければ1ヶ月以内に合格できるらしいです。

　しかし、当時はすでに11月。チャレンジと失敗を通じて学ぶには時間が足りません。すでに抱えているタスクもあるので動画を見ている余裕もありません。短期間の合格は無理でも、最も少ない努力で合格する方法を探そうとしました。結論から言うと、結局は**過去問から逆算して勉強する**ことでした。

# 3. 愛され続けているサイト、examptopicsの活用

　SREのダイバシティを担当している社員として、英語と日本語、韓国語でSAAについて検索してみました。共通して出てきたのがexamtopicsという過去問サイトです。以下は自分が感じたサイトのいいところです。

### 無料のサービス
　一定数の問題と機能について無料で利用でき、お金を払えばすべての問題と機能を完全に利用できます。しかし、無料のサービスだけでもカバーできる範囲が広く、試験対策には十分です。資格勉強の本を買ったり、有料のサイトを利用したりするコストを考えるとコスパはいいと思います。

### 問題の数と質
　2023年11月基準、examtopicsのSAAの問題は600問を超え、無料で利用できる問題はその半分の300問程度です。問題の下にはユーザー同士のディスカッションもあり、それを読むだけで理解が深まります。世界中の多くの人が利用している検証された問題集であること、そしてまったく同じ問題が実際のテストにも出る可能性があるということだけでもメリットは大きいです。

### 動画とハンズオンの時間を削減
　今回自分は学習のための動画を視聴しませんでした。時間のコスパ的に良くないと思いましたし、外国人である私には日本語の動画も十分難しいという単純な理由もあります。しかし問題を解く、そこからテキストで整理するだけで十分でした。それで大幅にコストを抑えることができました。

# 4. おすすめの活用法

#### チャプターを分けて問題を類型化しよう
　理論の知識がないまま問題に出会うと、パニック状態に陥ります。そのため、チャプターを分けて整理する過程が必要です。10個のチャプターがあるとすれば、問題を一つずつ該当するチャプターに連結させて整理していくのです。私は約150問題をノートにまとめることで、ある程度全体像が見えるようになりました。この段階からは多様な問題を解いてみるのが良いです。似ている問題が多いので、本番で自分が知っているキーワードが出題されれば私の勝利です。

#### 逆算する勉強方法
　問題をたくさん解くだけで合格できるといいですが、実際には難しいです。問題を解いてある程度類型化ができたら、その後ネット検索などテキストを参考にして理解を深めるのがいいです。そこで必要になるのが逆算です。とりあえず問題に出るものだけを抑えておきたい、その時に過去問はいいソースになります。

#### 試験前の最終確認に使おう
　動画と本で勉強していた人も、最後には過去問で整理するのがおすすめです。検証された情報なので確実な知識になりますし、まったく同じ問題が出る可能性もあります。私がSAAを受けた際にも過去問と同じ問題が2問ぐらいありました。以前の試験でギリギリの差で不合格だった場合には、過去問が良い解決策になりそうですよね。

# 5. 感じた点

#### ①過去問の重要性
　言われなくても過去問の重要性は大きいです。特にSAAの場合には範囲が広いため、知っている問題が1つでもあればかなりの時間とエネルギーを節約できます。また、試験が求めている類型の問題に慣れることによって主要サービスへの理解も深まります。

#### ②資格取得のための勉強の限界
　結局は資格のための勉強になってしまった点は反省ポイントです。合格したとしても、私がAWSを自由自在に操作できるわけではないからです。結局は頭の中の知識であり、実際に利用するためには追加の勉強と実践的な経験が必要です。ただ今回の経験で気づいたことがあるので、次は自分の成長のための勉強を選べることができると思います。

# 6. 勉強に使ったツール
https://www.examtopics.com/
（70%）
Udemyの模擬試験2回分（10%）
ネット検索などのテキスト（20%）
Tokyo Streamlit Meetupに参加してきた


## 目次
- はじめに
- Meetup概要
    - 1:OSSに貢献する
    - 休憩
    - 2:PyGWalker×Streamlit
    - 3:共同開発者「Amanda Kelly」からのメッセージ

- まとめ

## はじめに

この投稿はアイスタイル [Advent Calendar 2023](https://qiita.com/advent-calendar/2023/istyle) の25日目の記事です。
こんにちは。アイスタイル新卒1年目のosadamです。
今回は、12月21日(木)に開催されたTokyo Streamlit Meetupに参加してきたので、内容を簡単にまとめました。

Streamlitを現在どのように使用しているかはこちらの記事に書いています。

https://qiita.com/osadam/items/1615e26037d60e888dbe

## OSSに貢献する

StreamlitコントリビューターのYuichiroさんから「OSS(Open Source Software)に貢献する・キャリアにする」というテーマでお話しいただきました。OSSに貢献するというとかなりハードルが高いように見えますが、最初は簡単なOSSを公開するだったり、命名規則を修正するといった簡単なところから始められるそうです。
Streamlitはコミュニティを大切にしており、コミュニティから寄せられた提案や修正をよく取り入れてくれます！

https://streamlit.io/community


## 休憩

休憩には、美味しそうなお菓子とコーヒーが出ました。
クッキー、ドーナツ、ケーキ、食パン、ドーナツ......
Streamlitを触っている方なら気づいた方もいるかもしれないですが、実はこれらはStreamlitのアプリ起動時、待機画面に出てくる食べ物です！

![IMG_4588.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591633/442afc5d-e4bf-9d66-8b5a-0a2cc916e419.jpeg)


## PyGWalker×Streamlit
PyGWalker(発音：pigwalker)はSQLを書かずにtableau風なGUIでデータの可視化・分析ができるpythonのライブラリです。
今回は、最新のアップデートとしてクラスタリングと外れ値除去が紹介されました。
これらもGUI上で簡単に操作することができます。
誰もが思うあったらいいなという機能を実際に実装して行く姿勢は素晴らしいと思いました。

![IMG_4592 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591633/9d6eef57-be62-b422-fe22-2b24cc65fd2c.jpeg)


## 共同開発者「Amanda Kelly」からのメッセージ
共同開発者Amandaからは、Streamlitの誕生のきっかけから、最新のアップデートを聞くことができました。
Amandaの目指すところとして、現在困難なデータの実用化のステップを減らしていきたいと言っていました。

![IMG_4593 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591633/a89044a7-a1b1-40b4-e2ab-d4b4ae9ed8dc.jpeg)
![IMG_4594 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591633/e7200e6b-2c84-d13d-f95a-1a17945b441e.jpeg)




コミュニティの意見はとても大切にしているとのことです。
詳しくはお話できないのですが、最新のアップデート情報もあり、とても興味が湧く内容でした！

## まとめ
初開催のStreamlitイベント、とても楽しかったです！
コミュニティを大切にしている思いが強く伝わってきました。
特に、PyGWalkerについては元々気になっていたため、試しに使用してみたいと思います。
仕様について気になったこと、改善点など些細なことでも思いついたら心に留めておくのではなく、コミュニティに参加して発信していきたいと思います。

第二回の開催も待っています！
goenvからGoオフィシャルのバージョン管理に切り替える

goenvでのバージョン管理をやめて、Goでのバージョン管理に切り替える事になったので、  
goenvのアンインストール方法と、Goオフィシャルでのバージョン固定方法を記載します。

## 手順

### 前提

* [anyenv](https://github.com/anyenv/anyenv)経由で[goenv](https://github.com/go-nv/goenv)をインストールしている。
* macOS Ventura

### goenvのアンインストール

goenv経由でインストールしているGoをアンインストールする。

```zsh
$ goenv versions
  1.20.3
* 1.21.0 (set by /Users/mitsuaki.ihara/Documents/01_sharefull/sharefull-backend/.go-version)
```

```zsh
$ goenv uninstall 1.20.3
$ goenv uninstall 1.21.0
```

anyenv経由でインストールしているgoenvをアンインストールする。

```zsh
$ anyenv uninstall goenv
```

### goのインストール

MacにGoをインストールする。

```zsh
$ brew install go

〜省略〜

/opt/homebrew/Cellar/go/1.21.5

〜省略〜
```

goenvをアンインストールした後だとシェルの変数が最新化されないので、
シェルを再起動した後バージョンを確認する。

```zsh
$ exit
```

シェルを起動後にバージョン確認。

```zsh
$ go version
go version go1.21.5 darwin/arm64
```

### 任意のGoのバージョンのインストール

インストールしたGoを利用し、任意のバージョンのGoをインストールする。

```zsh
$ go install golang.org/dl/go1.21.0@latest
```

```zsh
$ go1.21.0 download
Downloaded   0.0% (   16384 / 64957854 bytes) ...
Downloaded   8.9% ( 5767136 / 64957854 bytes) ...
Downloaded 100.0% (64957854 / 64957854 bytes)
Unpacking /Users/mitsuaki.ihara/sdk/go1.21.0/go1.21.0.darwin-arm64.tar.gz ...
Success. You may now run 'go1.21.0'
```

```zsh
$ go1.21.0 version
go version go1.21.0 darwin/arm64
```

インストールしたGoをメインのバージョンに切り替える。

```zsh
$ vi ~/.zshrc
```

```:.zshrc
export GOROOT=$(go1.21.0 env GOROOT)
export PATH=$GOROOT/bin:$PATH
```

sourceコマンドだとGOPROXYなど、Goの一部変数が最新化されないため、
シェルを再起動した後バージョンを確認する。

```zsh
$ exit
```

シェルを起動後にバージョン確認。

```zsh
$ go version
go version go1.21.0 darwin/arm64
```

## 参考

[【初心者向け】丁寧な Go のバージョンアップ手順](https://zenn.dev/wasuwa/articles/3d2e65516b760e)
ソフトウェアテスト技法を学ぶ ～ 組み合わせテスト

:::note info
この記事は筆者の学習をまとめたものです。
:::

## ソフトウェアテストテストを学ぼう

- 開発者も積極的にテストをしよう
- テスト専門家とコミュニケーションできるようになろう

という考えでソフトウェアテスト技法について学んでいきます。

- [同値分割法と境界値分析](https://qiita.com/blue32a/items/0bd02910356144b63cc2)
- [デシジョンテーブル](https://qiita.com/blue32a/items/add0dfdc24c447a5c15c)
- [状態遷移テスト](https://qiita.com/blue32a/items/ffa33b7e812b2d8d971e)
- 組み合わせテスト（本記事）

## テスト技法：組み合わせテスト

組み合わせテストとは、複数の条件の組み合わせによる欠陥を特定するために用いられるテスト技法です。複数の条件に対して全ての組み合わせ（全網羅）についてテストを行おうとすると、テストの数が膨大になる場合があります。その時に一定のルールに従って作成した組み合わせでテストを行い、発見される欠陥数に大きな影響を与えることなく、テストにかかる時間を削減することを組み合わせテストの目的としています。

## 用語「因子」と「水準」

組み合わせテストにおける用語「因子」と「水準」について説明します。まず「因子」とは、テスト対象のシステムが持つパラメータのことです。例えばラーメンの因子には麺、具、スープなどがあります。次の「水準」とは、因子が取り得る具体的な値のことです。例えばラーメンの因子「麺」には細麺や太麺などの水準があります。組み合わせテストでは、テスト対象が持つパラメータの「因子」と、その因子の具体値である「水準」に注目します。

## 組み合わせテストの技法「ペアワイズ法」

組み合わせテストの技法「ペアワイズ法」について説明します。ペアワイズ法とは、２つの因子の組み合わせを網羅する組み合わせを作成する手法です。なぜ「２つの因子の組み合わせなのか」というと、欠陥は１～２因子の組み合わせに多く存在することが知られているからです。欠陥が多く予想される２因子の組み合わせを網羅することで、全網羅よりもテスト数を削減することが狙いです。削減されたテストにより欠陥を発見することは出来ないので、**「テストの数」が減る**代わりに**「欠陥を見逃してしまうリスク」が増える**というトレードオフの関係になります。

（ペアワイズ法はオールペア法と呼ばれることもあります。基本的に同じ技法を指しているようです。）

## 組み合わせ生成ツール「PictMaster」

PictMasterは組み合わせ生成をサポートするExcelベースのフリーソフトです。ツールに因子と水準を入力することで組み合わせを生成することができます。

ツールのダウンロード先は下記PictMasterのサイトを参照してください。インストールの方法は同梱されるユーザーズマニュアルに記載されています。

:::note warn
2023年8月にダウンロード先が変更になったようです。以前の`osdn.net`からはダウンロードできなくなったようなので、下記PictMasterのサイトを参照して新しいダウンロード先から取得してください。
:::

https://ameblo.jp/pictmaster/

## 実例：ラーメンの組み合わせ

PictMasterを使ってラーメンの「麺の硬さ・スープ・具」の組み合わせを作成してみます。まずは対象の因子と水準を整理した表「因子水準表」を作ります。

### 因子水準表

|因子名|｜|水準１|水準２|水準３|水準４|
|--|--|--|--|--|--|
|麺の硬さ|｜|バリカタ|硬め|普通|柔め|
|スープ|｜|味噌|塩|醤油|トンコツ|
|具|｜|味玉|チャーシュー|海苔|ねぎ|

### PictMasterで組み合わせの生成

ラーメンの組み合わせには上記のような因子と水準があるとします。全網羅でテストしようとすると`4 × 4 × 4`で**64**の組み合わせが必要になります。全網羅にすると多くの組み合わせが必要なので、組み合わせテストの技法を使って組み合わせ削減していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595926/842af142-6a80-1531-7df6-48da2e2b1a51.png)

PictMasterの「パラメータ」の列に因子を、「値の並び」の列には因子に対応する水準を記入します。そして実行して生成されたのが次の組み合わせです。

### 生成された組み合わせ

|麺の硬さ|スープ|具|
|--|--|--|
|普通|塩|味玉|
|柔め|トンコツ|海苔|
|柔め|味噌|ねぎ|
|バリカタ|塩|海苔|
|柔め|醤油|味玉|
|普通|醤油|チャーシュー|
|バリカタ|醤油|ねぎ|
|硬め|塩|チャーシュー|
|普通|トンコツ|ねぎ|
|柔め|塩|チャーシュー|
|硬め|塩|ねぎ|
|硬め|醤油|海苔|
|普通|味噌|海苔|
|硬め|味噌|味玉|
|バリカタ|味噌|チャーシュー|
|バリカタ|トンコツ|味玉|
|硬め|トンコツ|チャーシュー|

組み合わせの数に注目してみましょう。全部で**17**の組み合わせが生成されました。全網羅だと**64**ですから、だいたい**1/4**ほどになっています。

次に「麺の硬さ」が`普通`の組み合わせに注目してみましょう。「スープ」は`塩,醤油,トンコツ,味噌`、「具」は`味玉,チャーシュー,ねぎ,海苔`の組み合わせが存在し、２因子の間で網羅されていることがわかります。

## まとめ

ソフトウェアテスト技法の「組み合わせテスト」について学習し、それを記事としてまとめました。

- 組み合わせテストとは、複数の条件の組み合わせによる欠陥を特定するために用いられるテスト技法
- 欠陥は１～２因子の組み合わせに多く存在するので、ペアワイズ法で２因子間を網羅する組み合わせを生成する
- 「テストの数」と「欠陥を見逃してしまうリスク」がトレードオフの関係になる
- Excelベースのツール「PictMaster」を使って組み合わせを生成することができる

## 参考

https://gihyo.jp/book/2020/978-4-297-11061-1

https://www.sbcr.jp/product/4815608750/
【Flutter】InputDecoration

`TextField`に見出しがないと複数存在したときにわからないな・・・と思ったら`InputDecoration`で解決できた！
``` dart
// テキスト入力
  TextField(
    decoration: InputDecoration(
      labelText: 'Name',
    ),
    // 入力されたテキストの値を受け取る（valueが入力されたテキスト）
    onChanged: (String value) {
      // データが変更したことを知らせる（画面を更新する）
      setState(() {
        // データを変更
        _name = value;
      });
    },
  ),
```

その他にも色々できるらしかったのでまとめ。

# InputDecoration とは
InputDecorationは、FlutterのTextFieldウィジェットなどの入力フィールドに関連する外観や動作を定義するためのクラス。
# labelTextとlabelStyle
labelTextは入力フィールドの上に表示されるラベルを指定し、labelStyleはそのスタイルを設定する。
``` dart
InputDecoration(
  labelText: 'Username',
  labelStyle: TextStyle(color: Colors.blue),
)
```
# hintTextとhintStyle
入力フィールド内に表示されるプレースホルダーテキストとそのスタイル。
``` dart
InputDecoration(
  hintText: 'Enter your username',
  hintStyle: TextStyle(color: Colors.grey),
)
```
# icon
iconは入力フィールドの先頭に表示されるアイコン。
suffixIconは末尾に表示されるアイコン。
``` dart
InputDecoration(
  icon: Icon(Icons.person),
  suffixIcon: Icon(Icons.visibility),
)
```
# border, focusedBorder, enabledBorder
borderは非フォーカス時の境界線。
focusedBorderはフォーカス時の境界線。
enabledBorderは有効な状態での境界線。
``` dart
InputDecoration(
  border: OutlineInputBorder(),
  focusedBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.blue)),
  enabledBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.grey)),
)
```
# errorTextとerrorStyle
エラーメッセージとそのスタイル。
``` dart
InputDecoration(
  errorText: 'Invalid username',
  errorStyle: TextStyle(color: Colors.red),
)
```
2023年にCCoEリードとしてやったこと

皆さん、こんにちは。
KDDI CCoE（*1）の柴田です。


::: note info
この記事は [CCoEクリスマス！クラウド技術を活用して組織をカイゼンした事例を投稿しよう！ by KINTOテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kinto-technlogies) の2023年12月21日の投稿です。
:::


KINTOテクノロジーズさんが手掛けるCCoEのアドベントカレンダーに参加し、
~~忙しいことを言い訳に逃げていたら~~ **何を書こうか迷っている間に1日遅れましたが、**
2023年にKDDI CCoEでやった主なことを3つ書きます！

※1：CCoE = Cloud Center of Excellence の略称。
自社内のクラウド利用推進をさまざまな形で支援・牽引する専任組織を指す。

※2：本記事は個人の見解であり、組織の公式見解とは一切関係がありません。

# KCLUVIT（クラウド利用状況可視化ツール）の開発
KDDIは、AWSを中心にクラウド活用が進んでおり、
社内部門がCCoEを頼らずともクラウドを活用することが多くなっています。

そんな状況でCCoEができることは何か。

そう考えた結果、社内のクラウド活用状況を可視化して社内に開示することで、
**クラウド活用を後押しする気づきを提供できないか？** というアイデアにたどり着きました。

CCoEという立場として **クラウドのメリットを存分に享受してほしい！** と思いながら、

+ オンプレミスのシステムをクラウドにリフトしたまでで、
サーバレスやマネージドサービスを活用するというような
真のクラウドのメリットを得られていないユースケースが多いのでは？

と感じていたり、

+ **とあるサービスの利用実績があるか知りたい！** という声に対して、
**これまでに培った人的ネットワーク伝手に聞き回って情報を入手する**

ということをしていたりと、CCoEのクセに**アナログ**な活動をしていました。

そこで、社内のAWSアカウントにあるCURと社内部署情報をデータソースに、
GlueとAthenaでETLをかまし、QuickSightでダッシュボード化することで、
社内のどの部署でどんなAWSサービスを使っているかが分かるようなツールを作り、
**KCLUVIT**と名付けて社内に展開しました。

KCLUVITは、KDDI Cloud Utilization Visualization & Insight Toolの頭文字を取ったものです。
~~英語慣れしてない日本人が考えそうなちょいダサ英語~~ カッコいい名前ですね！！

KCLUVITにより、社内クラウドユーザが意識を高めてコスト削減につなげてくれたり、
これから使おうとするサービスの社内利用実績を調べて説得材料に使ってくれたりと、
クラウド活用を後押しすることができており、作ってよかったなあ、と思っています。

ちなみにKCLUVITは、我らがみのるん @minorun365 を含む、
社内の強力なメンバーが開発に携わってくれました。

詳しくは Bigdata-JAWS勉強会 #24 QuickSight分科会 をご覧ください。
https://www.youtube.com/watch?v=KGOiv_Yuqs0


# AWS Organizationsの活用（今さら？）
KDDIではAWS Oranizationsを活用したLanding Zoneを社内展開しています。
が、**諸々の事情**より、AWS Organizationsを前提とするサービスを使えない状況でした。

社内のクラウドユーザから **~~いい加減にしろ！と石を投げつけられたこと~~** ニーズを受け、
CCoEとしてようやくAWS Organizations前提サービスの解放に動いています。

**CCoEのクセに今さら？** と思われると思いますが、諸々の事情があるんです。

一番大きい事情だと思っているのは、
KDDIが**AWS Organizationsの登場以前からAWSを使っている**こと。

今ではAWS Organizations＋SCPと、
IAM Identity CenterやContorol Towerなどを組み合わせて
Landing Zoneを設計/開発するのが普通だと思いますが、
AWS活用当初のKDDIはAWS Organizationが存在しなかったため、
スクラッチでLanding Zoneを作っていました。

そのLanding Zoneに存在するアカウントが多く、かつ本番稼働もしているため、
理論上問題ないはずなものの、おいそれと移行できずにいた、というのが実態です。

それでも最近は、Amazon CodeWhisperer や Amazon DataZoneなど、
AWS Organizationsを前提とする有用サービスが続々登場しており、
AWS Organizationsを使えないことがブロッカーになりかねなくなったため、
CCoEとして本件の解決にあたりました。

もしかしたら、AWS Organizations登場以前から
AWSを活用されているCCoEの方は同じ状況にあるかもしれません。

そういった方がいましたらぜひ ~~愚痴を聞いてください~~ 情報交換させてください！

# Trusted Advisorを使ったセキュリティ改善
これまたCCoEとして、**社内のAWSのセキュリティ管理状況って本当に大丈夫？** と、
ある日突然、**根拠もなく漠然とした不安に襲われて夜も眠れなくなってしまいました。**

そこで、相対のAWSソリューションアーキテクトやテクニカルアカウントマネージャーに泣きつき、
Trusted Advisorのセキュリティの項目の検知状況を集計し、改善を進める活動をしました。

おかげさまで、**夜ぐっすり寝られるようになりました。**（雑（笑））

# おわりに
以上、私が2023年にCCoEリードとしてやったことをまとめてみました。
いかがでしたでしょうか？

本当はもっと詳しく書きたいところですが、
~~忙しくて時間切れ~~ これ以上は社内承認を取る必要がありそうなため、
ここまでとさせていただきます。

またいずれ、別の機会に詳しい情報をお話ししたいと思います！
Merry Christmas & Happy New Year!!!
【PostgreSQL】インデックスのメンテナンス

## 初めに
インデックスは以下の理由からメンテナンスをする必要があります。

### インデックスの肥大化
PostgreSQLのインデックスは、データベースのテーブルに対する操作（INSERT、UPDATE、DELETEなど）によって徐々に大きくなることがあります。これをインデックスの肥大化と言います。肥大化したインデックスはディスクスペースを無駄に消費し、インデックスの検索性能を低下させる可能性があります。

### インデックスの断片化
テーブルのデータが頻繁に更新されると、インデックスのページ内に未使用のスペース（断片）が多くなることがあります。これをインデックスの断片化と言います。断片化したインデックスは、データの物理的な配置がバラバラになるため、データの読み込み性能を低下させる可能性があります。

### インデックスのクラスタ性の欠落
テーブルのデータが頻繁に更新されると、インデックスの順序とテーブルのデータの物理的な順序が一致しなくなることがあります。これをクラスタ性の欠落と言います。クラスタ性が欠落したインデックスは、テーブルの全体的なパフォーマンスを低下させる可能性があります。

## メンテナンスの実施
以下のような操作を行うことが推奨されます。

- `VACUUM`コマンド: テーブルとインデックスの未使用スペースを回収し、再利用可能にします。
- `REINDEX`コマンド: インデックスを再構築し、肥大化や断片化を解消します。
- `CLUSTER`コマンド: テーブルのデータをインデックスの順序に従って物理的に再配置し、クラスタ性を改善します。

ではメンテナンスをどのようなときに実施すればいいのでしょうか？

## メンテナンスの実施判断基準
肥大化についてautovacuumで定期的に実行されることが多いと思うので省きます。

- インデックスのクラスタ性の欠落
インデックスのクラスタ性の欠落に関しては事前に判断することが現状はできないため、CLUSTERコマンドを利用する際に、前後で`EXPLAIN (ANALYZE, BUFFERS)`を実施して比較、パフォーマンスが改善していたらクラスタ性の欠落があったと判断する。

- インデックスの断片化
1. テーブルのレコード数を確認します。これは、`SELECT COUNT(*) FROM テーブル名;`というSQL文を実行することで取得できます。
2. テーブルの1レコードあたりの平均サイズを確認します。これは、`pg_column_size()`関数を使用して、各レコードのサイズを確認し、それらの平均値を計算することで取得できます。
3. テーブルのレコード数と1レコードあたりの平均サイズを掛けることで、テーブル全体のデータ量を予想します。
4. インデックスの期待サイズを予想するには、テーブル全体のデータ量に対して一定の比率を掛ける方法が一般的です。この比率は、インデックスの種類や設定、使用されているハードウェアなどにより異なりますが、一般的にはテーブル全体のデータ量の10%〜30%程度とされることが多いです。

上記はインデックスと利用する前提でまとめてますが、そもそも使われていなければ削除しておくことをお勧めします。

## まとめ
PostgreSQLのインデックスは、適切なメンテナンスを行うことで、そのパフォーマンスを最大限に引き出すことができます。肥大化、断片化、クラスタ性の欠落といった問題を理解し、それぞれの対策を適切に実施することで、データベース全体のパフォーマンスを向上させることができます。

## 参考
https://developers.prtimes.jp/2022/07/07/reduce-postgresql-capacity/
GitHub Self-hosted RunnerがIPv6のせいで失敗する

# GitHub Action
GitHub ActionとはGitHubから直接CI/CD、テスト、ビルド等をできるようにするGitHubのサービスであり、コードに修正があった時、素早くサーバやクライアントにコードのデプロイをしてくれる。
デプロイやビルド作業にはサーバが必要となるが、GitHubの無料枠を使うが、今回のサービスはRaspberry PIのBluetoothを利用するため、直接ラズパイにDockerイメージをデプロイする必要があった。

# Raspberry PIにGitHub Self-hosted Runnerをインストール
GitHubのSettingsのActions→Runnersを開くと、GitHub Actionsをインストールするためのコマンドが表示される。
そのままコピペして実行したらGitHub ActionのSelf-hosted Runnerが追加されるはずだが、config途中`WRITE ERROR: The HTTP request timed out after 00:01:40.`とエラーが発生し、Timeoutしてしまう。

# IPv6 Issue
https://github.com/actions/runner/issues/2840

GitHub Issueを調べてみたところ、config.shの途中で進まなくなるissueがあり、IPv6を消したら問題なくセットアップが完了したという報告があったので、ラズパイのIPv6をオフーにしたら解決できた。

## Raspberry PIのIPv6をoffにする
`/boot/cmdline.txt`の`rootwait`の前に`ipv6.disable=1`を追記する。
`sudo shutdown -r 0`でラズパイを再起動する。
`ip a | grep inet6`で何も表示されなくなったことを確認したら設定完了。

# 再びconfig.shを実行
config.shが正常に終了し、StatusがIdleになっていることが確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640781/928275f3-b6a7-b57c-f6de-4a23e0f0b39e.png)
# サービスの登録
サービスとして登録しないと、毎回run.shを実行しないといけないのでサービスとして登録し自動的にGitHub Actionが動くようにする。
次のコマンドを打ち込んでサービスを登録する。
```
sudo ./svc.sh install
```
その後、サービスを起動する。
```
sudo ./svc.sh start
```
サービスの確認は`sudo ./svc.sh status`でできる。

最後に、再起動をしてもちゃんとGitHub上にidleになっているか確認できれば完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640781/0c047a30-c321-1c74-e538-4897c1f57d3f.png)

# 注意事項
14日以上Runnerが起動しなかった場合、自動的に登録が消されるため、再登録を行う必要がある。
社内勉強会を開いた話

# なぜ勉強会を開いたか
社内では基本的にRailsを利用してシステムの構築等を行っていました。

チーム内でActiveRecordの話題になった際に部署全体でActiveRecordとか個人で学べの方針で誰も教えたりしていないよね、という話がでました。

ActiveRecordやるならSQL知ってた方がいいよね、に話が転びチーム内の若い子にSQL勉強会とかやったら受けたい？って聞いたところ受けたいとのことだったので企画を始めました。

# 内容なにしたらいいのかわかんないよう
ActiveRecord的な勉強会ネタはチームの方に丸投げできたので、SQLを書く機会が多いデータ調査に利用しやすいものを中心に初級編・中級編で分けて作成する方針としました。

文系の大学からの就職等もある会社なので基礎の基礎から始めるかーとのことで、下記を初級編で取り扱うことにしました。

 - そもそもSELECT文とは？
     - *での取得やほしいカラムのみの取得
     - WHEREでの条件付け、よく使うシリーズ
 - サブクエリを利用した関連づいたデータの取得
 - GroupBYでの集計
 - 上記を含めたハンズオン

# 理解度テストもやりました
知識の定着の確認のため、勉強会から数ヵ月後に実施しました。
（めんどくさくて忘れてたわけじゃないよホントダヨ）

基本的な内容だったので理解は問題なさそうでよかったです。
カラムのユニークな値の取得にdistinctを利用せずにgroup byを使う人等もいて、
おもしろいなーっておもいました（小並感）