OmniAICreator/Qiita-1.07M huggingface dataset:
ローカルテストでdynamodbを動くようにした

# 環境
ruby(ruby 3.1.1p18)
rails（Rails 7.0.2.3）
docker
minitest(ローカルテスト)

# やりたいこと
docker-composeのタイミングでdynamodbにテーブルを作成する。
テストケース単位でfixtureを読み込み、テーブルにデータをインサートする。

# 環境作成
dynamodbのコンテナイメージとテーブル作成用のawscliのコンテナイメージを使用します。
```yaml:docker-compose
dynamodb-local:
        command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
        image: "amazon/dynamodb-local:latest"
        ports:
            - "8000:8000"
        working_dir: /home/dynamodblocal
        volumes:
            - /local_path/:/home/dynamodblocal/data
awscli:
    image: "amazon/aws-cli"
    entrypoint: [ "" ]
    tty: true
    command: "/bin/bash /usr/app/create_dynamodb.sh 'ホスト名'"
    volumes:
        - type: bind
          source: ./local_path/create_dynamodb.sh
          target: /usr/app/create_dynamodb.sh
    environment:
        AWS_ACCESS_KEY_ID: fake_access_key
        AWS_SECRET_ACCESS_KEY: fake_secret_access_key
        DYNAMODB_REGION: ap-northeast-1
    depends_on:
        - dynamodb-local
```
dynamodbに関してはawsの公式ドキュメントにdocker-composeが載っていました。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html
awscliは公式ドキュメントから発見できなかったので、既存コードにあったmysqlを参考にして作成しました。
github actoinとローカルの時でdynamodbのホスト名が変わるため、コマンドライン引数でホスト名を受け取っています。

# テーブル作成コマンド
```sh:create_dynamodb.sh
aws dynamodb create-table \
    --table-name table_name \
    --attribute-definitions \
        AttributeName=CustomerId,AttributeType=N \
        AttributeName=SortKey,AttributeType=S \
    --key-schema \
        AttributeName=CustomerId,KeyType=HASH \
        AttributeName=SortKey,KeyType=RANGE \
    --provisioned-throughput \
    ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --endpoint-url http://ホスト名:8000 \
    --region ap-northeast-1 \
    --no-cli-auto-prompt \
    --no-cli-pager
```
ここで要注意なのが、`--no-cli-pager`です。
テーブルを作成するとき、aws側からテーブル定義のjsonが帰ってくるのですがそれがpagerで開かれるため処理が終わらず、それより下のコードが実行されないです。
これを利用して、わざとawscliのコンテナを起動しっぱなしにしてコマンドの検証をしたりしていました。
あと、ローカルではエンドポイントとリージョンの指定が必須です。
ホスト名はローカルではコンテナ名でgithub actionではlocalhostでした。
Railsで作成したテーブルのidを初期化する

## 環境
Rails 5.2
PostgreSQL12.10

## はじめに

タイトルにある通り、Railsで作成したテーブルのidを初期化する方法についての記事です。テーブルを全件トランケートした後、データを新規登録をすると、id=1から振り直してくれるものと期待していても、そのようにはしてくれません。全件トランケートしたとても、最後に登録したidの次から連番で振り続ける仕様になっています。

idはあくまで、内部的に管理される項目であるため、idに何が登録されようが、気にしなければいいのですが、1からきれいに連番で登録されていないと気持ちが悪いという人は、idを初期化する必要があります。

## やったこと
PostgreSQLにログインします。
```
$psql -h localhost -d DB名 -U ユーザーID
```

全てのidを表示させてみます。
```
#select id from users order by id;
```

データ件数が大量にある場合は１件に絞り込んで、idのMAXを調べます。
```
#select max(id) from users;
```

現在登録されているMAXのidを表示します。上記のテーブルのidのMAX値と同じ値になっているはずです。
```
#select * from users_id_seq;
```

テーブルのデータを全件削除します。truncate文ではなく、delete文で削除しても同じです。データ件数が大量にある場合は、トランケートの方が処理が早くなります。ただし、トランケートした場合は、ロールバックができなくなります。当然、トランザクションを掛けていた場合の話ではありますが。
```
#truncate table users;
```

データが確かに削除されたことを確認します。
```
#select * from users;
(0 rows)
```

idを1に初期化します。
```
#select setval ('users_id_seq', 1, false);
 setval
--------
      1
(1 row)
```

idが確かに初期化されたことが確認できます。
```
#select * from users_id_seq;
 last_value | log_cnt | is_called
------------+---------+-----------
          1 |       0 | f
(1 row)
```

Railsからusersテーブルに、seedsでデータを流し込んだら、idが1から連番できれいに並ぶことになります。
Lambda関数からAmazon SQSにデータを送信する時ハマったこと

# はじめに
Lambda関数からAmazon SQSにデータを送信する時、ハマったことがあったので備忘録として残しておく。

# 前提条件
- Lambda関数からAmazon SQSにデータを送信する
- Lambda関数はVPC内のプライベートサブネットに設置している
- Lambda関数のIAMロールはAmazon SQSに対してフルアクセス権限を付与している
- Lambda関数はNode.jsで作成

# 起こったこと
上記前提条件のもとLambda関数を実行するとタイムアウトしてしまった。
そのときのソースと実行結果はこちら
AWS公式サンプルソースのほぼコピペ
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/sqs-examples-send-receive-messages.html

```js
var AWS = require('aws-sdk');
AWS.config.update({region: 'ap-northeast-1'});

var sqs = new AWS.SQS({apiVersion: '2012-11-05'});

var params = {
  DelaySeconds: 0,
  MessageBody: "TestMessageBody",
  QueueUrl: "https://sqs.ap-northeast-1.amazonaws.com/123456789012/TestSQS"
};

exports.handler = async (event) => {
    try {
      const data = await sqs.sendMessage(params).promise();
      console.log("Success", data.MessageId);
    } catch (e) {
      console.log("Error", e);
    }

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/4d4acc35-08dc-dbb3-845b-69f856ffb898.png)

# 原因
いろいろと調べた結果、プライベートサブネットからAmazon SQSにデータを送信するときは「VPCエンドポイント」を作成して、それを経由してデータ送信しなければいけないという事が分かった。
いつもありがとう、stack overflow。
https://stackoverflow.com/questions/54049143/sending-sqs-message-timeout

# 対処法
早速VPCエンドポイントを作成して試してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/1b132be9-16c3-87a0-7905-94a544c7c6f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/857bd0e2-7ce9-d882-45f8-127afc2fa9f7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/a62b3bc7-b02c-ad2b-7f9e-ba597fed7827.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/4daec688-f5ac-f59e-4e0d-91da73dfea79.png)

Lambdaのソースも以下のSQSインスタンスを作るところにエンドポイントを追記しました。
```js
var sqs = new AWS.SQS({
    apiVersion: '2012-11-05',
    endpoint: 'https://vpce-088eXXXXXXXXXXXX.sqs.ap-northeast-1.vpce.amazonaws.com'
});
```

# 結果
上手く行きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/c5b3b17d-9ae8-da6d-8457-bf287ebd0e31.png)

SQSでメッセージも確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/6e1d6007-fe92-18da-d85f-dcb26fd29739.png)

現場からは以上です。
BASEにGoogleタグマネージャーを設置する方法

## 『HTML編集』Appに移動
まずは、**HTML編集**のAppに移動。

## 1つ目のスクリプトを入れる（入れる場所に注意！）
以下のスクリプトを、\<head>タグ内に貼り付ける。
```javascript
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');</script>
<!-- End Google Tag Manager -->
```
※"GTM-XXXX" をご自身のコンテナ ID に置き換えるのを忘れずに。

## 2つ目のスクリプトを入れる（入れる場所に注意！）
以下のスクリプトを、\<body> 開始タグの直後に貼り付ける。
```javascript
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
```
※同じく、"GTM-XXXX" をご自身のコンテナ ID に置き換えるのを忘れずに。

## 参考に
https://developers.google.com/tag-manager/quickstart?hl=ja
【Laravel】独自のページネーションを作成する


# vendor/paginationディレクトリを自動生成する（pagination用のCSSを入れる）

```php
php artisan vendor:publish --tag=laravel-pagination
```
以下のディレクトリに作成された
resources/views/vendor/pagination

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/c411eabc-7020-7d4a-30c5-90ac247998a8.png)

# Bootstrap使用を設定

app/Providers AppServiceProvider.php を編集

ファイルの上部に下記のuse宣言を追加します。
```
use Illuminate\Pagination\Paginator;
```
bootには、次のように記述します。
```
Paginator::useBootstrap();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/5e6ac641-9961-a0fc-0b5d-0afa415cd901.png)

```
<div>
  {{$users->links();}}
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/0118026b-6ac5-fc2d-3499-dccac1f0c03d.png)
EditorConfigのすゝめ

# What is EditorConfig?

[公式サイト](https://editorconfig.org/)に記載されている概要です

EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs. (以下略)
以下Google翻訳

> EditorConfig は、さまざまなエディターや IDE で同じプロジェクトに取り組んでいる複数の開発者が一貫したコーディング スタイルを維持するのに役立ちます。

この一文が全てです。簡潔でわかりやすい！

# 導入したらどうなるの？

コーディングするエディタを指定していなければチームで開発している場合、個々人で変わってくると思います。田中さんはNeoVim、佐藤さんはIntelliJ、鈴木さんはVSCodeといった具合です。
この時、それぞれのエディターはローカルの設定に従いタブ種類やサイズ、改行コードを自動的に挿入していきます。
最悪の場合、ファイル全体を置換してしまいます。結果、ブランチのマージ時の差分が膨大になり詰みます。
これらの設定を共有して複数の開発者、エディターで一貫したコーディングスタイルを維持するためことができます。
また、複数の言語を横断してコーディングする際に個別に設定することも可能です。
例えば、Pythonのインデントはソフトタブ４つと決まっています。一方、Makefileのインデントはハードタブでないとエラーが発生します。
PythonとMakefileが混在するプロジェクトの場合、一方に合わすともう一方が異なってしまい、コーディングが大変になります。
この問題をEditorConfigを利用するとスマートに解決することができます。

# Let's install!

## 設定ファイル

設定ファイルの導入はすごく簡単
プロジェクトのルートディレクトリに`.editorconfig`というファイルを作成するだけです。

## 記述方法

公式サイトでのファイル記述方法は[これ](https://editorconfig.org/#example-file)だけです。
シンプルな機能のみを提供しているので設定ファイルもシンプルです。
各項目の詳細な意味はすごいわかりやすい下記ページを参照してください
[どんなエディタでもEditorConfigを使ってコードの統一性を高める#editorconfigファイル - Qiita](https://qiita.com/naru0504/items/82f09881abaf3f4dc171#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9)

```
# Rquired
root = true

# プロジェクト全般の設定
[*]
end_of_line = lf            # 改行はLF
insert_final_newline = true # 最終行に空行を追加
charset = utf-8             # 文字コードはUTF-8
indent_style = space        # インデントは半角スペース

# 拡張子が.pyのとき
[*.py]
indent_size = 4             # インデントはindent_style4つ分

# Makefileのみ
[Makefile]
indent_style = tab          # インデントはハードタブ

# 拡張子が.jsの時
[*.js]
indent_size = 2             # インデントはindent_style2つ分
```

EditorConfigはよく知っているプロジェクトに導入されているのでレポジトリから参考にしてはいかがでしょうか？
[Projects Using EditorConfig - Github](https://github.com/editorconfig/editorconfig/wiki/Projects-Using-EditorConfig)

## エディタへの導入方法

[標準で対応しているエディタ](https://editorconfig.org/#pre-installed)と[プラグインが必要なエディタ](https://editorconfig.org/#download)があります。
おおよそのJetBrains系エディタは標準で対応しているようがAppCode、Php Stomはプラグインが必要です。mた、VisualStudioは標準で対応しているのにVS Codeはプラグインが必要だそうです。
この違いなんなんだろう？

## VS Codeへの導入

サイドバーのExtensionsから`EditorConfig for VS Code`と検索後、ネズミさんアイコンの拡張をインストールすれば導入完了です。
他の設定なしに拡張子に従ったエディターの設定を自動的に適用してくれます。

# 参考

- [EditorConfig](https://editorconfig.org/)
- [EditorConfig - Github](https://github.com/editorconfig/)
- [どんなエディタでもEditorConfigを使ってコードの統一性を高める - Qiita](https://qiita.com/naru0504/items/82f09881abaf3f4dc171)
時系列データ分析②　～定常性とホワイトノイズ～

## はじめに
今回は、時系列データ分析の第二回ということで、時系列を解析するにあたり重要な概念となる、『定常性』についてまとめていきます。

前回の投稿で、時系列データに対する期待値や分散、自己共分散などの基本統計量の求め方を紹介しました。
しかし、一度しか観測されない時系列データに対してどのように統計量を計算するのでしょうか。

そこで活躍するのが、今回紹介する定常性という仮定になります。

## 定常性とは
定常性とは、__期待値や分散などの基本統計量が時間によって変化しない__、という性質のことである。
正確には同時分布や基本統計量の時間不変性に関する性質であり、時間に対して『何が不変なのか』によって、<font color='red'>弱定常性</font>と<font color='red'>強定常性</font>に分類される。
  
### 弱定常性
>任意の$t$と$k$に対して、$$E[y_t]=\mu$$ $$Cov[y_t,y_{t-k}]=E[(y_t-\mu)(y_{t-k}-\mu)]=\gamma_k$$が成り立つ場合、その過程は弱定常（weak stationary）という。

つまり、弱定常性とは、期待値と共分散が、時点$t$には依存せず、さらには自己共分散に関しては<ins>時間差のみに依存する</ins>、ということである。
また自己相関は、$$Corr[y_t,y_{t-k}]=\frac{\gamma_{kt}}{\sqrt{\gamma_{0t}\gamma_{0,t-k}}}=\frac{\gamma_k}{\gamma_0}=\rho_k$$となり、自己相関も時点$t$に依存しない。分母に関しては、弱定常性の定義（自己共分散は時点$t$に依らず時間差のみに依存する）より、$\gamma_{0t}=\gamma_{0,t-k}=\gamma_0$となり、分子も同様。
### 強定常性
>任意の$t$と$k$に対して、$(y_t,y_{t+1},...,y_{t+k})'$の同時分布が同一となる場合、その過程は強定常（strict stationary）という。

強定常性は弱定常性より強い概念である。
一般に、分散が有限であれば強定常性は弱定常性である。

弱定常性が強定常性であるとは限らないが、__正規過程（Gaussian process）__ では、弱定常性を持つならば強定常性も持つとされる。これは、正規過程が期待値と分散によって完全に決定されるためである。
※正規過程：任意の$t$と$k$に対して、$(y_t,y_{t+1},...,y_{t+k})'$ の同時分布が多変量正規分布となる過程。
　　
## ホワイトノイズ
>すべての時点$t$において、$$E[\epsilon_t]=0$$
$$\gamma_k=E[\epsilon_t,\epsilon_{t-k}]=
\begin{cases}
\sigma^2,&&k=0 \\ 0,&&k\neq0\end{cases}$$
が成立するとき、$\epsilon_t$はホワイトノイズと呼ばれる。

定義から、明らかに弱定常性をもつことが確認できる。
時系列モデルにおいて、ホワイトノイズは __攪乱項__ と呼ばれ、確率的変動という重要な役割を果たす。
### シミュレート
ホワイトノイズ$\epsilon_t$を用いて、最も基礎的な弱定常過程を作成し、その動きをシミュレーションしてみる。
作成する式は以下のようなとても単純なものである。
$$y_t=\mu+\epsilon_t,\\ \epsilon_t\sim W.N(\sigma^2) $$

- 平均２，分散１
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/9fea3461-da28-37e2-c11a-485a2764253c.png)

- 平均２，分散５
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/68b8833f-7b4b-b2bb-8118-58f1f8d84c1f.png)

- 平均５，分散３
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969543/56075c3d-da84-90f9-e6a5-dadbf12e08e4.png)

すべての場合において、特に何の傾向もなく値が変動しているのが確認できる。（自己相関を持たない）
ホワイトノイズが時系列モデルにおいて確率的変動を表現する役割を持つことが確認できた。
また、全ての場合において、平均まわりに値をとり、分散が大きくなれば変動の幅も大きいことが見て取れる。

# まとめ
今回は、時系列分析を行う上で大切な概念となる、定常性とホワイトノイズについて確認してみました。
定常性とは、時系列データが時点によらず期待値や共分散が一定であること、ホワイトノイズは時系列データの確率的変動を表せること、を今回のまとめとします。

もちろん、全ての時系列データについて定常性が確認できる訳ではありません。またホワイトノイズのみの時系列モデルで表現できる時系列データも滅多に存在しません。

今後の投稿では、定常性をどのように確認するのか、定常性が確認できなかったパターンについて、
そしてホワイトノイズを含んだ単純な時系列モデルを基にした、さらに複雑な時系列モデルについて触れていけたら、と思います。

## 参考文献
沖本竜義（2010） -経済・ファイナンスデータの計量時系列分析
日本統計学会　-統計学実践ワークブック（統計検定準1級対応）
No.1 Power BIのライセンスの種類／違いを知る

## Power BIのライセンスの種類
※本記事は2023年1月時点での情報を記載しております※

Power BIは幾つかライセンスの種類があり、幾つか代表的なものを下記の表でまとめています。
![スクリーンショット 2023-01-30 21.13.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/c5d0a364-f9b7-99ff-4c91-99d92e4f873d.png)
ライセンスについての詳細は弊社の営業にご確認ください。
サポートチームのブログでもライセンスの説明がありますので、こちらもご参考ください。
[Japan CSS Support Power BI Blog_Power BI ライセンスの違い（Free・Pro・Premium Per User・Premium Per Capacity・Embedded）](https://jpbap-sqlbi.github.io/blog/powerbi/pbi_license/)

## FreeとProの違い
よく聞かれるのがFreeとProは何が違うのか？という事ですが、
こちらも下記の表で幾つか代表的な違いをまとめています。
![スクリーンショット 2023-01-30 21.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/8f2080e4-4e7c-95f9-55da-e0c51726c3f8.png)
自分が作ったレポートを他人に共有するには、Proのライセンスが必要となります。
これまでご説明してきたビジュアルの作成や個人で利用する分には、Freeのライセンスで可能です。

## 自分のPower BIサービスのライセンス確認方法
1．TeamsでPower BIを開いている場合は右上の地球儀のようなマークを押します
![スクリーンショット 2023-01-31 9.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/48945cf8-879c-969b-4d5c-a74923ec5759.png)
2．Web版のPower BIサービスに遷移するので、右上の自身の顔マーク（プロファイル）を押します
![スクリーンショット 2023-01-31 9.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/e95e2d9f-6524-c248-b4e9-c1aedbcb37a7.png)
3．ここからライセンスの種類が確認できます（赤枠）
![スクリーンショット 2023-01-31 9.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/c7083693-788c-516f-150f-b0a6d284caf0.png)


こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
“Hello World”

初めまして、774(ななし)です。
Qiitaへ初めての投稿になります。


自己紹介をしますと、
・ねこ好き。🐈‍⬛ 
・ゲームもめちゃくちゃ好き。
・パートで接客業(手取り13万円)
・3月末でパートを辞めて、IT企業へ転職予定

目標
・プログラミングで1,000万稼ぐ
・AR/VR等の開発をする


プログラミングは最初かなり大変らしいですが、技術が積み上がって行くほど楽になるので、最初を頑張って乗り換えていきたいです。


目標の1,000万円稼ぐというのは、プログラミングなら手が届く範囲だと聞いたので、夢は大きくという事で設定しました。

XR事業に携わりたいのは、ゲーム好きからですね。
あと単純に最新技術はワクワクする！
なので先ずはrubyから独学しようと思います。


既にプログラマーとしてる方
つまづいた時、知恵を貸していただけるとありがたいです。

初心者の方でもお互い切磋琢磨できればと思います。

少しでも興味を持って下さった方がいましたら、Twitterで絡みませんか？
色々話すのを楽しみにしてます！

最後まで読んで下さりありがとうございます。
【Docker】docker-composeとdocker composeの違いでなぜかエラー解消することがある。

# Docker Composeのコマンドの謎

## docker-composeとdocker composeによるエラー解消について

概要はこの方の記事とその中でリンクされているIssueを参考

https://qiita.com/Co-0/items/db8d36d31b1480b92d64

https://github.com/docker/buildx/issues/769

```bash:Error
$ docker compose build
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: 
failed to create LLB definition: rpc error: code = Unknown desc = error getting credentials - err: exit status 1, out: ``  
```

上記の記事やIssueでは`docker-compose` → `docker compose`のハイフンなしにすることで動いたとの報告があるが、自分の環境では逆の`docker compose` →`docker-compose`でエラー解消した。原因は不明である。

## 補足

Dockerでよく見るエラー`load metadata or docker.io`ですが、**Use Docker Compose V2のチェックを外す**と治らしい。自分は治りませんでしたが、、、これも`docker-compose`と`docker compose`の違いなのでしょうか。

```bash:これ
$ docker compose build --no-cache
...
=> ERROR [internal] load metadata for docker.io/library/XXXX
```

ちなみに、このエラーが出た時自分は毎回面倒ですが、`docker pull XXX`でpullしています。(他にも解決方法があると思いますが、あまり環境や設定をいじりたくない...)

```bash:例) php:8.1.9-fpmの場合
$ docker compose build --no-cache
...
=> ERROR [internal] load metadata for docker.io/library/php:8.1.9-fpm

$ docker pull php:8.1.9-fpm
...
...
...
...
Status: Downloaded newer image for php:8.1.9-fpm
docker.io/library/php:8.1.9-fpm

$ docker compose build --no-cache
```
WSL2＋Ubuntu-22.04でPerlを再履修している

# まえがき

　業務上でテキストデータ（Excelで保存したCSVファイル）を複数ファイル読み込んでデータ加工する必要性に迫られ、昔取った杵柄でPerlをもう一回やっている。
　Perlを書く、動かす上でハマったことをメモしておく。

## 動作環境

　Windows 10 Pro バージョン 22H2
　WSL2（Microsoft Store版、詳しいバージョンは下記のとおり）
　Ubuntu 22.04.01 LTS（Microsoft Storeより）

```PowerShell
PS C:\Windows\system32> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.19045.2486
```

# 設定ごと

## CPANでのプロキシー設定

　ざっくり説明すると、こんな感じ。

```sh
> o conf  # 設定値の確認
> o conf http_proxy  # http_proxy設定値の確認
> o conf http_proxy http://192.168.0.1:8080/  # http_proxy設定値の一時反映
> o conf commit  # 設定の永久反映
```

　プロキシーサーバーの利用にユーザーやパスワードが必要なら、設定値に`proxy_user`や`proxy_pass`などありますよ、と。

## Perlのモジュール追加方法

　cpanプログラムを使ったけれど、makeのところでずっこけるので、「[Can't exec make No such file or directory \[Fix\] \- Techglimpse](https://techglimpse.com/cant-exec-make-no-file-directory-fix/)」の記事を参考に、`sudo apt-get -y install build-essential`などとした。
　あとは、`sudo cpan`してcpanプロンプト上でCPANの新しいのがあるぞみたいなメッセージがあったので、`install CPAN`と`reload cpan`してCPANを最新化したのち、`install Text::CSV_XS`をしてモジュール追加できた。

## PerlをPhpStormで書けるように

　「[どうしても業務命令でPerlを使わざるを得ないあなたに送る、IDE（IntelliJ）でPerlを殴る方法。 \| あそびば32](https://bbq-all-stars.github.io/2019/05/01/intellij-perl-environment.html)」の記事を参考に、`Perl::Tidy`と`Perl::Critic`は入れておこうと思う。
　この2つのモジュールはシステム用というよりも個人用の認識なので、sudo使わずに`cpan`としてそれぞれinstallしてみる。

　PhpStormにて、プラグインにPerlを追加した。
![プラグインPerl](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/bf1507a1-46ea-59c3-bd6f-141fad2c61ab.png)

　言語＆フレームワークのPerl5にて、WSL2越しのUbuntu-22.04にあるPerlインタプリタを指定しつつ、「Enable Perl::Critic annotations(should be installed)」をチェックし、「Perl::Tidy command line arguments」に`-l 120`としてみた。
![言語＆フレームワークのPerl5の設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/856e3921-287b-6800-963f-280b1be7cda9.png)

　とはいえ、PhpStormから直接Perlスクリプトを実行するのはできなさそうで、Windows Terminalで開いているUbuntu-22.04窓のbashで実行させてる。

# そのほか、雑なテクニック類のメモ

## コードの始め方

　ひとまずこんな感じ。

```Perl
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
```

　shbangを書いておくことで、Ubuntuコンソール上で直接「$ ./～～.pl」だけでスクリプト実行できるので便利。
　`use utf8;` でUTF-8を扱うのと、`use strict;`で文法チェック強化、`use warnings;`で警告表示。

## 標準出力にUTF-8エンコーディングを指定

　print で変数の中身を出力するときに「Wide character in print at ～」みたいな警告にならないように対策。

```Perl
binmode(STDOUT, ":utf8");
```

　シェルスクリプトで他のコマンドとパイプでつなぐときは、STDINに対しても":utf8"しとくべきでしょうね。

## ファイル入出力時の改行コード指定とエンコーディング指定

　ファイルにアクセスするときの open の書き方。　下記の例はファイル入力としてのもの。

```Perl
open $FH, '<:crlf:encoding(utf8)', '～～.csv';
```

　`:crlf`で改行コードがCR＋LFであることを指示し、`:encoding(UTF-8)`でエンコーディングがUTF-8であることを指示。
　Excelさんが出力するCSVファイルがCRLFで改行とするので仕方ない。
　`:crlf`の指定を忘れると、いくら`chomp $line;`としてもCRコードを省けない。

## 入出力のモード指定の別の方法として

　Perlモジュールの [open \- 入出力のためのデフォルトの PerlIO 層をセットするための perl プラグマ \- perldoc\.jp](https://perldoc.jp/docs/modules/open-1.06/open.pod) によるPerlIO層の変更指示の書き方もアリなようです。
　（試していないので例示は省略。）
【Oracle Cloud Infrastructure, OCI】FTP（アクティブモード）でネットワークロードバランサを通したデータ転送が可能かを検証

# 【概要】
同一サブネット（10.0.0.0/24）にネットワーク・ロード・バランサ（以後NLB。10.0.0.127）、二台のバックエンド・インスタンス（10.0.0.15と10.0.0.229）とクライアント・インスタンスを配置し（OSはいずれもOracle Linux）、FTPのアクティブモードでNLBを介したファイル転送ができるのかを検証した。バックエンド・インスタンスには同名のファイルを配置したうえで、クライアント・インスタンスからロードバランサのIPアドレスにFTP接続を試み、接続先のバックエンド・インスタンス（二台のうち、どちらに接続されるかは分からない）からファイル転送をアクティブモードで行ったところ、転送が成功した（図1）。
![FTP_revised.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/1f14124a-3dc0-6f47-cd21-17b4079a9a99.png)

<div style="text-align: center">図1 検証に用いた構成</div>
二台のインスタンスをNLBのバックエンドとして配置し、それぞれのインスタンスには同名のファイル（test.dat）を配置した。同じサブネット内のクライアント・インスタンスで検証を行った。青色の矢印とオレンジ色の線は、アクティブモードのFTPにおける制御用コネクションの接続要求とデータ転送用コネクションの接続要求をそれぞれ表している。


# 【検証の準備】
- NLBの設定
	- リスナーの設定
        - プロトコル: UDP/TCP
        - イングレス・トラフィック・ポート: 任意のポートを使用
    - バックエンドセットの設定
        - ソースIPの保持を行う
        - ロード・バランシング・ポリシー: 5タプル・ハッシュ

- セキュリティ・リスト
	- イングレス・ルール: ステートフル、ソースが10.0.0.0/24、IPプロトコルがすべてのプロトコルを追加
	- エグレス・ルール: ステートフル、宛先が10.0.0.0/24、IPプロトコルがすべてのプロトコル

- クライアント・インスタンスの設定
    - SELinux: 一時的に無効に（setenforce 0）
    - ftpコマンドのインストール（yum install -y ftp）
    - OSのファイヤーウォールを停止（systemctl stop firewall）

- バックエンド・インスタンスの設定（二台共通）
    - SELinux: 一時的に無効に（setenforce 0）
    - OSのファイヤーウォール: TCPの20番と21番を解放（firewall-cmd --permanent --add-port=20/tcpとfirewall-cmd --permanent --add-port=21/tcpを実行してfirewall-cmd --reload）
    - vsftpのインストール（yum install -y vsftpd）
    - ftpサービスの利用を許可（firewall-cmd --permanent --add-service=ftpを実行してfirewall-cmd --reload）
    - ログインパスワードの設定（passwd opc）
    - 一応、パッシブ・モードを無効に設定し（/etc/vsftpd/vsftpd.confを編集し、pasv_enable=NOを追記する）、vsftpdを再起動（systemctl restart vsftpd）


# 【検証手順】
1. 両方のバックエンド・インスタンスでtest.datを作成した。どちらのインスタンスからファイルが転送されたか分かるように”hello from xx”（xxはプライベートIPアドレスの第四オクテット）と記載した
1. 両方のバックエンド・インスタンスでvsftpサーバーを起動した（systemctl start vsftpd.service）
1. 対話モードのftpを開始
1. アクティブ・モードに変更（passiveと打ち込んだ）
1. ロード・バランサ―のIPアドレスに向けてftpのopenを行った
1. ユーザー名とパスワードを打ち込んでログインした
1. どちらかのサーバーに繋がるので、test.datを取得した（get test.dat）
1. ftpの対話モードを抜け（quitと打ち込んだ）
1. test.datの内容を確認した（10.0.0.15のIPアドレスを持つバックエンド・インスタンスに接続してファイル転送したことが分かった）

```Bash
Last login: Fri Jan  6 02:43:21 2023 from xxx.xxx.xxx.xxx
[opc@client-vm ~]$ sudo su
[root@client-vm opc]# ftp
ftp> passive
Passive mode off.
ftp> open 10.0.0.127
ftp: connect: Connection refused
ftp> open 10.0.0.127
Connected to 10.0.0.127 (10.0.0.127).
220 (vsFTPd 3.0.2)
Name (10.0.0.127:root): opc
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get test.dat
local: test.dat remote: test.dat
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test.dat (14 bytes).
226 Transfer complete.
14 bytes received in 0.000157 secs (89.17 Kbytes/sec)
ftp> quit
221 Goodbye.
[root@client-vm opc]# ls -la test.dat
-rw-rw-r--. 1 opc opc 14 Jan  6 07:33 test.dat
[root@client-vm opc]# cat test.dat
hello from 15
```
【VSCode】The window terminated unexpectedly (reason: 'oom', code: '-536870904') が発生した

# 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590483/b82556b3-9faf-16d6-1a30-f47f819fc9d6.png)

突然の死。VSCodeを使おうとしたところ、画像のような表示になりVSCodeがクラッシュしてしまいました。

先日はこんなことならなかったのに…と思い、原因を探したところ、それっぽいものを発見したので記事としてまとめます。

# 原因

結論から言うと、原因は「**メモリ使用量が多すぎたため**」です。VSCodeのメモリ使用量がPCのメモリを食いつぶした結果、クラッシュしていました。
筆者の場合は、VSCodeを開いたうえでタスクマネージャーを開くと、段々メモリ消費量が増加し、最終的に最大限使用してクラッシュする現象を確認できました。

しかし何が原因でメモリを食いつぶしているのか、確認する前にクラッシュしてしまう問題が発生。そこで、以下の手順によってメモリ使用量を抑えて起動し、クラッシュを防ぎます。

1. コマンドプロンプト（ターミナル）を開く
1. VSCodeの実行ファイルがある場所までcdコマンドで移動する
1. 以下のコマンドによって使用可能なメモリを制限した状態でVSCodeを起動
    ```
    code --max-memory=2048
    ```
    ※ 筆者の環境では`AssertionError [ERR_ASSERTION]: The max-memory argument cannot be specified lower than 2048 MB`というエラーが発生したため2048MBを指定しましたが、エラーが出ないなら値を小さくした方が良い
1. クラッシュせずに開けた場合は、そこから原因を調査する。クラッシュする場合はVSCode以外の全アプリを閉じる。


調べた感じですが、メモリ使用量が多くなる可能性として
* 拡張機能を入れすぎている
* 大量のファイルを開きすぎている
* バージョンの問題

など色々ありそうです。
筆者の場合は、「**起動時に大量のファイルを読み込んだ**」事が原因でした。
リモート環境に入った際に、大量のファイル・ディレクトリのある階層を開いてしまい、その結果メモリ使用量が大変なことになっていました。

# まとめ

メモリ使用量には注意しましょう（戒め）

# 参考サイト

https://github.com/microsoft/vscode/issues/130375

https://howmani.com/vscode_the-window-has-crashed/
Go言語ミドルウェア例

**やりたいこと**
動的に２つのミドルウェアメソッドを呼んでから最後に対象ハンドラーを呼べるようにします。
　・middleware2⇒middleware1⇒handler

**サンプル**

```golang
// main.go
package main

import "fmt"

type handlerFunc func(interface{})
type middlewareFunc func(interface{}, handlerFunc)

func main() {
	middlewares := []middlewareFunc{middleware1(), middleware2()}
	c := chainHandler(middlewares)
	c("テスト", handler())

}

func handler() handlerFunc {
	return func(param interface{}) {
		fmt.Println("handler1")
		fmt.Println(param)
	}
}

func middleware1() middlewareFunc {
	return func(param interface{}, handler handlerFunc) {
		fmt.Println("middleware1")
		handler(param)
	}
}

func middleware2() middlewareFunc {
	return func(param interface{}, handler handlerFunc) {
		fmt.Println("middleware2")
		handler(param)
	}
}

func chainHandler(middlewares []middlewareFunc) middlewareFunc {
	return func(reqParam interface{}, handler handlerFunc) {

		chain := func(middleware middlewareFunc, handler handlerFunc) handlerFunc {
			return func(param interface{}) {
				middleware(param, handler)
			}
		}

		h := handler
		for i := len(middlewares) - 1; i >= 0; i-- {
			h = chain(middlewares[i], h)
		}
		h(reqParam)
	}
}
```

**main実行結果**
middleware1
middleware2
handler1
テスト

**ポイント**
middlewareFuncをラップするメソッドのI/FをhandlerFuncと同じにする。
vue cli で vue 2.6 -> 2.7 に update して出たエラーいろいろ。sass-loaderでハマりました

３年放置してる vue2.6 の project の packages をアップデートしてみた。element-ui の bug があり、firefoxで崩れると言われたもので・・ firefoxは1%切りそうなユーザなので無視したいんだけど、かわいそうなのでやることにする

vue3 はきついのでとりあ vue2.7にする. だいたい動いたけど sass-loader でつまづいた


# Vue cli で Vue 2.6 → 2.7 にする

## disableHostCheck が使えない

```diff:vue.config.js
module.exports = {
   devServer: {
     host: '0.0.0.0',
-    disableHostCheck: true,    <---- error
+    allowedHosts: "all",     <----- 入れ替え
```

## Moment の locale 設定でエラー

```diff:vue.config.js
module.exports = {
   },
   configureWebpack: {
     plugins: [
+      /**
+       * Ignore Moment locales
+       * https://webpack.js.org/plugins/ignore-plugin/
+       */
+      new webpack.IgnorePlugin({
+        resourceRegExp: /^\.\/locale$/,
+        contextRegExp: /moment$/,
+      }),
       // new BundleAnalyzerPlugin(),
-      new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
-    ]
```

※ moment自体使わないのが吉です

## sass-loaderが動かない

.vue ファイルの `<style lang="scss">` で scss 変数を使うのに必要。

### error

```rb
Syntax Error: ValidationError: Invalid options object. Sass Loader has been initialized using an options object that does not match the API schema.
 - options has an unknown property 'presentedData'. These properties are valid:
   object { implementation?, api?, sassOptions?, additionalData?, sourceMap?, webpackImporter?, warnRuleAsWarning? }
```
### sass-loader >= 9 + vue cli の書き方

#### 1. まず `vue.config.js` を修正
  ```diff:vue.config.js
  module.exports = {
    ...,
    configureWebpack: {
      ...
    },

     // .vue の <style lang="scss"> で CSS 変数を使えるようにする
     css: {
       loaderOptions: {
  -      sass: {
  -        prependData: `@import '@/element-variables.scss';`
  +      scss: {
  +        additionalData: `@import '@/element-variables.scss';`
         }
       }
     }
  ```

  この２行で死ぬほどハマりました。普通にvue公式に書いてた。

  ref

  https://cli.vuejs.org/guide/css.html#css-modules

#### 2. vue.configだけでは直らない

  `SassError: This file is already being loaded.` と言われた場合、他でimportしてるのをやめる必要がある

  ```diff:main.js
  -import './element-variables.scss'
  +// import './element-variables.scss'
   
  ```




これで移行できたっぽいです。
数当てゲーム②(Powershell)

**Powershell**で数当てゲームを作りました。
今回は前回から改良して、
**5回失敗したら失敗**
**正解の数字のヒントが出る**
を実装しました

```Powershell
#########################################
########## Powershell  ##################
######### 1から30までの数字を当てる######
###### 新規作成 2023/1/27          ######
#########################################


$input_ans = 0
$ans = Get-Random -Minimum 1 -Maximum 30
$cnt = 0
$sw = 0
#画面を綺麗にする
cls

while ($cnt -lt 5){
    $input1 = Read-Host("1から30までの整数を入力してください")
    #入力を一旦数値に変換する。もし失敗すれば数値以外が入力されていると分かる。その場合はもう一度入力させる
    if ([int]::TryParse($input1,[ref]$input_ans) -eq $false){
        Write-Host "整数以外を入力しないでください"
        #whileの行まで戻る
        continue
    }   
    if ($input_ans -lt 1 -or $input_ans -gt 30)  {
        Write-Host "1から30までの整数を入力してください"
        #whileの行まで戻る
        continue
    } else {
       $cnt++
       if($input_ans -eq $ans){
            Write-Host("${cnt}回目で正解です")
            break
       } else {
            if($input_ans -lt $ans){
                Write-Host "入力した整数は正解の整数より小さいです"
            } else {
                Write-Host "入力した整数は正解の整数より大きいです"
            }                     
            if ($cnt -eq 5){
                $sw = 1
                Write-Host("${cnt}回不正解でした")
                break
            } 
       }
    }
}        

if($sw = 1){
    Write-Host("正解は${ans}です")
}
```

以上です。
【Dr.Sum VTB】OCI8接続を使えるように設定する


# Dr.Sumとは
ウイングアーク1st社のBIツール。
早い・使いやすい・コストパフォーマンスよし。とても好きです。
社内データ分析の基盤になれます。

https://www.wingarc.com/product/dr_sum/?utm_source=google&utm_medium=cpc&utm_campaign=ds&gclid=Cj0KCQiA8t2eBhDeARIsAAVEga1vGO7vVlWg7FReJDcO5pbNink-MTXvYtCuDslzHO2uiw8qgnw4o_oaAgkYEALw_wcB#argument=RTXsp5Bn&ai=a6153d2a3e7761

# 今回やりたいこと
VTBを使ってOracleから直接データ抽出→インポートする場合、可能な限りOCI8を使うようにしています。ODBCより早いからです。
ただし！Dr.SumサーバでOCI8を使えるようにする設定が必要。
その手順をまとめています。

ざっくりいうと、
（1）必要なものをOracleサイトからダウンロード
（2）Dr.Sumサーバに任意のフォルダ作成
（3）ダウンロードしたものを（2）に全部コピー
（4）環境変数の設定
（5）Dr.Sumサーバ再起動
（6）VTBで接続確認

※VTB参考資料

https://qiita.com/ratsbane666/items/0046fc30aebad4504d62

https://qiita.com/ratsbane666/items/e0f5ce2a10fc2785e1a2

# 環境
サーバ：WindowsServer2019　x64 64bit
Dr.Sum：5.5

# 手順
## （1）必要なものをOracleサイトからダウンロード
※今回はWindows 64bitにインストールすると仮定しております。
### Oracle Instant Client (for Microsoft Windows (x64) 64-bit)
https://www.oracle.com/jp/database/technologies/instant-client/winx64-64-downloads.html

#### Oracle OCI8
Oracle Instant Client Basicに含まれてます。

#### Oracle SQL*Plus
入ってると何かと便利です。
Oracle Instant Client Basicとは別にダウンロードします。
<b>ダウンロードしたZIPはそれぞれ解凍しておきましょう。</b>


## （2）Dr.Sumサーバに任意のフォルダ作成
今回はDドライブにoracleフォルダを作製。

:::note info
D:\oracle
:::

## （3）ダウンロードしたものを（2）に全部コピー
こんなかんじになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/b180fd58-a419-e3ec-e534-62dd459b4cfe.png)

## （4）環境変数の設定
コントロールパネルで「環境変数」を検索すると楽です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/14cf0101-517b-1adf-ea40-72a744c682f5.png)

この画面から設定していきます。3つね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/b90f37fb-b1aa-871d-3839-611775891944.png)

### NLS_LANG
JAPANESE_JAPAN.JA16SJISTILDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/dc54eac3-17be-8b85-fbed-16a8f8de885b.png)

### TNS_ADMIN
作成したフォルダ（今回の例ではD:\oracle）を登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/9dff8012-a3d0-e775-0890-6a172d8e8f12.png)

### PATH
作成したフォルダ（今回の例ではD:\oracle）を登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/f56d51f3-59e7-1fd9-ee2a-b4546b5a613c.png)

丁寧に説明してるサイトがありましたのでご参考に。

https://yutoko.com/oracle%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86/

## tnsnames.ora設定
Oracle界では伝統的なスキーマ接続情報ファイルです。
作成したフォルダ（今回の例ではD:\oracle）にいれましょう。
※利用環境に合わせた内容を用意する必要があります。

## （5）Dr.Sumサーバ再起動
設定を有効にするため。

## （6）VTBで接続確認
### VTB Creator起動
スタートメニューのここにあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/cb4bb85b-b9bb-bef4-d2a9-3f17cf655d8c.png)

### データソースを作成
赤枠のとこ設定必要です。
データソースはtnsnames.oraに設定済の想定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/0c0d90d3-03bf-e5c9-aeb5-551a469f535f.png)
テストボタン押して確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/1a8b23e2-9419-640e-6911-6f43ba6d47e0.png)

# OCI8関連の参考情報（ウイングアーク）

http://navi.wingarc.com/drsum/drsum-oci.html

https://cs.wingarc.com/ja/kb/000002081

以上
Railsのタスクを定義する

Ruby on Railsアプリケーションを開発で定型の操作を繰り返すときは、タスクを定義すると便利です。

## 前提条件

あるRailsアプリケーションでは、ファイルアップロードジョブの途中で例外がおきたとき、処理途中のファイルやレコードが残ります。このため、開発の途中でしばしば次のコマンドを実行して、ゴミ掃除をしています。

```sh
bin/rails runner 'Job.destroy_all'
rm -rf tmp/upload-*
```

## テンプレートの作成

今回はこのコマンドをRailsのタスクにしてみたいと思います。
Railsのタスクの実体はlibディレクトリ配下にあるRakeタスクです。
テンプレートをRailsのジェネレートコマンドで作ることが出来ます。

まず、最初にどのようなコマンドで、実行できると良いか考えてみましょう。
ジョブのゴミ掃除なので、`job:clean`が良いと思います。
完成したら次のように実行するイメージです。

```sh
bin/rails job:clean
```

タスク名がきまったらジェネレートコマンドでテンプレートを作成します。

```sh
bin/rails g task job clean
```

:で区切られたタスク名を空白で区切って指定します。
するとlibディレクトリに次のようなテンプレートが作成されます。

```rb
namespace :job do
  desc "TODO"
  task clean: :environment do
  end

end
```

このtaskブロックに必要な処理を記述します。

## レコードの削除

まず、簡単な`Job.destroy_all`を書いてみます。

```rb
namespace :job do
  desc "TODO"
  task clean: :environment do
    Job.destroy_all
  end
end
```

これだけでレコードを削除するRailsのタスクが定義できました。

## ファイルの削除

次にファイルの削除も対応してみましょう。
`rm -rf tmp/upload-*`をRubyスクリプトに置き換えます。

`rm -rf`の代わりに`FileUtils.rm_rf`を使います。

メソッドに指定するディレクトリのパスを取得します。
tmpディレクトリは実際にはRailsアプリケーションのtmpディレクトリです。
つぎのように、該当するディレクトリを取得します。
`Dir.glob Rails.root.join("tmp/upload-*")`

これをタスクファイルに追加します。

```rb
namespace :job do
  desc "TODO"
  task clean: :environment do
    Job.destroy_all

    require 'fileutils'
    FileUtils.rm_rf(Dir.glob Rails.root.join("tmp/upload-*"))
  end
end
```

## 完成

`bin/rails job:clean`を実行して、期待通りにゴミ掃除できているか確認します。
できていたら整形します。

```rb
namespace :job do
  desc "Delete the remnants generated by the annotation upload job"
  task clean: :environment do
    # Delete Job records
    Job.destroy_all

    # Delete uploaded files
    require 'fileutils'
    directory = "tmp/upload-*"
    list = Dir.glob Rails.root.join(directory)
    FileUtils.rm_rf(list)
  end
end
```
Oracle Analytics Cloud：ADWへのウォレットレス接続のサポート

# はじめに
ウォレットなしでAutonomous Data Warehouse（**ADW**）への「接続」を作成します。
1521ポートを使用するので注意してください。

# ADWへの接続文字列の取得
OCIコンソールにログインし、接続先のADWインスタンスの詳細画面を表示します。
「データベース接続」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0c9d082e-a5fa-a6aa-e629-3d0f1f94d380.png)
TLS認証を「TLS」に変更し、3つのTNS名の中から適切なものを「コピー」してメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d2ff8531-8b1e-4cd4-d76a-62441322b52c.png)

:::note info
「TLS認証」を相互TLSからTLSに変更するには、ADWインスタンスをPrivate Endpointで作成するか、Public EndpointのADWインスタンスのアクセス制御リストを設定する必要があります。
- [Oracle Analytics Cloud：接続先のADWにACLを設定する](https://qiita.com/tyo38/items/b4e6946535f19578ad22)
:::

# ADWへの接続を作成
OACにログインし、「接続」を新規作成します。
接続タイプとして「Oracle Autonomous Data Warehouse」タイプを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/9f539b8d-5656-9c1c-6af7-51c69e7056ee.png)
「暗号化タイプ」を「TLS」にして、接続文字列に先程メモした内容をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ad0e95cc-4f20-f639-6d74-ff3daf60ff00.png)
「保存」をクリックします。

# 接続確認
作成した接続定義を使って、検索できることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b98d5d0a-bb3f-6a34-5aaa-dfb842fc6d33.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7cdf4bdc-6310-d288-4baf-d23b3bb9d13d.png)
[Blender]テクスチャーベイクの手順

# 概要
Blenderでテクスチャー画像をベイクする手順です。
# 本文
初期のCubeに対して
![スクリーンショット 2023-01-31 9.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/6abef683-c0f5-7d49-1b58-def89db883ef.png)
マテリアルを追加します
![スクリーンショット 2023-01-31 9.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/421495e0-2659-0b28-6cb1-fcf8a17864fa.png)
UV Editing画面に移動して「**New**」を押し、テクスチャ画像を追加します。
![スクリーンショット 2023-01-31 9.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/b1e91f5b-81a0-9c54-e376-100b947dd44f.png)
そのまま画像を保存してください
![スクリーンショット 2023-01-31 9.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fbacf664-1a66-5b84-44e8-f3cd369da511.png)
Shading画面に切り替えます。
ノードを2つ追加します。
Texture > Image Texture
![スクリーンショット 2023-01-31 9.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/099ba59e-7513-5d84-763b-2c77d07a51c1.png)
Texture > Checker Texture
![スクリーンショット 2023-01-31 9.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/03796a0c-65bb-036c-68a2-07c7607a78d0.png)
あとは以下スクショのように設定します（ImageTextureに先ほど作成したテクスチャ画像を指定して、CheckerTextureをPrincipledBSDFに接続します）
準備ができたら最後に**ImageTextureノードを選択状態にします**
![スクリーンショット 2023-01-31 9.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/b427cd17-dcca-56a1-64e2-7d40ba43d2de.png)
Render EngineをCyclesにして
![スクリーンショット 2023-01-31 9.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/bed52e7d-010a-8b23-d019-84e58b8db2c8.png)
このように設定できたら最後にBakeボタンを押します。
![スクリーンショット 2023-01-31 9.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f203c9ca-6c80-c223-c8b3-031d09555dc8.png)
テクスチャーのベイクができました。完成です！
![スクリーンショット 2023-01-31 9.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c077cf5d-961b-4ab9-cc6e-2199f8ed0fa0.png)
顧客分析の手順 - 分析フォーマットの利用 

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

著者 山本 泰史 （やまもと やすし）

# 顧客分析の手順

## 第10回： 分析フォーマットの利用
前回までで、分析にまつわる諸手順を概観してきました。ここまでの流れをまとめると、以下のようになります。

１． データを用意する
１－１． データ単位（顧客毎のデータ）の用意
１－２．変数（顧客属性／指標）の用意

２．各変数の特徴を理解する

３．複数の顧客群に分類し、比較する

１．において行に顧客、列に各変数を配置した分析データセットを作成しました。そして 2. においては列、つまり各変数に着目し、変数の特徴を理解しました。そして 3. においては行に着目し、近似の行をグルーピングするセグメンテーションの考え方、そして各セグメントの特徴を理解しました。

ここまでで自社の顧客に関する大まかな姿を理解できたと思いますが、一方で本来の目的は業績指標改善への寄与であり、そのための行動（= キャンペーン活動）を特定することであることは忘れてはなりません。この目的に対して、ここまでの基礎的な分析はマクロ的な意味合いが強く、どんなキャンペーンを実施するべきか、そのキャンペーンの内容はどうあるべきかという知識を得るには充分ではありません。 ここでは、より詳細に、キャンペーンを実施すべきポイント、そしてキャンペーンの詳細を決定するために必要な知識を得るための分析について考えます。


### 枠組み
次回以降、具体的な分析例をご紹介していきますが、各分析例の位置づけをご理解いただくための軸として 2つの軸を考えます。1つ目の軸は、顧客管理上のテーマである「新規顧客の獲得」、「顧客リテンション」、「優良顧客の育成」です。これを「経費効率の向上」を伴って実施しなければならず、従って全てのキャンペーンはこれら 3つのテーマのうち少なくとも 1つ以上に寄与することが求められます。従って、以下 3つのテーマを最初の軸として考えます。

１．「新規顧客の獲得」： 新規顧客の増／減ポイントはどこか？
２．「顧客リテンション」： 既存顧客の増／減ポイントはどこか？
３．「優良顧客の育成」： 顧客支出の増／減ポイントはどこか？
次にもう 1つの軸として、実績データの要素毎に分解することを考えます。本稿の第3回にて示したように、顧客の実績データは大きく、「誰が？」、「何を？（商品／サービス）」、「いつ？」、「どこで？」、そして「どれだけの量の行動を起こしたのか？」についての履歴を有しています。この 5つの要素毎に分解することによって、キャンペーンの構成要素である 4つの要素を規定するにあたっての知識を得ることが可能となり、またその際のビジネス上の効果を定量的に想定することが可能となります。このため、以下に示す 5つの要素がもう一つの軸となります。

１．「顧客属性」： 誰が？
２．「商品／サービス」: 何を？
３．「時間、期間」： いつ？
４．「チャネル」： どこで？
５．「定量指標」： どれだけの量の行動を起こしていたのか？
この 5つの要素に分解するための分析フォーマットとして、当社では顧客分析とキャンペーン管理の統合ツールである「Teradata Relationship Manager」内に、以下に示す 5つの分析モジュールを用意しており、これにより上記 5つの要素、そして 3つの顧客管理上のテーマについての分析が可能となっています。


１．「行動トレンド分析」： 時系列で顧客属性／行動毎の変化を把握
２．「パーセンタイルプロファイリング」： 任意の定量指標で顧客をグループ化し、グループ間比較を実施
３．「クロスセグメント分析」： 縦横それぞれに複数セグメントを配置し、セグメント間の重複／集中／分散を把握
４．「関連性分析」： 商品／サービス毎の利用実績を把握、商品／サービス間の関連性を理解
５．「パターン検出分析」： 特定顧客行動の前後に発生した顧客行動を把握し、パターンとして理解

もちろん、理解したい内容によっては、これ以外の分析フォーマットが適切かもしれません。本来は理解したい内容に応じて適切な分析フォーマットが選択されるべきですが、一方で何もない所からフォーマットを作り出すことは手間であり、一定の能力も必要になります。このような手間を軽減しつつ分析業務を容易にボトムアップでき、なおかつ顧客管理上重要とおぼしき見方をある程度網羅できるよう、各分析モジュールは開発されました。このため、あくまでも基礎的な分析フォーマットとして各分析モジュールを利用し、分析例をご紹介していくことにします。

図18 をご覧下さい。このチャートでは前述した 5つの実績データに関する要素と、各要素を分解して把握するに当たっての各分析モジュールの適性を示しています。実績データに関する要素と 1 対 1 の関係には無いため、若干理解が難しく感じるかもしれませんが、5つのモジュールのいずれかを使えば、5つの各要素を網羅できることをご理解いただければ、理解としては充分です。



<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/aba96a1e-5009-b1da-ba53-fe96e29ecc9e.png">

次回以降、これら 5つの分析モジュールを「新規顧客の獲得」、「顧客リテンション」、そして「優良顧客の育成」という 3つのテーマに適用していきます。従って合計で 5 * 3 = 15 の分析例をご紹介していきます。



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
VantageのデータをAmazon QuickSightでビジュアル化してみた

とても多くのお客様がVantageとAWSのサービスとの統合に関心を持っています。そのようなトピックからここではAmazon QuickSightとVantageの統合について説明します。

このガイドで説明するアプローチはQuickSightと統合するための多くの可能性のあるアプローチの一つであり、そのままの形で提供されるものです。 このアプローチは社内で実装されテストされていますがTeradataまたはAWSのいずれからもこのアプローチに関する正式なサポートはありませんのでご注意ください。

とはいえ、何がうまくいったのか、何がうまくいかなかったのか、どうしたら改善できるのか、などなど皆さんのフィードバックはとても望ましくありがたく思います。

ご意見・ご感想はコメントとしてお寄せください。

免責事項：本ガイドはAWSとTeradata製品の両方のドキュメントからの内容を含んでいます。

# VantageとAmazon QuickSightでできること

・**すぐに始められる** - サインインしてデータソースを選択し、最初のビジュアライゼーションを数分で作成することができます。

・**複数のソースからデータにアクセス** - オンプレミスまたはクラウド上の独自のVantageシステムの使用、ファイルのアップロード、AWSデータソースへの接続が可能

・**ダイナミックなビジュアライゼーションの活用** - 選択したフィールドに基づき、スマートなビジュアライゼーションが動的に作成されます。

・**答えを素早く見つける** - 大規模なデータセットに対して、高速でインタラクティブなビジュアライゼーションを生成します。

・**データでストーリーを語る** - データダッシュボードやポイントインタイムビジュアルの作成、インサイトの共有、他者とのコラボレーションが可能です。

# はじめに

Amazon QuickSightは、ビジネスアナリティクスの可視化サービスです。以下の手順で、Vantageをデータソースとして使用することができます。QuickSightはVantageというブランド名以前のTeradata RDBMS時代のTeradata 14.0からサポートしています。QuickSightは、クラウドまたはオンプレミスのVantage（Teradata RDBMS）に接続することができます。

# データセットの作成
● "新規解析 "を選択する

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/af584af7-274c-07c4-60ee-8c5eaae93c43.png)

●"新しいデータセット "を選択する

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/1a6ec82b-c4a1-4fb9-a86a-5752f862d85d.png)

●"Teradata "を選択する

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/ba3e788c-b48e-ec42-37fa-7258cb5902dc.png)

●データソース情報と認証情報を入力し、Teradataシステムに接続します。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b7926c52-f74a-cbf3-91c0-9165cda2a5cb.png)

-Teradataは1025番ポートを使用します。
-ネットワーク接続にSSLを有効にすることをお勧めします。

# データの準備

以下のいずれかを選択することができます：

●テーブルを選ぶ
特定のテーブルやビューに接続する場合は、「テーブルを選択」を選択します。


テーブルの結合

QuickSightでのテーブルの結合に関する情報は、Amazon QuickSightのドキュメントを参照してください。
[https://docs.aws.amazon.com/quicksight/latest/user/joining-tables.html](https://docs.aws.amazon.com/quicksight/latest/user/joining-tables.html)

大規模なデータセットで最適なパフォーマンスを発揮するために カスタムSQLを使用することをお勧めします。

●カスタムSQL

-**カスタムSQLを使用する**オプションで独自のクエリを作成することができます。**Teradata Studio**でクエリを作成し、ウィンドウに貼り付けると効果的です。
-Confirm query "を選択し、SQLを検証する。

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/4c80af18-0b66-dce7-efff-900c44733691.png)

-直接クエリを選択すると、Teradataの大規模なデータセットに対して最速の結果を得ることができます。

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b77b3975-84fa-d040-f75e-798e93faa657.png)
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/160a0400-596a-0d03-a6b1-d9d4c2f59e33.png)

●データの編集・プレビュー

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/ffca3e73-0eb7-e967-145a-71b0761e2253.png)

●データセットから分析結果を可視化

![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/aeac1f6a-5043-9458-d8da-ef2e9619f3ab.png)

# おわりに
このようにAmazon QuickSightを使用して簡単にデータをビジュアル化することが可能です。ぜひご活用ください！

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
Db2 for i でデータ型の異なるテーブル間でデータをコピーしたい

最近質問頂いた件で、元々業務で使ってるテーブルがあるのですが、外部からアクセスさせたい要件でカラムのタイプを変更して見せたい、ということでした。比較的小規模なテーブルでリアルタイムデータである必要はないとのことで単純にファイルコピーで解決する案をご紹介しました。

カラムタイプが異なるテーブル間でのデータコピーのキモは、カラム名（フィールド名）を同一にしてCPYFコマンドで *MAP *DROPを指定指定コピーする、となります。（当然ですがFrom/Toのカラム内のデータが変換可能であることが条件です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6c4c7882-9a88-a9d4-9510-99c324f51647.png)


■大まかな環境
テーブルのFrom/Toの概要は以下の通りで、数値フィールドの値をINTEGER型で外部で使用したい、とのことでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/863e11c1-621b-6bb9-876e-bcd30674f728.png)

■手順
今回は外部に見せたいテーブルも新たに作るということでその手順もガイドしました。
1)ACSのスキーマ表などから対象のテーブルを表示します。対象のテーブル（例ではZAIKOM）を右クリックして SQLの生成 をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1c5f1977-bc99-f9c7-a527-3948090cd361.png)

2)FromテーブルのDDLが生成されます。いくつかのカラムがDECIMALで定義されています。（最初の表とカラム名などがあってませんがご了承ください）。ここからカラムのデータ型を変更して外部に見せたいテーブル名に修正してこのDDLを実行して外部に見せるテーブルを作成します。
＊下図の2つ目以降のDDLは元テーブルのラベル等の設定ですので不要な場合もあると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c41312f4-7ab0-8416-ccf6-1117c12650d5.png)

3)数値のデータ型をすべてINTEGERに変更します。テーブル名も任意に変更しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/09415623-f556-c663-d1cb-92017f68e851.png)

4)一番左端の砂時計アイコンか、実行->すべて を選択しDDLを流します。メッセージ欄に成功、と表示されるのを確認します。これでToテーブルが生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cb87e47d-2cfa-baaa-112a-08fa3123d357.png)

5)Fromテーブルのレコードをコピーします。Db2 for i(IBM i OS)のCPYFコマンドでデータをコピーします。この際、パラメーターで *MAP *DROPを指定するのがポイントです。GUIやブラウザーからコマンド導入もできますがここではレガシーな5250で（操作が早いのでｗ）
TOファイル　：　作成するテーブル名
レコードの置き換えまたは追加　：　*ADD or *REPLACEを指定（今回の場合どちらでも同じ結果）
ファイル作成　：　*NO
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/24ceb618-5850-1a77-a475-d69a0da10892.png)


PF9キーを押して追加パラメーターを表示して、次ページを複数回押します、
下記画面は文字化け（あえて）してますが、FMTOPTパラメーターに *MAP と *DROPの2つを指定します。
エンターキーを押すとレコードがコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e92cd7ed-5626-4e4e-f00e-f71c530ba50e.png)

正しく完了すると下記のようなメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0f2a2183-ee38-172f-10a9-f9872cb1be13.png)

6)レコードがコピーされたか確認します。ほぼ100%のシステムにQUERY/400が導入されていると思うのでこれを使って RUNQRY *N DEMOLIB/ZAIKOM5　（ZAIKOM5は作成したテーブル名）のように実行します。下記のようにコピーされたテーブルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e7edf6e1-ecdb-1e87-1ff8-91664e0ad824.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6c01d495-0342-678e-d723-0105d127f859.png)
Promiseの配列を順番に実行したい

# TL;DR

```typescript
type Supplier<T> = () => T;

export const sequence = <T>(promises: Supplier<PromiseLike<T>>[]): Promise<T[]> => {
  if (promises.length === 0) {
    return Promise.resolve([]);
  }

  return new Promise((resolve, reject) => {
    const results: T[] = [];

    promises
      .reduce((p1: Supplier<PromiseLike<T>>, p2: Supplier<PromiseLike<T>>): Supplier<PromiseLike<T>> => {
        return () => {
          return p1().then((t: T) => {
            results.push(t);

            return p2();
          });
        };
      })()
      .then(
        (t: T) => {
          results.push(t);
          resolve(results);
        },
        (e: unknown) => {
          reject(e);
        }
      );
  });
};

```

## 経緯

ときどき `Promise<T>[]` を0番目から順番に実行してほしいことがあります。こんなときに `Promise.all()` を使ってしまうととすべての `Promise` を同時に実行してしまうためこの要件を満たすことができません。そこで0番目の `Promise` が履行されたら1番目の `Promise` を、1番目が履行されたら2番目を...といった順次実行ができる `Promise` の処理を考えてみました。

## 結論

できれば `Promise.all()` とシグネチャを同じにしたかったが不可能でした。参考 :point_down: 

```typescript
Promise.all<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>;
```

理由は `Promise` の実行を遅延させるために関数で包んであげないといけなかったからです。
Github Actionsによるflutter用 CIの導入



## flutter test を実行するGHA workflow

```yml
name: flutter_test

on: pull_request

jobs:
  run_flutter_test:

    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: flutter cache
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.3.10"
          channel: "stable"
          cache: true
          cache-key: flutter
          cache-path: ${{ runner.tool_cache }}/flutter

      - name: install Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.3.10"
          channel: "stable"

      - name: run flutter pub get
        run: flutter pub get

      - name: run flutter test
        run: flutter test
```

## flutter analyze を実行するGHA workflow
```yml
name: flutter_analyze

on: pull_request

jobs:
  run_flutter_analyze:

    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: flutter cache
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.3.10"
          channel: "stable"
          cache: true
          cache-key: flutter
          cache-path: ${{ runner.tool_cache }}/flutter

      - name: install Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.3.10"
          channel: "stable"

      - name: run flutter pub get
        run: flutter pub get

      - name: run flutter analyze
        run: flutter analyze
```
WordPressで年・月・日を分けて出力する方法

よくある記事の時間表示方法としては、以下の書き方。

```php
<?php echo get_the_date('Y.m.d'); ?>
```

## 年・月・日を分けて出力する方法

```php
<?php
  $post_year = get_the_date('Y');
  $post_month = get_the_date('m');
  $post_day = get_the_date('d');
?>
<?php echo $post_year ?> 年
<?php echo $post_month ?>月
<?php echo $post_day ?>  日
```

d：先頭にゼロがついた日。01 – 31
j：先頭にゼロがつかない日。1 – 31
m：先頭にゼロがついた月。01 – 12
n：先頭にゼロがつかない月。1 – 12
F：フルスペルの月。日本語環境下では1月 – 12月、英語環境下ではJanuary – Decemberと表示される
Y：西暦。たとえば2018など

https://thewppress.com/libraries/get-the-date/