OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2のインスタンス生成からvscodeでのssh接続まで

# はじめに
夏にインターン先でAWSを触って以降AWSの良さを知ってしまい重い腰を上げて学習を始めた大学生です．この度AWSを触って実際に作業するまでの流れの中で忘れそうなことが多かったので備忘録として残します．

## インスタンス作成
### 名前とタグ
好きな名前つける(同一名ははじかれる)

### アプリケーションおよびOSイメージ
使いたいOSイメージ使う．していないならAmazon Linuxでいい

### インスタンスタイプ
デフォルトは`t2.micro`(1GiBメモリ)

### キータイプ
キーペアという鍵を設定する  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112260/ab63822e-7528-9f22-bc97-93235e60b2cf.png)
ローカルのユーザディレクトリに{keypairname}.pemをコピーしておく

### ネットワーク設定
- 個人情報とか実際のサービスで使う用途ならSSHトラフィックを指定するけどそれ以外なら0.0.0.0/0でいい
- グループルールとしてHTTP(80)とHTTPS(443)を追加する(一応)

### ストレージを設定
欲しい量だけやってくれ

## ローカルのssh設定
1. vscodeの`Remote - SSH`をインストールする  
1. 起動したインスタンス押して右上`接続`を押す
1. SShクライアントのsshコマンドをコピーする
1. vscodeのリモートエクスプローラー押して`SSHターゲット`の+を押す
1. コピーしたコマンド貼り付けして接続おわり
【Express】ミドルウェア関数スタックを勘違いしていた話

## はじめに
現在Expressのエラーハンドリングについて勉強しており、その為に公式ドキュメントを閲覧していました。

https://expressjs.com/ja/guide/error-handling.html#%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%A6%E7%90%86

「デフォルトのエラー処理ミドルウェア関数は、ミドルウェア関数スタックの最後に追加されます。」という記述があり、この「ミドルウェア関数スタック」が原因で頭を悩ませることになりました。
概要だけご説明すると<strong>「スタック」</strong>の意味が分からないという話です。

## Expressのミドルウェアについて
※本題からずれるのでExpressのミドルウェアとは何かなどの説明は省略します。

app.jsが読み込まれたときにuseメソッドやmethod(get,post,put,delete)メソッドによりミドルウェア関数がスタックに追加されます。そして、登録されたミドルウェアはスタックに追加された順に実行されます。
```javascript:app.js
const express = require('express');
const app = express();

/*
このように3つのミドルウェアをuseメソッドに渡した場合、リクエストのたびに
「最初のミドルウェア」
「2個目のミドルウェア」
「3個目のミドルウェア」
の順にコンソールに出力される。
*/
app.use((req, res, next) => {
    console.log('最初のミドルウェア');
    return next();
});
app.use((req, res, next) => {
    console.log('2個目のミドルウェア');
    return next();
});
app.use((req, res, next) => {
    console.log('3個目のミドルウェア');
    return next();
});
```

そして、エラー処理を行うミドルウェアをスタックに追加する際は他のミドルウェアより後ろの方で追加をしないとエラーハンドリングができない仕組みです。
つまり、自作のエラー処理ミドルウェアより後にスタックに追加されたミドルウェア内でエラーが発生しても自作のエラー処理ミドルウェアで対応することはできません。
そのため、Expressデフォルトのエラー処理ミドルウェアにてエラーハンドリングが行われます。

```javascript:app.js
const express = require('express');
const app = express();

/*
このように3つのミドルウェアをuseメソッドに渡した場合、リクエストのたびに
「最初のミドルウェア」
「2個目のミドルウェア」
の順にコンソールに出力される。
*/
app.use((req, res, next) => {
    console.log('最初のミドルウェア');
    //処理Aがここで行われるとする
    //処理Aでエラー発生時は自作エラー処理ミドルウェアにてエラーハンドリングを行う
    return next();
});
app.use((err, req, res, next) => {
    //自作エラー処理ミドルウェア
     const { status = 500, message = 'エラー発生' } = err;
     res.status(status).send(message);
 });
app.use((req, res, next) => {
    console.log('2個目のミドルウェア');
    //処理Bがここで行われるとする
    //処理Bでエラー発生時はデフォルトのエラー処理ミドルウェアにてエラーハンドリングを行う
    return next();
});

```
「スタックの最後にデフォルトのエラー処理ミドルウェアが追加される」ことによりデフォルトのエラー処理ミドルウェアは最後に実行されるということです。

## スタック＝データ構造のスタックではない
最初は<strong>「ミドルウェア関数スタックの"スタック"＝データ構造のスタック」</strong>と認識していました。
スタックは<strong>「LIFO(Last In First Out)」</strong>の規則でデータを出し入れするデータ構造なので
その場合一番最後に追加されたものは一番最初に取り出されて、実行されるのではないかと思ったわけです。
しかし、デフォルトのエラー処理ミドルウェアが最後に追加されて最後に実行されるという事は
<strong>「FIFO(First In First Out)」</strong>の規則であるためどういうことなのか頭を悩ませていました。
デバッグモードにてexpressのstack変数(そこにスタックに追加した関数が格納されている)の中身を見た結果
インデックスの0番地の中身＝一番最初に追加したミドルウェアであり、その後のミドルウェアを順に実行する処理もインデックスを1つずつ増やしていく形でstack変数を利用していたのでやはりデータ構造としてはFIFOっぽいです。
要するに「ミドルウェア関数スタックの"スタック"＝データ構造のスタック」は誤りという事になります。

## スタック＝コールスタックの事？
「スタック」の他の使われ方として、「コールスタック」の事を示す場合もあるそうです。
関数の呼び出しに関することなので結構有力候補だったのですが、結局のところ「コールスタック」も積み上げて取り出してを繰り返すLIFOですので、「スタック＝コールスタック」でもなさそうです。

## 結局スタックが何なのかは分からなかった
他にも自分の知らない意味をスタックが持っているのかと思い調べてみましたが
* ぬかるみ、雪などにはまって、自動車が立ち往生すること。
* 物事に行き詰る事

など関係なさそうなものが多かったです。

「技術スタック」など<strong>「スタック＝蓄え」</strong>という意味で使う場合もあるらしいですが
これは本来スタックではなくストックなのでは・・・と心の中では思っています。
ただ、「スタック＝蓄え」なら「ミドルウェア関数の蓄え」ということになり、納得は出来ます。

## 結論
スタックというよりキューだと思うし、キューじゃなければストックじゃないのかと思いました。
「ミドルウェア関数スタック＝ミドルウェア関数を貯めておく場所」という認識で勉強を進めていこうと思います。
Visual Studio の Form アプリでコンソールに出力

このように、コンソールに出力する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c4c4d0b7-56c7-8a82-8d74-d89dc312321a.png)

設定

Form のプロパティで、出力の種類を、
コンソールアプリケーションにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1e674b98-c5a9-6ed8-c474-5fe6af7ddbf0.png)

テストに使ったプログラム

```cs:Form1.cs
namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Spring clicked");
            textBox1.Text = "Spring";
       
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Summer clicked");
            textBox1.Text = "Summer";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Autumn clicked");
            textBox1.Text = "Autumn";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Winter Clicked");
            textBox1.Text = "Winter";
        }
    }
}
```
Nuxt3 × Docker環境構築（正式版）

# 概要
Nuxt3の開発環境をDockerを使って構築してみます。
※ Nuxt3が正式にリリースしたので2023/2/1に最新版に更新しました。

# 環境
- macOS Ventura 13.2
- Docker version 20.10.22
- Docker Compose version v2.15.1

# 成果物
[GitHub](https://github.com/Akira-Demizu/developments/tree/main/nuxt3)

# 構成
今回は最終的に以下のような構成になります。

```
.
├── docker
│   └── nuxt
│       └── Dockerfile
├── docker-compose.yml
└── front
    ├── README.md
    ├── app.vue
    ├── node_modules
    ├── nuxt.config.ts
    ├── package.json
    ├── tsconfig.json
    └── yarn.lock
```


# 手順
## 1. docker-compose.ymlの作成
初期構築段階では`command: sh -c "yarn && yarn dev -o"`を一旦コメントアウトしておいてください。

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

services:
  nuxt:
    container_name: nuxt
    build: docker/nuxt
    volumes:
      - ./front:/app:cached
      - nuxt_node_modules:/app/node_modules
    ports:
      - "80:3000"
      - "24678:24678"
    tty: true
    environment:
      - HOST=0.0.0.0
      - port=80
      - CHOKIDAR_USEPOLLING=true
#    command: sh -c "yarn && yarn dev"
volumes:
  nuxt_node_modules:
```

## 2. Dockerfile作成
`docker/nuxt/Dockerfile`を用意します。

```Dockerfile
FROM node:18-slim

ENV TZ Asia/Tokyo

WORKDIR /app

RUN apt-get update \
    && apt-get install -y \
    git \
    vim
```

## 3. Nuxtインストール

### 3.1 Dockerの起動
```sh
docker-compose up -d
```

### 3.2 nuxtコンテナに入る
```sh
docker-compose exec nuxt bash
```

### 3.3 Nuxtインストール準備
npx nuxi を使ってnuxt/starterをインストールします。

```sh
npx nuxi init . --force
```

正式版からは`--force`オプションをつけないとカレントディレクトリに作成できないようです。

`front`ディレクトリ直下に以下のファイルが作成されます。
- .gitignore
- .npmrc
- app.vue
- nuxt.config.ts
- package.json
- README.md
- tsconfig.json

### 3.4 Nuxtインストール

```sh
yarn install
```

### 3.5 Nuxt実行

```sh
yarn dev
```

### 3.6 確認
ブラウザからアクセスしてみましょう。

http://localhot

以下の画面が表示されていればOKです。

![スクリーンショット 2023-02-01 9.46.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/2aed5c6e-4da1-7e85-f2ea-f85b0d32b220.png)


### 3.7 コンテナから出る

```sh
exit
```

### 3.8 Docker終了

```sh
docker-compose down
```

## 4. おまけ

### 4.1 Nuxtの自動実行
`docker-compose.yml`の`command: sh -c "yarn && yarn dev -o"`のコメントアウトを外します。
すると、Dockerを起動するときにNuxtも一緒に起動してくれます。

# 最後に
Nuxt 3は開発時の起動＆ホットリロードが速いとのことでしたが、、、
体感めっちゃ速そう！！

# 参考
- [Docker composeでNuxt 3の開発環境を作成する](https://zenn.dev/szn/articles/nuxt-3-with-docker-compose)
- [Nuxt 3 - Installation](https://v3.nuxtjs.org/getting-started/installation)
- [nuxi init](https://nuxt.com/docs/api/commands/init)
Blenderボーンコンストレイントを名前基準で一括設定

Blenderでリグを作成する場合に
実際にオブジェクトの変形に使うボーンと　IK等の計算をするボーンを分けて作成する場合があります
そんな場合に「回転コピー」等のコンストレイントを一つ一つ設定するのは面倒なものです。
![22092901.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/cada97b4-3669-f5bb-721a-fcc5761d1417.gif)

そこで選択ボーンにコンストレイント設定するスクリプトを作成してみたのでメモ
（多分　探せばいっぱい出てくるだろうけれど　自分の学習目的です）

```py:
import bpy
target_hedder = "IK_" #設定のターゲットにしボーンに付いている接頭語
obj = bpy.context.active_object
bone_names = obj.data.bones.keys() #選択したオブジェクト内のボーン名の一覧
for pose_bone in obj.pose.bones:
    if pose_bone.bone.select:
        name = pose_bone.name
        target_name = target_hedder +name
        if target_name in bone_names:
            # 回転コピーコンストレイントの設定
            # トランスフォームコピーの場合は'COPY_TRANSFORMS'
            constraint = pose_bone.constraints.new('COPY_ROTATION')
            # 同一アーマチュアオブジェクト内のボーンなので　ターゲットは現在のオブジェクト
            constraint.target = obj
            # ターゲットボーンの名前
            constraint.subtarget = target_name
            # 変形の元になる座標空間　デフォルトのままでも問題ないかもしれない
            constraint.target_space = 'POSE' # Default 'WORLD'
            constraint.owner_space = 'POSE'
```
名前を基準にターゲットのボーンを探しています
必用に応じて内容を書き換えて使用してください

## ボーンのリネーム
このスクリプトは　ボーンの名前がきちんと対応するようにネーミングされているのが前提になります
基準のボーンから　IK用のボーン等を作成する時のリネームに使える小ネタを一つ

編集メニューの　「名前を一括変更」で　ルールに従ったオブジェクト等の名前変更ができます
ここで右上のプルダウンからボーンを選択することで　編集中のボーンの名前を一括変換できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/605428f8-07ee-aa74-4181-1bd78a942ef7.png)
キャプチャのようにタイプ「名前を設定」を選ぶことで頭に付ける文字や　最後に付ける文字を設定するこができて
右側にある+ボタンを追加することで　同時に違った処理を追加することもできます
ここでは「検索と置換」を追加して　置き換え部分を空白にすることで　複製した時にできる末尾の番号を消しています

何かの参考になれば幸いです
【Unity Asset紹介】Prefab World Builderというステージ制作高速化ツール

# はじめに

最近買ったアセットで「[Prefab World Builder](https://assetstore.unity.com/packages/tools/level-design/prefab-world-builder-185406)」というものがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/9feefd6c-f003-4da7-5f2a-4c082961277b.png)
このアセットは3Dのステージ作りが高速化できる便利ツールです！
例えばパスに沿ってPrefabを設置したり、物理演算を入れて落下設置したりできます！
特にこの落下設置が魅力的で、無造作に設置したいときにかなり重宝します！

# 動作環境
- Windows 10
- Unity2021.3.8f1
- Prefab World Builder v2.7.1
- POLYGON Farm - Low Poly 3D Art by Synty v1.2

# できること
## 設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/7fea747d-bde2-9f02-47cc-9c2bbc79db1a.png)
まずは単純に設置ができます。
ただし上の画像のように面に沿って設置することができたり角度や大きさをランダムに変化させて設置することもできます！

## まとめ設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/1a80ef3a-65d5-6e73-c438-dedce30ef56d.png)
次に一つだけでなくまとめて設置することもできます。
ブラシサイズを変えたりこれも面に沿って配置できます！
複数のPrefabをブラシに設定して設置することも可能です！

## 落下設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/df2a9b10-2520-936a-7fa9-c49410abbf29.png)
<b>これは推しの機能です！</b>
物理演算によって落下設置することができます！
これによって上の画像のような「無造作に缶を置く」というのを実現できます！
設定によって質量や抵抗を設定することも可能です！

## パス上設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/9e12519c-e78e-df43-d104-07660bc5f3e6.png)
次はパス上設置です。
これはCinemachineのDollyTrackやSpline系ツールのようにパスを設定してそこに設置することができるものです！
柵の設置などに使えそうです！

## 図形上設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/ea6f0779-3057-ca67-afc8-38ad9476de5c.png)
次は図形上設置です。
これは簡単な多角形に沿って設置することができるものです！
幾何学的に設置したいときに使えそうです！

## 敷き詰め設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/43c68657-9db9-5afc-3d5f-5b6ad74832a7.png)
次は敷き詰め設置です。
上の画像のように範囲を設定することで等間隔に敷き詰めて設置できるものです！

## 差し替え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/33d108ef-0c4d-9f52-15bb-3f1ad78b282b.png)
次に差し替えです。
指定した範囲の設置したPrefabを別のPrefabに差し替えることができます！
これによって設置->なんか違う->消す->設置の「消す」操作を短縮できます！

## 消しゴム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/f3677739-4b8c-9771-6a41-7536bc9fb011.png)
次は消しゴムです。
範囲指定したものを削除することができます！
まとめて消すことができるので便利です！

## 押し出し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/f4cb20ef-3ea2-0948-47fa-a63438f42c7d.png)
次に押し出しです。
上の画像のように選択したものを押し出して複製することができます！
積み上げたいときなどに使えそうです！

## ミラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281232/fffae7e8-a10c-57df-fcfd-50e5610026d8.png)
次はミラーです。
選択したものをミラー設置することができます！
ミラー設置したいときはよくあるのでこれもかなり便利ツールです！

## まとめ
主な便利機能はこんなものです。
その他にも多数の細かい機能があるので是非使ってみてほしいです！

# リンク
[Prefab World Builder](https://assetstore.unity.com/packages/tools/level-design/prefab-world-builder-185406)
[POLYGON Farm - Low Poly 3D Art by Synty](https://assetstore.unity.com/packages/3d/environments/industrial/polygon-farm-low-poly-3d-art-by-synty-146192)
OPAL (Open-Policy Administration Layer) について

:::note warn
この記事では Open Policy Agent (OPA) の説明は割愛しています。
:::

## 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49924/d12c149f-a13a-a24c-6499-a0ef63e99624.png)
OPAL (Open-Policy Administration Layer) は、データストアに保存された Data と Policy の変更を検知して、それらをリアルタイムで OPA に同期する OSS [^1] で、OPA に設定する Data/Policy の管理の難しさを解決するために開発されました。GitHub リポジトリは https://github.com/permitio/opal で、公式サイトは https://www.opal.ac です。

## アーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49924/f7ccd713-d161-7857-9495-0010c5f50096.png)

OPAL は OPAL Server と OPAL Client から構成されています。なお、上図の青線は Data がやりとりされる流れを、紫線は Policy がやりとりされる流れを示しています。

### OPAL Server

OPAL Server は OPAL Client 向けに、設定を取得するための REST API と Data/Policy の更新を受け取る Pub/Sub チャネルを作成するための WebSocket エンドポイントを提供します [^2] 。OPAL Server は Git リポジトリ (他に S3 や SVN もサポート) を追跡して、Data/Policy の変更を検知したら Pub/Sub チャネルを介して OPAL Client に差分をプッシュする役割を担っています。

OPAL Server をスケールアウトさせたい場合は、Redis、Kafka PostgreSQL Listen/Notify など、バックボーン Pub/Sub をバックエンドに用意して、各 OPAL Server でデータを同期させる必要があります [^3] 。このようにすることで、ある OPAL Server に接続している OPAL Client は、他の OPAL Server で発生した更新の通知も受け取ることが可能になります。

### OPAL Client

OPA に同居する形でデプロイされて、OPAL Server や他のデータストアで管理されている最新の Data/Policy を OPA に反映する役割を担っています。OPAL 導入時には、サービスのアプリケーションに OPA と OPAL Client が Sidecar として配置されるイメージです。

OPAL Server 以外に設定可能なデータソースとして、HTTP API、PostgreSQL、Salesforce、Stripe などがサポートされています。この外部のデータソースから Data を取得する部分は拡張可能な仕様になっています。

## さいごに

この記事では、OPAL の概要やアーキテクチャを簡単にまとめました。OPAL を導入することで OPA の Data/Policy を管理しやすくなるので、OPA 運用で課題を抱えている方は、導入を検討してみても良いでしょう。

## 備考

OPAL は Python 3 で実装されていて Python パッケージとして公開されています。

- https://pypi.org/project/opal-server
- https://pypi.org/project/opal-client

Python パッケージの他にも Docker イメージや Helm チャートも公開されています。

- https://hub.docker.com/r/permitio/opal-server
- https://hub.docker.com/r/permitio/opal-client
- https://hub.docker.com/r/permitio/opal-client-standalone
- https://github.com/permitio/opal-helm-chart

[^1]: Permit.io 社 (旧 Authorizon 社) から2021年4月に OSS として公開されました, https://twitter.com/opal_ac/status/1382347228250058760
[^2]: API フレームワークとして [FastAPI](https://github.com/tiangolo/fastapi) と [FastAPI Websocket Pub/Sub](https://github.com/permitio/fastapi_websocket_pubsub) が採用されています
[^3]: OPAL Server のデータ同期は [Broadcaster](https://github.com/encode/broadcaster) で実装されています
多変量解析概論

#多変量解析とは
>多変量解析（英語版）（たへんりょうかいせき、英: multivariate analysis）あるいは多変量統計（英語版）（たへんりょうとうけい、英: multivariate statistics）とは、複数の結果変数からなる多変量データを統計的に扱う手法。主成分分析、因子分析、クラスター分析などがある。一般に、多変量解析を行うためには計算負荷が高く手計算ではきわめて困難だが、コンピュータの発展により、容易に実行できるようになった。
>近年では共分散構造分析（「構造方程式モデリング」とも言う）が普及してきている。一方、探索的多変量解析で総称される各種の手法がデータマイニングなどでよく使われるようになっている。
（https://ja.wikipedia.org/wiki/%E5%A4%9A%E5%A4%89%E9%87%8F%E8%A7%A3%E6%9E%90 より引用）

多変量解析とは、ある現象に１つ以上の数値（要因・要素）の大小、有無などが関係しており、そのような数値が結果に対してどのように関わっているのか、もしくはいないのかということを調べ、今後どのような結果になるかを予測しようというもの。

１つ以上の数値（要因・要素）は大きく分けて以下の４つに大別される。

1. **名義尺度：**<br>
「質」に関わる尺度（要素）でそれぞれ異なる名義尺度同士を比べたり、大小を比較したり出来ない。
加減乗除のいずれも出来ない（しても意味がない）尺度のこと。
（例）性別・人名・職業・名前・電話番号・地域・等

2. **順序尺度：**<br>
名義尺度と同じく「質」に関わる尺度で、順序にのみ意味があり、尺度同士を比べることは出来ても足したり引いたり出来ない。
（例）「甲・乙・丙」「長男・次男・三男」「暑い・涼しい・寒い」「悪化・変わらず・改善」
足し算や引き算が出来ないのは、例えば「暑い」と「涼しい」の差と、「涼しい」と寒いの差が同じとは限らないため。

3. **間隔尺度：**<br>
「量」に関わる尺度で、それぞれの間隔に意味がある。「暑い」「涼しい」「寒い」は、上記の通り順にのみ意味があるが、これを「0℃・15℃・30℃」すれば、それぞれの間隔が等しくなり、間隔尺度として取り扱うことになる。
足したり引いたりは出来るが掛けたり割ったりは出来ない。15℃に15℃を足して30℃としたり、30℃から15℃引いて15℃とすることも出来るが、30℃と15℃を比べて、暑さが「2倍になった」とはいえない他にも、偏差値や、IQの数値などがこれに当てはまる。

4. **比率尺度：**<br>
「量」に関わる尺度で、0にも、それぞれの数値の比率にも意味がある。
加減乗除を行うことが出来る。一般的にいう物理量である。
質量・距離・大きさ・金額等
数学一般でいう「数」の事。

**その分類を間違えると多変量解説において後々大きなミスリードを来すので注意が必要。**
slackの/remindで指定できる日時いろいろ

# はじめに

[slackのリマインダー](https://slack.com/intl/ja-jp/help/articles/208423427-%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)をご存知でしょうか？
確認しなきゃいけないメッセージが来てるけど、今は手が離せないから未読のまま放置しよう......！ みたいなことをせずに済むようになるかもしれません。

## `/remind`とは

- GUIから設定できる「後でリマインドする」を、好きなメッセージ、好きなタイミングで指定できるコマンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/fdd67803-b275-bb50-f1f5-a4f8ba271061.png)

- 使い方はこんな感じ
    ```text
    /remind me
    Hello
    in 3 minutes
    ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/691e0c39-ba5c-35ac-3042-cba766962d6c.png)

## 形式

>/remind [@someone or #channel] [what] [when]

### いつリマインドするかの指定

whatはメッセージ部分になるので何でも書けるのですが、whenは今の所(2024/09/08)英語じゃないと認識してくれません。

```text
/remind me
進捗確認
毎週金曜日
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/cc09a31e-326d-e455-5ec5-982c934cfd64.png)

なので、指定できる色々をメモしておきます。新しいのに気づいたら順次追加予定です。

# 簡単なやつ

- 今日のいつ：`today 19:30` ※today省略可能
- 明日のいつ：`tomorrow 9:00`
- 次のX曜日： `next tuesday`

# X分後

`in 20 minutes`

`in 30 seconds`も`in 2 hours`もできます
`in 3 weeks`でX週間後に

# 毎週

`every friday`

時刻もつけれる
`every friday 15:00`

※時刻をつけないとデフォルト設定の時刻にリマインドされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/ca1b9aad-b8ed-4fa8-86b0-88ca673669e3.png)


# 毎月

https://slack.com/intl/ja-jp/help/articles/4417526840723-%E6%AF%8E%E6%9C%88%E3%81%AE%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E7%B5%8C%E8%B2%BB%E3%82%92%E7%94%B3%E8%AB%8B%E3%81%99%E3%82%8B

`on the 28th of every month`

時刻もつけれる
`on the 1st of every month 7:00`

# 2週間に一回

`thursday biweekly`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/f7fe30b5-4d84-aa9d-ef00-df0b941d95a3.png)

# 毎年

`on February 16th of every year 9:00`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/59f7e4c8-98f5-25af-f2c2-67b0d07454c6.png)
【Go言語】Windows10環境でLinux用の実行ファイルを作成する

# そもそも
Windows環境で go build するとWindows用の実行ファイル(.exe)しか作成されないので、その他のOSに対応した実行ファイルをWindows環境で作成してみます。とりあえずLinux版から。
今回の環境は以下の通り。

## 今回使用する環境

### 1. OS
　エディション： Windows 10 Pro
　バージョン： 21H2

### 2. 使うもの
* [MinGW-w64](https://www.mingw-w64.org/)
   * MinGW(Minimalist GNU for Windows)は32bit環境向けのため、64bit環境向けの派生版MinGW-w64をインストールして使用します。

## 1. MinGW-w64のダウンロード
[MinGW-w64のダウンロードページ](https://www.mingw-w64.org/downloads/)でWindows版（MingW-W64-builds） を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/0bbb4843-9f32-b4e7-c6b1-5c83f12bf959.png)

SourceForgeへのリンクが表示されるので選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/e7c5ee85-1f2b-3131-8d01-017bf3fb94a8.png)

ダウンロードボタンの下にある mingw-w64 [親フォルダ](https://sourceforge.net/projects/mingw-w64/files/mingw-w64/)のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/47eeace4-d692-ebc0-852c-e9b3222d441f.png)

リンク先のページの下部にあるx86_64-posix-sjlj リンクを選択してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/4ec01801-ce6b-788d-bdd8-96b55407ee72.png)



## 2. MinGW-w64のインストール
ダウンロードしてきた7zファイルを解凍します。　（結構時間がかかります）
7zファイルで圧縮されているので[7-zip](https://sevenzip.osdn.jp/)を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/39535740-2557-1035-92fd-2911c68eec20.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/f2f1f242-4aa8-fa23-3031-a433e85ac531.png)

解凍後のbinフォルダにPATHを通します。
今回の場合、D:\mingw\mingw64\bin　です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/ec87b5e9-80aa-188f-b286-9a8e7df44d2d.png)

システム環境変数Pathに先ほどのbinフォルダを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/e1115e57-bf0e-58e3-6137-98d8072d061c.png)


コマンドプロンプトを起動して、適当なフォルダで以下のコマンドを実行してPathが設定できたかどうか確認します。
```CMD
gcc -v
```
表示された出力された情報の最終行にバージョン情報が出ていればPathは設定できているはず。（今回は8.1.0)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/535778a1-9bbd-0075-63cf-0c5ee656725b.png)

## 3. Linux版実行ファイルのビルド
コマンドプロンプトを起動して、以下のコマンドでテストコードをビルドします。
```Go
cd {テストコード hello.go のあるディレクトリパス｝
SET GOOS=linux
SET GOARCH=amd64
go build hello.go
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/a8eea305-25f6-8697-5dba-9f091438ebbe.png)
ビルドにかなり時間を要しますが、Linux用の実行ファイルがビルドされれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/70896fb0-a1d7-5b7e-be31-8e58e48b77f6.png)


【関連記事】
* [Go開発環境構築(Windows)](https://qiita.com/mochico_chicken/items/a37441813dc63dd87464)
【小ネタ】Terraformで256文字以上の長いTXTレコード(DKIMなど)をRoute53に定義したい場合は

Terraformで長いDKIMなどのTXTレコードをRoute53に定義したい場合、長すぎるせいでRoute53に拒否されます。

そもそもTXTレコードは255文字を超えてデータを保持できません。

> The format of each constituent string within the DNS TXT record is a single length byte, followed by 0-255 bytes of text data.
>
> [RFC 6763. DNS-Based Service Discovery](https://www.ietf.org/rfc/rfc6763.txt)

こういう場合、[Route53のヘルプ](https://aws.amazon.com/jp/premiumsupport/knowledge-center/route53-resolve-dkim-text-record-error/) では下記のように記載されていますが、

> DKIM キーの値を 2 つの部分に分割し、各部分を二重引用符で囲みます。例えば、"long_string" の値は "long_""string" に分割します。

これをやろうとして、いざTerraformでの書き方となると、「ちょっとよくわからない」となるので、下記を参考にしてください。

```terraform
resource "aws_route53_record" "too_long_dkim" {
  // ...

  type = "TXT"
  records = [
    # 255文字に入り切らないので、分割する
    format("%s\"\"%s",
      "適当に255文字を超えない範囲の文字列",
      "残りの文字列"
    )
  ]
}
```

結局、`foobar` という文字列を分割する場合、 `records = ["foo\"\"bar"]` という文字列を入れればいいということです。`records = ["foo", "bar"]` とやってはいけません。
Xcode+Adobe XDで作成したアイコンをXcodeのstoryboardに反映させる


# はじめに
現在、個人的にiosアプリ開発を行うにあたってAdobeのXDとXcodeを使用しているのですが、
アイコンの作成～Xcodeまでの反映の流れがまとまっているものがなく、
転々と調べていたため、メモ程度に記事投稿をしようと思います。
同様の組み合わせでアプリ開発を行おうと思っている方のお役に立てれば幸いです。
# 本題

STEPは全部で4つになります。

1. XDでアイコンを作成する
2. XDで作成したアイコンの書き出し
3. Xcodeに書き出したアイコン画像を反映させる
4. Xcodeのstoryboard上でViewに画像を反映させる

### 1. XDでアイコンを作成する
まずは、アプリで使用したいアイコンをXD上で作成を行います。
XD上の機能だけで作成しても良いですし、商用利用可能なフリーアイコンなどのサイトから
好みのアイコンを取ってきて、それをアレンジして使用するのも良いと思います。
自分は今回以下のアイコンを作成しました。
![スクリーンショット 2022-09-29 12.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295486/0f98b3ac-e9fd-daa8-e1b6-440b82aedd7c.png)


フリーアイコンの以下のサイトが非常に使いがってがよく、商用利用も可能なためお勧めです。

・icooon-mono　https://icooon-mono.com/

### 2. XDで作成したアイコンの書き出し
アイコンの作成ができたら、画像として書き出したいアイコンを選択して、
左上の「ファイル」→「書き出し」→「選択したオブジェクト...」で書き出しを行います。
今回はPNGで書き出しを行い、使用しました。
![スクリーンショット 2022-09-29 12.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295486/7f94106f-8e20-f833-e962-6dfe12021c2e.png)


### 3. Xcodeに書き出したアイコン画像を反映させる
XDからローカルにアイコン画像を持ってくることができたら、
FinderからXcode左側のファイルに対してドラッグ&ドロップをします。

画像のように対象のアイコン画像が反映されていればOKです。
![スクリーンショット 2022-09-29 12.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295486/86c65910-ab6d-e2ba-753a-a23f40f7b73d.png)


### 4.Xcodeのstoryboard上でViewに画像を反映させる
Xcode上に画像を持ってくることができた後は、反映させたい対象のstoryboardを選択します。
そうしたら、Object LibraryからImage Viewをstoryboard上にドラッグ&ドロップします。
XcodeのバージョンによってUIが一部異なるかもしれませんが、
右上のプラスボタンからObject Libraryを開いて、Image Viewを選択できます。
(自分のバージョンは14.0です)

storyboard上にUIimageViewが表示されたら、UIimageViewを選択し、
右側の調整画面、imageのプルダウンからアップロードした画像を選択します。

![スクリーンショット 2022-09-29 13.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295486/80f69849-5feb-46fc-89ea-545888d39ac7.png)


アスペクト比が崩れてしまう場合は、調整画面のContent Modeから
Aspect Fitを選択してください。

![スクリーンショット 2022-09-29 13.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295486/bd334612-19b0-1545-38e4-795e656537ec.png)


これで、XDからXcodeに作成したアイコンを反映させる手順は完了です。

# 参考文献
参考にさせて頂いたサイト
https://rara-world.com/swift-image-layout-aspect/

# 最後に
一連の流れをぱっと把握できるものがなかったため、メモ程度に投稿しました。
最後まで読んで頂き、有難う御座いました！
flashに複数行を表示する方法について

## 環境
Rails5.2
Ubuntu20.4
Bootstrap5

## はじめに
flashに複数行を改行付でセットし、BootstrapのAlertに、箇条書きで表示する方法について書いてみました。

## 解説
flashに表示する複数のメッセージを、msg変数にセットします。
```test_controller.rb
msg = []
msg << "メッセージ１"
msg << "メッセージ２"
msg << "メッセージ３"
```

msg配列から１要素づつ取得して、notice変数に文字列としてセットします。文字列の最後に、HTMLの改行**br**をセットします。brはmsg配列の最後の要素にはセットしません。
```test_controller.rb
msg.each_with_index do |val, idx|
    notice += "・ " + val
    notice += "<br>" unless (msg.length == idx + 1)
end
flash[:notice] = notice
redirect_to test_url
```

HTMLの**br**を有効にするために、**html_safe**を付加します。html_safeをつけなければ、brが文字列として表示されることになります。
```application.html.slim
- if flash.notice.present?
	.alert.alert-success = flash.notice.html_safe
```

## 表示のされ方
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/f8e16158-6aa1-1ca2-fcd8-45c52af8eb79.png)
【Databricks】クラスターが起動しない場合にはログをたどってみればよい件

# はじめに
Databricks でクラスターを立ち上げようとした際、なぜかクラスターが立ち上がらないことが過去に一度だけありました。
起動ボタンを押しても、数分後には何もなかったかのようにクラスターが停止している状態です。

起動できない原因がわからなかった時に、どうやらログをたどることによってクラスターの状態を確認できることを知りました。
特に難しい内容ではありませんが、意外に知らない方も多いのではないかと思いまして豆知識として共有します。

今回は、Azure Databricks を利用します。

# 本記事のゴール
以下を本記事のゴールとしております。
- クラスターのログの確認手順がわかる
- どのようにログが管理されているのかを仕組みで理解する
- ログからクラスターの詳しい状態(なぜ起動できないか)を確認できる

# ログを確認してみる
クラスターのログを確認していきましょう。

まず、適当なクラスターを用意します。
サイドバーの「Compute」から対象のクラスター名をクリックします。
ログを確認するだけなので、その時点でクラスターは起動していなくても特に問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704291/eefb7a19-2cdd-048d-f9e0-07d63e4e4edb.png)

次に「Event log」を押していただくとログの一覧が確認できます。
非常にシンプルな構成です。
- Event Type - クラスターに起こったイベントの種類
- Time - イベント が発生した時刻
- Message - イベント に対するメッセージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704291/0e9ec919-473d-2702-de97-1dd8aaa6b0f3.png)


上記の画像を見てみると Event Type から以下のような流れでクラスターのログが記録されていることがわかりますね。
- STARTING - クラスターの起動
- RUNNING - クラスターは起動中
- DRIVER_HEALTHY - ドライバーは正常
- TERMINATING - クラスターの停止

上の流れはあくまでクラスターが正常な場合になります。

以前クラスターが起動しなかったときは、STARTING の後にすぐ TERMINATING とログが記録されていました。
RUNNING や DRIVER_HEALTHY がなかったので何かしら問題が起きていることが予想されます。

詳しい状況は、該当する TERMINATING をクリックすれば確認できます。
以下の画像は実際のクラスターが起動しなかったときの停止状況です。

![2022-08-03_14h27_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704291/4c90c5c4-0928-402d-b82e-f39f9c803bd0.png)

エラーメッセージが表示されているので、トラブルシューティングに役立てることができますね。

上記の画像のエラーは一時的なもので幸い大きな問題ではなさそうです。
少し時間をおいたらクラスターの起動が再びできるようになってました。

# まとめ
クラスターのログを確認するまでの手順や詳しい状態の確認について解説しました。
クラスターのログまで確認することは普段そこまでないかとは思いますが、もしもの時に役立てられるとよいかと思います。
【Laravel / Rails】bulk insertについてまとめ



一度に複数のデータを1回のクエリでインサートしたいとき(bulk insert)、insert

## PHP/Laravel

クエリビルダの```insert```メソッド

```php
DB::table('users')->insert([
    ['email' => 'picard@example.com', 'votes' => 0],
    ['email' => 'janeway@example.com', 'votes' => 0],
]);
```
https://readouble.com/laravel/9.x/ja/queries.html

先輩エンジニアに聞いたところ、「bulk insertは使うとしたら100万件くらいのデータ量の場合だが極力使わないほうがいい」とのこと。
今回のプロジェクトではデータ量がそこまで大量ではなかったため、bulk insertは結局使わないことにした。
下記記事も参考になった。

https://zenn.dev/naoki_oshiumi/articles/648a00bcd4d209

ただ、調べるとLaravel8から```upsert```メソッドが使えるらしい。
今まで```updateOrCreate```を使用していた場面で```upsert```を使えば1つのクエリで複数の「アップサート」を実行できるので便利そう。

https://readouble.com/laravel/9.x/ja/eloquent.html#mass-assignment



## Ruby/Rails

別プロジェクトで下記のgemを使ってbulk insertしていた。

```ruby
books_attributes = [
  { title: "Book 1", author: "George Orwell" },
  { title: "Book 2", author: "Bob Jones" }
]
books.import(books_attributes)
```

https://github.com/zdennis/activerecord-import

Rails6以降は```insert_all```メソッドが追加された。

https://railsdoc.com/page/insert_all

## まとめ
bulk insertを使うかどうかは各プロジェクトやエンジニアの考え方によるので、一概に決めつけず柔軟に考えられるようにしたい。
CUIについて

# 目的
エンジニアの基本的な知識として，CUIについて学ぶ


# CUIとは
CUI : Character User Interface
別名 CLI : Command Line Interface

CUIは文字で入力操作を行う方式である．
下記の画像のように画面上にはテキストのみが表示され，入力もテキストのみで行う．

<img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/ce0d3399-2e06-094e-e1d0-fbae7fbd17c2.png>

一般的にWindowsなどでは，GUIが搭載されている．
GUI : Graphical User Interface
こちらは，マウスなど文字以外の入力機器も使い直感的な操作が可能となっている．

# CUIの特徴

- 操作性がシンプル
- スクリプトによる処理の自動化がしやすい
- コマンド入力だけのため，手順の記録や共有が簡単
- テキストを表示するだけなので，リソースがそれほど必要ない

デメリットはコマンドを覚えなければならず，初心者には扱いづらい．

# ディレクトリについて

ディレクトリはWindowsでいうフォルダと同じものである．
CUIでは，自分が現在どのディレクトリを開いているのかわからなければ，
プログラムの位置などが不明となり作業ができない．
ディレクトリは階層的になっているため，現在のディレクトリの情報や
他のディレクトリへの移動は非常に重要．

# 絶対パスと相対パス

パスとは目的のファイルがどのディレクトリにあるのかを示す経路のようなもの．

## 絶対パス

ルートディレクトリ(一番上のディレクトリ)からのパス
ユーザの現在のディレクトリがどの位置でも絶対パスは変わらない．

## 相対パス

ユーザが現在作業しているディレクトリからのパス．
絶対パスと違い，作業ディレクトリからの経路のため，作業ディレクトリが異なれば，パスも変わる．

## パスの書き方

```
/ ルートディレクトリを指す．
. 現在のディレクトリを指す．
.. 一つ上のディレクトリを指す．

/home/hoge/test/test.csv 絶対パスでの書き方
./hoge/test/test.csv 相対パスでの書き方
```

# 基本コマンド

## pwd
カレントディレクトリを表示

## ls
カレントディレクトリ内のディレクトリとファイルを表示

## cd
ディレクトリ移動

## mkdir 
ディレクトリ作成

## rm
ファイルの削除
rm -rf はディレクトリを中身のファイルごと削除する

## mv 
ファイルやディレクトリを移動
名称の変更にも使用

## cp
ファイルやディレクトリをコピーする

## history
過去に入力したコマンドの一覧を表示

# 便利な機能

Ctrl + R
過去のコマンドから特定の文字列を含むものを検索

上下キー
直前のコマンドを表示

tab補完機能
コマンドの入力途中でtabキーを押すことで残りの部分を補完してくれる．

Ctrl + A
コマンドラインの最初の文字に移動

Ctrl + E
コマンドラインの最後の文字に移動

Ctrl + K
カーソル位置より後ろの文字を切り取り

Ctrl + Y
切り取った文字列を貼り付け
PBS Professionalでnon prime time queueを作成する

# はじめに

PBS Professionalでnon prime time queue (NPTQ)を作成する方法を残しておきます。

ここでnon prime time (NPT)とは、平日夜間・早朝、土日、祝日等の勤務時間外のことです。NPTQに登録されたジョブは、NPTになると実行されます。そのため、計算負荷のかかるジョブをNPTQに登録することで、勤務時間中に計算サーバ―が占有されることを回避できます。例えばデフォルトのキューをworkq、NPTQをnp_queueとすると、長くて数十分で終わるような計算はデフォルトのworkqに登録し、数時間かかるような計算はnp_queueに登録するという運用を行うことになります。
多数のユーザーが使用するような大学のスパコンなどではもっと高度な運用が行われていますが、会社で数十人が使用するレベルならばprime time queue(PTQ)とNPTQを設定し、ユーザーの使用リソース制限を加えれば十分満足できるサーバー運用ができます。

# NPTQの作成

PBS Professionalでは、npから始まるキュー名をつけるとnon prime time queueとなります。

```terminal
$ qmgr -c "create queue np_queue"
```

# NPTの設定

NPTは```$PBS_HOME/sched_priv/holidays```で設定します。

```text:$PBS_HOME/sched_priv/holidays
# Year
YEAR 2022
# 平日、土日、祝日のNPTの指定
# Day of week, PT start, NPT start
weekday  0800 1900
saturday none all
sunday   none all
# 祝日
# Days from the begging of the year, Month, Day, Holiday name
1  Jan 1  New Year's Day
10 Jan 10 Coming-of-Age Day
...
```

祝日のリストは、Pythonのholidaysパッケージなどを使って作成できます。holidaysを使って会社独自の休日（年末年始休暇など）を追加することも可能です。

```Python
import holidays as hd
import datetime as dt
import pandas as pd

HOLIDAY_NAMES = {
    "元日": "New Year's Day",
    "成人の日": "Coming-of-Aged Day",
    "建国記念の日": "National Foundation Day",
    "天皇誕生日": "Emperor's Birthday",
    "春分の日": "Vernal Equinox Day",
    "昭和の日": "Showa Day",
    "憲法記念日": "Constitution Day",
    "みどりの日": "Greenery Day",
    "こどもの日": "Children's Day",
    "海の日": "Marine Day",
    "山の日": "Mountain Day",
    "敬老の日": "Respect for the Aged Day",
    "秋分の日": "Autumnal Equinox Day",
    "スポーツの日": "Sports Day",
    "文化の日": "Culture Day",
    "勤労感謝の日": "Labor Thanksgiving Day",
    "振替休日": "Substitute Holiday"
}

if __name__=="__main__":
    holidays_jp = hd.JP(years=2022)

    # Translate from Japanese to English
    holidays = {}
    for date, name in holidays_jp.items():
        holidays[date] = HOLIDAY_NAMES[name]

    df = pd.DataFrame(holidays, columns=["date", "name"])
    df["days"] = df["date"].apply(lambda x: (x - dt.date(2022, 1, 1)).days + 1)
    df["day"] = df["date"].apply(lambda x: x.strftime("%d"))
    df["month"] = df["date"].apply(lambda x: x.strftime("%b"))

    with open(Path("holidays"), mode="w") as f:
         f.write(f"YEAR 2022\n")
         f.write("weekday  0800 1900\n"
                 "saturday none all\n"
                 "sunday   none all\n")
         for row in df.itertuples():
             f.write(f"{row.days} {row.month} {row.day} {row.name}\n")
```
UIActionを使ってUINavigationItemの右にボタンを追加する例

iOS 14からのUIActionを使ってUIViewControllerのUINavigationItemの右にボタンを追加する短い例。

# とにかくボタンを置いてアクションを記述するだけの例

```swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem = .init(
            title: "ボタン名",
            image: nil,
            primaryAction: .init { _ in
                print("タップされた")
            },
            menu: nil
        )
    }
```

なんとなく覚えててググると、ぐちゃっと説明を読まされるが自分はこれで思い出せる。さらに調べたければXcode上で定義にジャンプすればいい。

# SwiftUIのViewを呼び出す例

```swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem = .init(
            title: "ボタン名",
            image: nil,
            primaryAction: .init { [weak self] _ in
                let viewController = UIHostingController(rootView: SampleView())
                self?.present(viewController, animated: true)
            },
            menu: nil
        )
    }
```

```swift
import SwiftUI

struct SampleView: View {
    var body: some View {
        Text("Hello, World!")
    }
}
```

SwiftUI.ViewをUIViewControllerに変換してとりあえず表示。
Google Cloud Associate Cloud Engineer 認定資格 を取得しました

# はじめに
会社で推進しているため、取得してみました。
以前PCAを取得しましたが、業務では全く触っていないため、ほぼほぼ忘れている状態で学習を開始しています。

# Google Cloud Associate Cloud Engineer とは
[この辺](https://cloud.google.com/certification/cloud-engineer?hl=ja)を参照ください。

# 教材
1. Udemy:[【2022年版】GCP認定 Associate Cloud Engineer 合格コース【Google Cloud】](https://www.udemy.com/course/2022gcp-associate-cloud-engineer-google-cloud/)
    - ACE取得のために必要な基礎を講義形式で学習します。
    - 問題集はありません。（最後に公式問題の解説を行う程度です）
1. Udemy:[Google Cloud Associate Cloud Engineer Practice Tests](https://www.udemy.com/course/google-cloud-associate-cloud-engineer-practice-examspractice-exams/#reviews)
    - 問題集です。
    - 100問(50x2)です。コース情報では150問(50x3)となっていますが、1番目と2番目が同じ全く同じ問題のため実質50x2です。
    - 評価が高いため購入してみましたが、試験用としては正直おすすめしません。試験に役立つような内容はかなり限られており、別の問題集を探した方が良いと思います。なぜ評価が高いのか不明です。。。
    - コマンド体系に関する問いが多いですが、試験では殆ど役に立ちません。
1. [Associate Cloud Engineer 模擬試験](https://docs.google.com/forms/d/e/1FAIpQLSc7bkUHpDbFShBI5xE4u8OO2vl99DrP0htnswa-la9DQynToA/viewform)
    - 公式の模擬試験です。20問です。
1. [Preparing for Your Associate Cloud Engineer Journey](https://www.cloudskillsboost.google/course_templates/77)
    - 公式のオンライントレーニングです。
    - 各章に問題が途中:7～10問,纏め:2問　とあり、合計57問あります。

# 結果/感想
ほぼ全てが上記Udemyの問題集とは傾向が異なる内容であったため焦りました。
上記で学習したGoogle Cloudの基礎とAWSの知識を使って消去法ベースで解いていきました。
一般的なGoogle Cloudサービスが満遍なく出題しています。AIに関する問いはありません。コマンドに関する問いは若干ありますが概要レベルであり、上記問題集のように具体的なコマンド体系を問うものはありませんでした。
普段業務で使用している方は、難なく回答できる問題が大半を占めている気がします。

ちなみに、今回自宅で受けました。事前案内では開始時刻の15分前から手続きを始めることができる となっていましたが、実際には10分前からでした。（時刻を間違えたかと焦りました）
githubのprivate repositoryがcloneができない

# 先に結論
作成者以外でprivate repositoryでcloneするには
settingでCollaboratorsでユーザーを招待する必要がある。

# エラーとの出会い
PCを複数所持していたいので、アカウントを複数使用して
gitコマンドの練習しようと思いました。
そのためGitHubでprivate repositoryを作成して
個人開発を行おうと思いました。

## git cloneができない
社内でgitを使用した開発経験があったので
深く調べず、githubの表記に従ってprivate repositoryを作成した。
よし、いざcloneするぞ！と思いコマンドを入力すると
エラーが発生してしまい、頭を悩ませました。

## 解決法を調査
解決するために、あれこれ調べました。
originの削除をして、再度設定したり
HttpsではなくSShで接続してみたり...と
色々やってみたが解決はせず。
僕は説明書通りに作ることもできないのか...と思っていました。

## 解決策は今までの経験
ふと、メールフォルダを眺めていると、社内でインターン生用に開発していたプロジェクトにアサインされたため
githubの招待メールがきていることを思い出しました。
これか？？と思い、Collaboratorsにアカウントを招待を行って
再度、cloneすると、あっさりとできました。

# まとめ
何事も下調べを行い万全を期して臨むべきと思いました。
今回は、アウトプットすることの苦手意識をなくすために文のみで投稿しました。
（このことを思い出したのも、それが解決してから3日経った頃だったので
エラー文のスクショを撮っていなかった…）
今後は、更に読みやすく、すこしでも糧になるような記事を投稿できるように頑張りたいと思います。
読んでくださった方々には深い感謝を。
ありがとうございました。
【CSS】position:absoluteを使って上下左右中央ぞろえ

# やりたいこと
画像を表示するモーダルを作成していて、コンテンツを画面の中央に設置したい

# 経緯

いつも真ん中に置くのに苦労している。
左右中央はいいんだけど、上下中央がすんなりいかない。
こちらのサイトの内容がドンピシャだったので、備忘録に。
https://cotodama.co/position-absolute-center/

# 実装
周りの要素は省く
```html:html
<div class="modal-content">
    <img src="url">
</div>
```
```css:css
.modal-content {
    /* 高さ・幅はお好みで */
    height: 50%;
    width: fit-content;

    /* これで真ん中 */
    position: absolute;
    margin: auto;
    top: 0;
    right: 0;
    left: 0;
    bottom: 0;
}

img {
    /* 画像の高さもお好みだけど、はみださないよう
    親要素より大きくならないようにしておくのがおすすめ */
    max-height: 100%;
}
```
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/658d0b65-bccd-3a5f-20af-182c4803b300.png)

#### おまけ
`width: fit-content;`で子要素の幅に合わせてくれるので、
子要素の画像のサイズになってくれる。
親要素が大きいと、モーダルを閉じる動きがうまくいかなかったので、設定しておきたかった。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その038

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: データと自動化
データ管理と分析管理の演習

にある練習問題6問目をご紹介します

今回の内容は動画でも説明しています

https://www.youtube.com/watch?v=coyBk_nc1_E

<iframe width="560" height="315" src="https://www.youtube.com/embed/coyBk_nc1_E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-security-and-data-management/review-data-management?trail_id=administrator-certification-prep

今回の練習問題はこちらです

![レポートタイプ０１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7daaaec5-3017-2ede-a871-0211edee97a7.png)

正解はAです


レポートタイプはリリースしないと表示されないのでご注意ください


詳細はこちらのヘルプに記載されています


・カスタムレポートタイプの作成
https://help.salesforce.com/s/articleView?id=sf.reports_defining_report_types.htm&type=5


デザイン、テスト、および編集中は、[開発中] を選択します。「カスタムレポートタイプの管理」権限を持つユーザ以外のすべてのユーザは、レポートタイプとそのレポートを表示できません。その権限のあるユーザのみが開発でレポートタイプを使用してレポートを作成および実行できます。
すべてのユーザがそのレポートタイプにアクセスできる準備が整ったら、[リリース済み] を選択します。
HTMLでcheckboxにチェックが入っていないときに値が送信されない時の対応

# 単一のチェックボックスでチェックされていないと値が送信されない

```html
<input type="checkbox" name="hoge" value="1">
```
たとえば上記のような単一のチェックボックスでON・OFFのようなチェックを作ったとする。
チェックのある場合は問題ないのだが、チェックを外してsubmitするとサーバー側で今回でいうと`hoge`というkeyで値が取得できない。
これは当然の仕様なのだが、ON・OFFのような場合、サーバー側で値が取れたほうが処理が楽になる。

# チェックしていないことを検知するには

```html
<input type='hidden' value='0' name='hoge'>
<input type="checkbox" name="hoge" value="1">
```

のようにcheckboxの**前**にhiddenで同じ名前のinputタグを作成します。
inputは後ろのもので上書きされるので、

- チェックされている場合
    - checkboxがサーバーに送信
- チェックされていない場合
    - hiddenがサーバーに送信

といった具合で、希望通りの値がサーバーに送信されます。

このやり方はスタックオーバーフローで支持を得ているようなので問題ないかと思いますが、なにか弊害があるとしたらご教示いただきたいです。

https://stackoverflow.com/questions/1809494/post-unchecked-html-checkboxes
Fire TV Stick (第3世代)を買ったのでスキルのブールプリントで途中までやつてみた。



目的
スキルのブールプリント　の　テスト
めんどくさくなったので途中でやめた


いろいろ
よほどインセンティブがないと充実せず荒野になるのが分かった



1. スキルのブールプリントを検索

2. フラッシュカード

3. 次へ...

4. めんどくさくなって　やめた


![o_con823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ec8424ae-1438-fd7c-5792-10bd83149ce4.jpeg)


![o_con824.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/217b83e9-d769-3549-5871-74f6c51004ba.jpeg)


![o_con825.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bd462231-bbdc-16e8-0d33-c1f98a930830.jpeg)


![o_con826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4c948c1d-0dc1-1fe2-72b9-3fbc2756c415.jpeg)

![o_con827.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a2fa0eda-2108-00fc-9577-5539b1c12f70.jpeg)


![o_con828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/63407b18-ed6b-07dd-cc8e-896b6a157762.jpeg)
特定のサイトにあるテーブルの中身をCSVに書き出したい

**推し**のいる生活っていいですね。

#### 経緯
プログラミング全体が苦手ですが、Pythonは特に苦手です。というのもタブで揃えるのがすごく嫌いなので使いたくないのですが、とあるライバーのイベントにはまってしまい、ランキングを適宜取得してその変化をエクセルで見たかったので慌てて作成しました。


#### 感想
Python面白い！Webスクレイピングは2度目くらいだけど、いざというとき便利だなあ〜


#### 定期実行はやってません
cronとかで自動実行してもいいんだけど、設定間違えるとトラフィックを増やして迷惑をかけることになるので、手動実行をしています。

#### ファイル名にタイムスタンプをつけてます
どの時点で取得したデータかわかるように、ファイルにタイムスタンプをつけています。

#### このコードのダメな点
増えたデータ（実行回数分ファイルが作られます）はエクセルでなんとか処理すればいいやって姿勢。本当は1つのファイルに追記していくのが美しいのだろうけど。次のイベントに進出したらかんがえる。


#### 参考にしたサイト（追記予定）

https://note.nkmk.me/python-csv-reader-writer/

https://kino-code.com/python_automation_web_scraping/

https://dev.classmethod.jp/articles/json2csv_from_api_python_data_collection/

https://algorithm.joho.info/programming/python/beautifulsoup-table-to-csv/



#### コード

```python:test.py
import csv
import datetime
from urllib.request import urlopen
from bs4 import BeautifulSoup

def table_to_csv(file_path, url, selecter):
    html = urlopen(url)
    soup = BeautifulSoup(html, "html.parser")

    # tableタグを選択
    table = soup.findAll("table", selecter)[0]

    trs = table.findAll("tr")
    # csv書き始めましょう的な意味かな？
    csv_file = open(file_path, 'wt', newline = '', encoding = 'utf-8')
    csv_write = csv.writer(csv_file)

    for tr in trs:
        csv_data = []
        # 1行ごとにtd, tr要素のデータを取得してCSVに書き込み
        for cell in tr.findAll(['td', 'th']):
            csv_data.append(cell.get_text())
        csv_write.writerow(csv_data)

    # 書き込み終わり
    csv_file.close()

# URLを指定
url = '（ここにURL）'

# セレクタ(今回は取得したいテーブルのクラス名を使いました。mt-4 col-12　みたくスペース込みでも動作していました)
selecter = {"class":"table-mytable"}

# 現在時刻の取得
now = datetime.datetime.now()

# CSV保存用にファイルパスとファイル名を指定

# ファイル名の指定（Windows）
filename = 'C:\\Users\\（あなたのユーザ名）\\' + now.strftime('%Y%m%d_%H%M%S') + '.csv'
# ファイル名の指定（Macの場合はこちら）
filename = '/Users/（あなたのユーザ名）/' + now.strftime('%Y%m%d_%H%M%S') + '.csv'

# table_to_csvを実行
table_to_csv(filename, url, selecter)
```

Macで作って、Windowsで実行した関係でパスが2種類あります。不要な方を削除してください。
定期実行のミスが怖いので、子どもに定期的にダブルクリックするアルバイトをさせていました。
Fire TV Stick (第3世代)を買ったのでTokyofm (東京FM)を聞く( AuDee (オーディー) )(いろいろしたいので)


目的
東京FMのホームページからAuDeeでらじぉを聞く

いろいろ
いろいろ連動させる予定の為のテスト


1. マイアプリ・ゲームからinternetを選択

2. 検索で「東京FM」と入力

3. 東京FMのホームページでAuDeeで聴く

4. 聞けたのでおわり


![o_con822.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0e0e7d8a-4366-da54-9490-ff7b7cac0758.jpeg)
ブラウザの伏せ字パスワードを見る方法

#ブラウザに記録されているパスワードを表示させる方法です。

自分用のメモ

(下の画像みたいになっているやつが見たいとき)

![display_passowrd02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652965/50686e6d-be3d-21fe-2edd-5702f7283978.png)

* * *

1. デベロッパツールを開きます。
command⌘キー ＋ option⌥キー ＋ C

2. デベロッパツール画面無いの左上の矢印アイコンをクリクします。
![dp101-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652965/3a80a517-f535-0530-f0d6-11e33c9740dd.png)

3. パスワードの部分をクリックします。

![display_passowrd02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652965/918f710b-0ac3-a12e-b48e-7b5ccb768b19.png)

4\. input typeの「password」を「text」に編集します。

![dp03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652965/d82cf66b-d947-476b-aa7a-4ad7e3b92ae4.png)

↓

![dp04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652965/ace6cd97-809f-bc7c-4b7f-4bcbd195e186.png)

**以上で伏せ字だったパスワードが見れます！**


参考ページ

https://tamoc.com/display-browser-passowrd/
【メモ】VFX Graphで入力の影響を受けるパーティクルエフェクトを発生させる

# 0.問題
映像のように、プレイヤー(蝶)に付随してパーティクルを生成するVFXを作った。
蝶のオブジェクトの子にVFXを置いている。
しかしパーティクルがプレイヤーの操作入力の影響を受けないため、プレイヤーの移動と同じだけ平行移動し、自然な印象を受けない。

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/014069c7-b452-602c-ffab-ef6bd83b179f.gif)


:::note warn
環境は以下
Unity:2021.3.10f1
VFX Graph 12.1.7
URP 12.1.7
:::

# 1.原因
**ただ単に蝶のオブジェクトの子にVFXオブジェクトを置いていたのが原因。**
パーティクルを描画する層がそのまま蝶の動きに合わせて動くため、すべてのパーティクルが蝶の移動に合わせて平行移動することになる。
![プレゼンテーション1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/b5797f9a-81dd-5396-a90c-43cea29b6eb6.png)

# 2.解決法
メニューバー【Component】→【VFX】→【Property Binder】を使う
Property BinderはVFX外のGameObjectの情報を持ってくることができる。

> Property Binder は Visual Effect コンポーネント を使ってゲームオブジェクトに取り込める C# 動作です。これらの動作を使って、シーンまたはゲームプレイ値と Visual Effect インスタンスの 開放されたプロパティ を接続することができます。
[Property Binder | Visual Effect Graph | 10.7.0](https://docs.unity3d.com/ja/Packages/com.unity.visualeffectgraph@10.7/manual/PropertyBinders.html "Unity 日本語マニュアル VFX Graph - Property Binder")

# 3.実装
パーティクルの作り方は公式等参照してください。
[VFX Graph 秋の花火大会](https://learning.unity3d.jp/5837/)とか。

1. VFX(画像内ではflying)をSceneに配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/72db6796-45ff-f60d-5511-9120de95d384.png)

2. メニューバー【Component】→【VFX】→【Property Binders】からPosition Binderを追加
今回はbutterflyのPositionを持ってきたいのでPosition Binderを使う。ほかのも試してみるとよさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/15cd65fd-cfaf-d640-2617-5f637f17a729.png)

3. Property Bindingsリストを編集
Property BindingsのPositionをクリックするとTargetが選べるようになるのでbutterflyのGameObjectをドラッグ&ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/8757a0cc-f567-e2a0-3913-10d112bf74e9.png)

4. VFX Editor側のBlackboardを開き、Positionを受け取る引数を用意
PositionなのでVector3型で受け取るために、右上の+をクリックしてVector3を選択。
**用意した引数の名前をPositionに変更する。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/4b5ba495-97cd-35cb-4e65-12cf1b06db23.png)

5. VFX Editor側で受け取る
VFX Editorで右クリック→【Create Node】→検索から【Position(Property)】を選択してnode配置→nodeとSet Positionをリンク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/55c0314a-9942-dc71-cee7-5d1b8e2386d0.png)

:::note alert
ポイント
動きを追従したいGameObject(butterfly)と同じ階層にVFXオブジェクトを配置してください。
こうしないと独立した座標系で動かせません。
:::

# 4.結果
想定通りに動いた
![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563211/cd23fd61-7f67-e0d0-7559-20b43511e8d1.gif)
入力と連動して動いてくれないとゲーム性が失われるので、Property Binder活用していきたい。
VFX使いこなせると表現の幅が増えそう。
命名時に絶対やめてほしいこと

# 初めに
今回は変数名や、`layout`の`id`などを命名する時に絶対にやめたほうがいいことを紹介していきます。
### 本文
まず初めが***別画面で同名のidを使わない***といことです。
最近は`Jetpack Compose`が出て来たのもあって今後減っていきそうではありますが、命名するのが難しいViewがある場合に汎用的すぎる名前をつけているのが時々見受けられます。
汎用的なIDをつける場合はせめてどの画面のものなのかがわかるようにしたりしましょう。

---
次が***関数名をつける時は動詞を前に持ってくる***です。
初心者や新入社員の方に多くみられるのが動詞が後ろの方に来てしまってることがありますが、それだと該当の関数が何をするのかがぱっと見でわかりません。
例として`setupPageView`とかけば見る側は少なからず何かしらのセットアップをすることがわかりますが、`pageViewSetup`だとPageViewに対して何かをすることしかわかりません。
もちろん対象は大事ですが、ある程度の知見がある人の場合何をしたいのかが重要で中身のコードを見れば対象がなんなのかは大抵わかります。
そのため、まずは何をしたい関数なのかをはっきりさせておくと他の人が見た時に親切になります。

### 最後に
あまり考えたことがない人もいるかと思いますが、これを意識するだけでレビューで修正依頼をされる回数も減るかと思いますので、是非一度確認をしつつ実装をしてみてください。
App Engine の二つのタイプとは？

# App Engineとは

GCPのコンピューティングPaaS製品

デベロッパーやアプリケーション管理者は、仮想マシンの構成やKubernetes クラスタの指定について心配する必要がない

その代わり、デベロッパーはJava, Go, Python, Node.js などの人気のあるプログラミング言語でアプリケーションを作成し、作成したコードをサーバーレスアプリケーション環境にデプロイできる

モノリシックなサーバーサイドで、レンダリングされたWebサイトを構築できる

> **レンダリング**
とは、何らかの抽象的なデータ集合を元に、一定の処理や演算を行って画像や映像、音声などを生成すること。
> 
> 
> [レンダリングとは - IT用語辞典](https://e-words.jp/w/%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0.html)
> 

> **モノリシック**
とは、一枚岩の、頑丈な、巨大な、などの意味を持つ英単語。組織や機器、システムなどの構造について、要素に分割されておらず全体が一体になっている様子を表す。
> 
> 
> [モノリシックとは - IT用語辞典](https://e-words.jp/w/%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B7%E3%83%83%E3%82%AF.html)
> 

App Engineは、基盤となるコンピューティングとネットワークインフラを管理する

アプリケーションを保護するために仮想マシンを構成したり、ネットワークを強化したりする必要はない

App Engineは、Webアプリケーションやモバイルバックエンドアプリケーションに最適

## App Engine の二つのタイプとは？

スタンダード環境用とフレキシブル環境用

### スタンダード環境

言語固有のサンドボックスでアプリケーションを実行する

アプリケーションは、基盤となるサーバーのオペレーティングシステムや、オペレーティングシステムのサーバーで実行されている他のアプリケーションから分離される

サポートされている言語のいずれかで記述されたアプリケーションに適している

OSパッケージやアプリケーションコードと一緒にインストールする必要がある他のコンパイル済みのソフトウェアは必要ない

> **サンドボックス（sandbox）とは？**
> 
> 
> サンドボックス（sandbox）を日本語に訳すと「砂場」になりますが、ITの世界におけるサンドボックスとはコンピュータの中に設けられた「仮想環境」のことを指します。仮想環境とは、ソフトウェアによって実際のコンピュータの環境を模した「疑似環境」を作り出したものです。この仮想環境の中では、あたかも本物のコンピュータ環境の中にいるかのようにアプリケーションを動作させることができます。
> 
> [Tokio Cyber Port](https://tokiocyberport.tokiomarine-nichido.co.jp/cybersecurity/s/column-detail82)
> 

> コンパイルとは、特定の[プログラミング言語](https://developer.mozilla.org/ja/docs/Glossary/Computer_Programming)
を用いて記述されたコンピュータープログラムを他の言語 (普通はコンピューターが実行できるバイナリ言語) を用いて記述された同じプログラムに形を変えることである。
> 
> 
> [Compile (コンパイル) - MDN Web Docs 用語集&colon; ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Compile#:~:text=%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E7%89%B9%E5%AE%9A%E3%81%AE,%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A7%E3%81%99%E3%80%82)
> 

### フレキシブル環境

App Engine環境でDockerコンテナを実行する

フレキシブル環境は、アプリケーションコードはあるものの、ライブラリまたは他のサードパーティのソフトウェアをインストールする必要がある場合に適している

バックグラウンドプロセスでの作業やローカルディスクへの書き込みなど、ユーザーが使えるオプションを増やしてくれる
【Terraform】リソース名を変更した場合の対応

## はじめに
Terraform にてリソース名を変更する場合の対応方法について書きます。

## 今回対応すること
以下のコードにあるリソース名 `bucket` の部分を別のリソース名 `test_bucket` に変更

```terraform
resource "aws_s3_bucket" "bucket" {
  bucket = "test-bucket"
}
```

## リソース名の変更手順

### 1.リソース名を `test_bucket` に変更する。

```terraform
resource "aws_s3_bucket" "test_bucket" {
  bucket = "test-bucket"
}
```

### 2.State を `bucket` から `test_bucket` に移行する。

```zsh
terraform state mv aws_s3_bucket.bucket aws_s3_bucket.test_bucket
```

※`tfstate`のみを書き換える処理になります。実際のリソースが変更されることはありません。

### 3.リソースが移行されているか確認する。
正常に移行されていれば、以下のコマンドを実行した際に結果が表示される。

```zsh
terraform state show aws_s3_bucket.test_bucket
```

## 参考
https://www.terraform.io/cli/commands/state/mv
【PHP】int型指定の引数にstringを渡すとintになる

# 実行例
```php
function test(int $num) {
    var_dump($num);
}

test('99');
// int(99) 　実行結果
```
string型の99をint型指定の関数に通すとint型の99に変換されます。

# 参考
http://taustation.com/php-function-argument-type-specification/