OmniAICreator/Qiita-1.07M huggingface dataset:
【Azure】Terraformで Azure Monitorを使ってみた


# はじめに
前回は、Terraformを活用して、Virtual Machineを関連するリソースを構築しました。
今回は、Azureリソースの監視を行うために、VMの監視構成をTerraformで構築していきたいと思います。

【前回の記事】

https://qiita.com/Edogawa_Taro/items/f09cb0ac35011b28b6dc

# 構成するリソース

やりたい事①：VMのActivitiy Logを検知後、任意のメールアドレスへ通知
・アクティビティログアラートルール
・アクショングループ（メール通知用）

やりたい事②：CPUの使用率を閾値50%以上で監視し、任意のメールアドレスへ通知
・メトリックアラートルール
・アクショングループ（メール通知用）

※メール通知のアクショングループは宛先も同じなので同一のものを紐づけます。

https://learn.microsoft.com/ja-jp/azure/service-health/resource-health-checks-resource-types

## TFファイルを作成
今回はVMやリソースグループは省略して、Azure Monitorの部分だけ記載していきます。

```Terraform:main.tf
#Monitor Create

resource "azurerm_monitor_action_group" "main" {
  name                = local.action_groupname
  resource_group_name = azurerm_resource_group.rg.name
  short_name          = "test01"

  email_receiver {
    name = "test01"
    email_address = local.mail_address
  }
}

resource "azurerm_monitor_metric_alert" "metric_alert_01" {
  name                = local.metricalert_name
  resource_group_name = azurerm_resource_group.rg.name
  scopes              = [azurerm_windows_virtual_machine.vm.id]
  frequency = "PT5M"
  severity = "4"

  criteria {
    metric_namespace = "Microsoft.Compute/virtualMachines"
    metric_name      = "Percentage CPU"
    aggregation      = "Average"
    operator         = "GreaterThan"
    threshold        = 50
  }

  action {
    action_group_id = azurerm_monitor_action_group.main.id
  }
}

resource "azurerm_monitor_activity_log_alert" "main" {
  name                = "example-activitylogalert"
  resource_group_name = azurerm_resource_group.rg.name
  scopes              = [azurerm_resource_group.rg.id]

  criteria {
    resource_id    = azurerm_windows_virtual_machine.vm.id
    category       = "ResourceHealth"
  }

  action {
    action_group_id = azurerm_monitor_action_group.main.id
  }
}
```

```Terraform:local.tf

  action_groupname = "sample-action-group"
  metricalert_name = "smple-metric"
  mail_address = "任意のメールアドレスを記入"
  
```

main.tfをterraform applyで実行すると
下記の写真の様にアラートルールとアクショングループが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471206/88fadb57-90d0-a7ef-e810-58f19f4216d3.png)

実際にこんな感じでメールも届きますので、設定は問題なさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471206/83a07752-0d05-90ee-ddfe-23997c5dd0d5.png)

# さいごに

Azure Monitorでは他にもログの収集も行える、Log Analyticsというサービスがあります。
機会があればこのサービスもTerraformで構築する事にチャレンジしてみます。
ここまで見てくれてありがとうございました。
何か意見あればコメントください。
Amazon ECS 上の Nginx + php-fpm で IAM Role の認証が nginx ユーザーに渡らなかった問題の解決方法

Amazon ECS (on ECS) で、nginx ユーザーとして起動している PHP (php-fpm) アプリが、S3 にファイルをアップロードできなかった時の対処方法です。

# 前提条件

- Amazon Linux 2023 のコンテナー
- Concrete CMS 9.2.x
- PHP バージョンは Amazon Linux 2023 レポジトリの v8.2.x
- MariaDB は 10.11.x
- Nginx & php-fpm を nginx ユーザーとして起動
- ECS タスクロールに S3 バケットにアップロードできる権限を付与
    - [Concrete CMS 用 S3 バケット IAM Policy サンプル](https://qiita.com/katzueno/items/4b128e04db0d3b1bda24) プラス、他のタスクロール

# エラー

Concrete CMS 管理画面から、S3 でファイルをアップロードしようとすると、以下の 403 エラーが出てしまいました。

```
  Error executing "ListObjectsV2" on "https://[バケット名].s3.ap-northeast-1.amazonaws.com/?list-type=2&prefix=&delimiter=%2F"
  ; AWS HTTP error: Client error: `GET https://[バケット名].s3.ap-northeast-1.amazonaws.com/?list-type=2&prefix=&delimiter=%2F
  ` resulted in a `403 Forbidden` response:
  <?xml version="1.0" encoding="UTF-8"?>
  <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>EY5N4E (truncated...)
   AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?>
  <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>[省略]</RequestId><HostId>[省略]</HostId></Error>
```

しかし (ECS on EC2 なので) コンテナーの中に bash で入って、aws s3 の CLI コマンドを打つと、ちゃんと問題なくファイルをアップロードできました。 ECS のタスクロールは正常でした。

root ユーザーでは正常に S3 にアクセスできたのに、nginx ユーザーではアクセスできなかったのです。


# 原因: Nginx ユーザーに AWS_CONTAINER_CREDENTIALS_RELATIVE_URI が渡ってなかった

ECS タスクロールから降ってくる IAM ロールの認証情報に必要な `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ` サーバー ENVIRONMENT 環境変数は、root ユーザーにしか付与されず、nginx ユーザーには渡らなかったのです。

PHPのSDKは `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` か `AWS_CONTAINER_CREDENTIALS_FULL_URI` をみに行くようになっていたとのことです。

一時的に `usermod -s /bin/bash nginx`コマンドで nginx ユーザーとして `su - nginx` コマンドでログインできるようにして `printenv` コマンドで、environment を確認できます。

(実際は、弊社マカルーデジタルのエンジニアが PHP スクリプトを作ってデバッグしました。)

# 解決方法: php-fpm 設定で root の environment 情報をクリアしないように設定

そこで「[ECS上のPHPアプリからAWS SDKを使うとmetadata endpointへアクセスできない問題の備忘録](https://blog.pinkumohikan.com/entry/could-not-retrieve-credential-when-using-aws-sdk-from-php-app-on-ecs)」ブログ記事に詳細と解決方法が記載されています。

僕は、以下の設定を追記することにしました。

```/etc/php-fpm.d/www.conf
clear_env = no
```

イメージをビルドし直し、無事に php-fpm から S3 バケットにアップロードできました！

注意: この方法は php-fpm でアクセスできるようにするものです。 bash (or CLI) での nginx ユーザーからはまだアップロードはできません。
【terraform】rds performance insight参照権限をつくってみた

## 概要
terraformを用いて特定のDBインスタンスのRDSのパフォーマンスインサイトのみを参照するIAMポリシーを作成することがあったので、その備忘録として記録します。


## 作ったもの
- iam_policy.tf
- outputs.tf

## 作り方
1. iam_policy.tfをつくる
```iam_policy.tf
resource "aws_iam_policy" "testRDSPerformanceInsight" {
  name   = "testRDSPerformanceInsight"
  path   = "/"
  policy = <<POLICY
{
  "Statement": [
    {
      "Action": [
        "rds:DescribeDBInstances",
        "rds:DescribeDBClusters"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Action": "pi:*",
      "Effect": "Allow",
      "Resource": "arn:aws:pi:ap-northeast-1:AWSアカウントID:metrics/rds/dbのリソースID"
    }
  ],
  "Version": "2012-10-17"
}
POLICY
}
```

2. outputs.tfをつくる
```outputs.tf
output "aws_iam_policy" {
  value = {
    testRDSPerformanceInsight    = aws_iam_policy.testRDSPerformanceInsight
  }
}

```

3. `terraform plan`を実行する
4. `terraform apply`を実行する

## 備忘録
- iam_policy内で`rds:DescribeDBInstances`と`rds:DescribeDBClusters`に関してはResource指定で`*`を指定しないと、パフォーマンスインサイトはおろか、DB一覧自体も参照できなかったので、その2つは`*`にすることが必須条件っぽい
- `pi:*`に関することに対して、対象の参照したいDBを指定することで、コンソール上から特定のRDSのパフォーマンスインサイトが参照できるようになった
- DB指定をする際、DBのリソースIDを指定する必要があるので、DBがまだ作成されていない場合は先に作成する必要があるかもしれない（推測）

## 参考文献
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-security-iam-awsmanpol.html#rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsReadOnly

https://support.serverworks.co.jp/hc/ja/articles/5285226313369-%E7%89%B9%E5%AE%9A%E3%81%AE-RDS-%E3%81%AE-Performance-Insight-%E3%81%AE%E3%81%BF%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%82%8B-IAM-%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B



最後までお読みいただき、ありがとうございました！
Windows Xbox Game Barはデスクトップ画面とエクスプローラーを録画できない【Win + Alt + R】

Windows 11ならば**Snipping Tool**、もしくはOBSを使いましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/a3eef348-0146-0532-d205-1ee92b396112.png)

https://xdaforums.com/t/how-to-enable-xbox-game-bar-to-record-desktop-work-and-files-explorer.4555817/

https://superuser.com/a/1562194

https://www.tenforums.com/general-support/203618-how-record-desktop-win-g.html
【個人開発】SpringBootでGoogleMapsAPIを利用したwebアプリケーションを作成しました(まだ未公開)

## はじめに
今回eclipseでwebアプリケーションを作成しました。
まだAWSなどについて勉強不足で公開できていないのですが、webアプリケーションの開発手順やEclipse、SpringBoot、GoogleMapsAPI、MySQLについて知りたいという方達の役に立ちたいと思ったので、開発のことについてお話ししようと思います。
[GitHub URL]
[https://github.com/HagisawaYuki/GachaMap.git](https://github.com/HagisawaYuki/GachaMap.git)

## 開発したwebアプリについて
今回私が開発したwebアプリは『ガチャマップ』というものです。
![スクリーンショット 2024-04-25 14.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/aa8d71b8-7370-d0eb-e45f-fbfcb5bbf4ac.png)
画像としてはこのようなものです。
この赤いピンはガチャガチャがあるところを示しています。
この赤いピンをタップすると、
![スクリーンショット 2024-04-25 14.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/5f46c0ff-466a-085d-56ed-1b2ec63c34d1.png)
このようにガチャガチャスポットの説明がポップアップとして出てきます。
また、マップ上に新しいガチャガチャスポットを設定したい場合は、マップ上でその部分をタップして
![スクリーンショット 2024-04-25 14.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/08e4bc3b-34ab-13a4-7a9a-157d67dd8f39.png)
このフォームに情報を入力して完了ボタンを押せば、登録できます。
これがこのwebアプリの概要です。

## 搭載した機能
##### ・ログイン機能
![スクリーンショット 2024-05-06 15.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/aeb29e9c-9c1b-5b8e-cf01-c672f30ca01c.png)

##### ・会員登録機能
![スクリーンショット 2024-05-06 15.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/70e812b7-22f7-7a53-f864-3fcb8b866831.png)

##### ・パスワードを忘れた際のパスワード再設定機能
![スクリーンショット 2024-05-06 15.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/ae22b390-68d2-7d58-f919-dc3e3b7c29d9.png)
ユーザ名と誕生日を入力すれば、パスワードを再設定できるようにしています。
セキュリティとしては弱いかもしれませんが、たいした個人情報を扱っていないし、ないよりはあった方が良い機能だと思ったので、この機能を作成しました。
扱う個人情報が増えた際にはメールを扱った認証機能を追加したいと考えています。

##### ・パスワードのハッシュ化
会員情報であるパスワードは、エンコードしてデータベースへセットするようにしています。


## 開発のきっかけ
これを開発しようとしたきっかけは2つあります。
まず1つ目は、ガチャガチャを探す手段があまりないと感じていたからです。Googleマップで探しても出てこないので、ガチャガチャを探している時、不便に思っていました。そこでガチャガチャの場所とその詳細がマップ上でわかるアプリがあったら便利だと思ったので、今回ガチャガチャを題材にしました。
2つ目は、Javaで何か制作してみたいとずっと思っていたからです。何年もjavaを扱ってきましたが、何か制作したことはなかったのでそろそろ作りたいと感じたからです。

## 使用技術
#### バックエンド
　Java（フレームワーク：SpringBoot）
　SQL
#### フロントエンド
　HTML
　CSS
　JavaScript
#### ツール
　MySQL
　draw.io(ER図)
　figma(画面遷移図)
　eclipse

 ## 画面遷移図
![画面遷移図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/4091ac96-613e-4cdb-7afb-9f8ca9bd55d2.png)

 ## データベース設計
 ![gachaspo.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758008/aa75f935-95ee-d0b6-e5e3-f1e554306d0a.png)
 まだ、user情報とガチャガチャスポット情報しか実装できてないです、、、

## 苦労したこと
SpringBootを初めて扱ったため、エラーの意味が全然わからなくて苦労しました。手当たり次第エラーをコピーしてwebで調べての繰り返しでした。
また、最初はwebアプリのデザインにBootstrapを使用しようと考えていたのですが、なぜか使えなかったため、CSSで全てデザインしたこともものすごく苦労しました。

## 追加しようと考えている機能
まだこれは必要最低限の機能とデザインしか実装できていないので、これからたくさんの機能を追加しようと考えています。現時点で考えている機能は下記のとおりです。

・ガチャガチャスポットに写真を追加できるようにする。
・約何台ガチャガチャがあるかの項目を、登録フォームに追加する。
・今緯度経度でしか場所指定できない状態になっているので、マーカーを自分で動かして場所指定をできるようにする。
・ガチャガチャスポットのお気に入り追加機能。
・ガチャガチャスポットのフィードバックをできるようにする。
・マイページを作成する。
・メールを使った認証機能
・インターネット上に載せる。

## 最後に
これからは、このwebアプリを作成する上でよく発生したエラーの対処の仕方や、機能を追加際にどのように追加したかなどの記事を書いていこうと思っています。
Virtual Box起動がしないときの対処~Hyper-Vの罠~

## 概要
Virtual Boxで以下の表示が出て起動しなかったので対処した備忘録。
![スクリーンショット 2024-04-03 085049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/a4f42262-72f1-84a0-1ae4-5e1710811d1a.png)
## 経緯
LinuCレベル1を勉強しようと思い、教材についていたDVD-ROMを利用してVirtualBoxをインストールしインポートしてCentOS7_v10を起動しようと思ったらできなかった。
教材にあった手順でも起動せず。
## 環境
- Windows11Home
- VirtualBox-6.1.10
- CentOS7_v10
## 解決手順
1. スタートアイコン上で右クリックし、管理者権限のターミナルを開く
1. ターミナルを起動したら`bcdedit /enum {current}`を入力しHyper-Vの状態を調べる※Windowsは\'{current}'のようにバッククォーテーションをつける必要がある
1. hypervisorlaunchtypeが下の方に出ているはず。`Auto`の場合次のコマンドを実行する
1. `bcdedit /set hypervisorlaunchtype off`
1. `正常に終了しました`というメッセージが出たことを確認する
1. `shutdown.exe /r /t 0`コマンドでパソコンを再起動する※コマンドを打つと再起動するので注意すること
1. もう一度`bcdedit /enum {current}`を入力しhypervisorlaunchtypeが`off`になっていればOK
1. セキュリティ上問題があるので、用が済んだら`bcdedit /set hypervisorlaunchtype auto`を入力する
1. もう一度 `shutdown.exe /r /t 0`コマンドで再起動させる
1. 改めて`bcdedit /enum {current}`を入力し`Auto`になっていれば元に戻っている

## 原因
Hyper-Vとサードパーティ仮想マシンが競合したことによって起動しなかった。
### 競合した理由
WindowsのHyper-VはOS直下で動作する仮想環境マシンだが、サードパーティ仮想マシンはハイパーバイザーの上で動作するものが多い。
VirtualBOXは競合が起きてしまい起動しなかったらしい。
## 仮想マシンプラットフォームのチェックボックスを外しても改善しない理由
エラーが起きて検索を掛けてみると、大体
- `コントロールパネル`を開く
- `プログラムと機能`を開き、`Windowsの機能の有効化または無効化`をさらに開く
- 中にある`ハイパーバイザープラットフォーム`や`仮想マシンプラットフォーム`のチェックボックスを外す
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3203627/5c9c016b-b7a7-d51b-1e09-4ab16eb8694c.png)

という手順が出てくる。

この手順に従い再起動をしたが､改善が見られなかったし、解決したあとチェックボックスを改めてつけた状態でもVirtualBOXは起動したため意味がなかった。
その理由としては、<font color="red">WindowsハイパーバイザーとHyper-Vは別物</font>であるから、らしい。
    [【参考にした記事】Hyper-Vとサードパーティー製仮想マシン環境を共存させる](https://atmarkit.itmedia.co.jp/ait/articles/2107/29/news021.html)

ハイパーバイザーは仮想環境マシンHyper-Vの機能の1つだったが、Windows OSハイパーバイザーとして仮想環境以外にもセキュリティシステムに使われている。
このことから、先ほどのチェックボックスからハイパーバイザープラットフォームを外してもHyper-Vは動作を続けるため、エラー解決にならなかったらしい。
## まとめ
- 仮想マシンにはOS直下で動くものとOS上で動くものがある
- デバイスドライバに組み込まれて動くものだとHyper-Vと競合して起動できないので一時的にHyper-Vを停止する必要がある

### 感想
「Hyper-Vとハイパーバイザープラットフォームは別物です」って素人には分からんがな...!
別の名前にできなかったのか？と思ってしまった。
おかげでいらない変更もしてしまったし、いろんな技術記事でチェックボックス外す手順紹介してたからHyper-Vを停止させる記事にたどり着きにくかった...
polarsで全部表示したい時

こんにちは、ひらきちです。

（pandasすら触ったことがないのですが）
業務上、polarsで分析することになり、
「データが全部表示されない！（省略される）」
となって困ったので、
ちょっと色々調べて、
やっとうまくいったので後学のためメモを残しておこうと思います。

# Q＆A
Q：polarsで出力したDataFrameを全部見たいのですが
A：こうやったらうまくいきました
```
import polars as pl

#
# polarsを使ってDataFrameを作る
# 
df = xxx

# 全部表示する
with pl.Config() as cfg: 
    cfg.set_tbl_cols(df.width);
    cfg.set_tbl_rows(df.height);
    print(df)
```

# （私の環境では）うまくいかなかった

## github copilot＆chatGPTの提案手法

- 提案手法
```
# 最大列数を30に設定
pl.options.display.max_columns = 30
print(df)
```

- エラー（そもそもoptionsが存在しないらしい）
```
AttributeError: module 'polars' has no attribute 'options'
```

# 参考
https://stackoverflow.com/questions/76925989/print-all-columns-in-polars
NextjsのAppRouterで、redirect時に一度だけ表示する

# 実装背景

Next.jsのAppRouterを使用して[server action](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations)で[redirect](https://nextjs.org/docs/app/api-reference/functions/redirect)を行うと、リダイレクト先のページで成功や失敗のメッセージを表示することが難しくなります。
これは、リダイレクトが発生すると、現在のページの状態がリセットされ、新しいページが読み込まれるためです。
これを解決するために、一度だけ表示するメッセージを保存する方法としてcookieを使用します。

サンプルリポジトリはこちら
https://github.com/yuyakinjo/next-app-flash

# 動作動画（`a`タグバージョン）

![flash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/b60f0c9f-2b1e-5ec2-778f-f3cc6e6a1c7d.gif)

:::note warn
注意：　`/`ページで表示されている、`/flash`ページのリンクは`a`タグを使用しています
:::

なぜ`a`タグを使っているかは後述します。

## 流れ

1. `/`ページ
1. `/form`ページで、入力
1. 入力後、`/flash`ページへリダイレクト
1. `flash`という名前の`cookie`があれば、`success`という文字を表示
1. 一度、別のページに遷移したり、リロードすると文字が消える

### ページ概要

- `/`ページ： 各ページへリンクがあるページ
- `/form`ページ：　フォームを入力し、formにはserver actionが設定されている。フォーム送信完了後は`flash`ページへリダイレクト
- `/flash`ページ： flash表示ページ

# [cookies](https://nextjs.org/docs/app/api-reference/functions/cookies)を使う
[cookies](https://nextjs.org/docs/app/api-reference/functions/cookies)は、nextjsが用意している関数で、`maxAge（秒）`を`0`にすることで、リダイレクト後、一度だけ取得でき、すぐ消滅してくれるので削除する必要もありません。

Railsでは[flash](https://railsdoc.com/page/flash)と呼ばれています。

備考として、[cookies](https://nextjs.org/docs/app/api-reference/functions/cookies)を使用すると、ページは毎回[動的レンダリング](https://nextjs.org/docs/app/building-your-application/rendering/server-components#dynamic-rendering)になるはず。。。

# あれ動的レンダリングされてなさそう

cookiesは動的関数で、それを使っているページは毎回[動的レンダリング](https://nextjs.org/docs/app/building-your-application/rendering/server-components#dynamic-rendering)され、キャッシュされないはずだけど、キャッシュされてるぞ！！！


![スクリーンショット 2024-04-25 13.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/2b8037de-72e9-619a-bf86-630950d78630.png)

https://nextjs.org/docs/app/building-your-application/rendering/server-components#switching-to-dynamic-rendering

この表でいう、一番下じゃないのか。cookieもキャッシュされる対象になっているのかな。。。

もしかしたら、下記のドキュメントかもしれないけど、どこがそれに抵触する箇所なのか難しい
https://nextjs.org/docs/app/building-your-application/caching#full-route-cache

# [Linkコンポーネント](https://nextjs.org/docs/app/api-reference/components/link)使うと、cookieの値もキャッシュされて表示されちゃうよ

[nextjsのlearn](https://nextjs.org/learn/dashboard-app/navigating-between-pages)でもやるのですが、[Linkコンポーネント](https://nextjs.org/docs/app/api-reference/components/link)はnextjsが用意してくれているprefetch(移動先のページをあらかじめ読み込んでくれてたり)をハンドリングできるコンポーネントなのですが、これが相性よくなかったみたいです。
`a`タグ使うと、毎回ページを読みに行きますのでやりたかった動きが叶いました。

Linkコンポーネントでも、cookie自体はブラウザからちゃんと消えてくれてます。

# 動作動画(Linkコンポーネントバージョン)

:::note warn
注意：　`/`ページで表示されている、`/flash`ページのリンクはLinkコンポーネントを使用しています
:::

![flash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/32d15ba3-401c-69f7-1340-d9372e3db82b.gif)

## まとめ

リダイレクト後に、一度だけ表示したい(`flash`)は叶いましたが、`flash`を実装したページのリンク先には、`a`タグを使わないと、cookieの値もキャッシュされちゃうので気をつけてください。
JavaScript 三項演算子と||演算子と??演算子

三項演算子と||演算子と??演算子の結果確認してみよう。っていう話。

```javascript
const TITLE_LEN = 12;
const spacePadding = (val, len) =>  (val + ' '.repeat(len)).slice(0, len);
const output = (title, res1, res2, res3) =>
    console.log(`${spacePadding(title, TITLE_LEN)} ３項:${res1}  ||:${res2}  ??:${res3}`); 

let str;
let res1;
let res2;
let res3;

console.log('文字列検証'); 
str = undefined;
res1 = str ? str : 'A'; 
res2 = str || 'A';
res3 = str ?? 'A';
output('undefined', res1, res2, res3);

str = null;
res1 = str ? str : 'A'; 
res2 = str || 'A';
res3 = str ?? 'A';
output('null', res1, res2, res3);

str = 'B';
res1 = str ? str : 'A'; 
res2 = str || 'A';
res3 = str ?? 'A';
output('B', res1, res2, res3);

str = '';
res1 = str ? str : 'A'; 
res2 = str || 'A';
res3 = str ?? 'A';
output('""', res1, res2, res3);


console.log('\n数値検証'); 
let num;

str = undefined;
res1 = num ? num : 9; 
res2 = num || 9;
res3 = num ?? 9;
output('undefined', res1, res2, res3);

num = null;
res1 = num ? num : 9; 
res2 = num || 9;
res3 = num ?? 9;
output('null', res1, res2, res3);

num = 1;
res1 = num ? num : 9; 
res2 = num || 9;
res3 = num ?? 9;
output('1', res1, res2, res3);

num = 0;
res1 = num ? num : 9; 
res2 = num || 9;
res3 = num ?? 9;
output('0', res1, res2, res3);

num = Number.NaN
res1 = num ? num : 9; 
res2 = num || 9;
res3 = num ?? 9;
output('NaN', res1, res2, res3);
```

### 実行結果
??演算子の結果がちょっと違う。
気をつけよう。
```javascript

文字列検証
undefined    ３項:A  ||:A  ??:A
null         ３項:A  ||:A  ??:A
B            ３項:B  ||:B  ??:B
""           ３項:A  ||:A  ??:       // 結果違う！！

数値検証
undefined    ３項:9  ||:9  ??:9
null         ３項:9  ||:9  ??:9
1            ３項:1  ||:1  ??:1
0            ３項:9  ||:9  ??:0      // 結果違う！！
NaN          ３項:9  ||:9  ??:NaN    // 結果違う！！
```

””、0の扱いって悩むなー
Java レコード・クラス

# はじめに
先日、[Java22](https://openjdk.org/projects/jdk/22/)がリリースされました。
新機能のサンプルの記事を書こうとしたら、原文のサンプルが読めない。。。改めて私の知識がアップデートされていないことに気づいてしまった。。。。

「レコード・クラス」ってなんだ？？
## レコード・クラス実装の動機

[ここ](https://www.infoq.com/jp/news/2018/03/data-classes-for-java/) から抜粋

Javaクラスは今まで大量のボイラープレートコードを必要とした。クラスが単純か複雑かどうかにかかわらずだ。このことでJavaは"冗長すぎる"という評価であった。

オラクルのJava言語アーキテクトであるBrian Goetz氏はこう説明しています。

> ごく普通のデータキャリアクラスを責任を持って書くにあたり、価値の低い、退屈なコードを大量に書かなければならない。コンストラクタ、アクセサ、equals()、hashCode()、toString()などだ。そして開発者はこうした重要なメソッドを書かないという手抜きへ誘惑されることもある。こうしたことがびっくりするような振る舞いや、デバッグがとてもしづらいといったことにつながる。もしくは代わりにまったく適切でないクラスをサービスに押し込んでしまう。それは"正しい形"をしているし、開発者は別のクラスにもう定義したくないからだ。

> IDEはあなたがこうしたコードをほとんど書く手助けをしてくれるが、コードを書くことはこの問題の小さな一部分に過ぎない。IDEはコードを読む人がボイラープレートコードの大量の行から"これはxとy、zのごく普通のデータキャリアクラスです"という設計意図を汲み取る手助けは何もしてくれない。そして退屈なコードはバグが潜む格好の場所だ。もしできるなら隠れられる場所を完全に排除するのが一番だ。
# レコード・クラス
### リリースバージョン
[Java SE 16](https://docs.oracle.com/javase/jp/16/language/records.html#GUID-6699E26F-4A9B-4393-A08B-1E47D4B2D263)
## レコード型とは
「プレーン・データ・キャリア」クラス。
プレーン・データ・キャリアとは、**変更されない**データ、およびコンストラクタやアクセサなどの最も基本的なメソッドのみを含むクラス。
プレーン・データ・キャリアは、変更されないデータであるため、**「イミュータブル」クラス**です。
### 基本的なメソッド
- コンストラクタ
- アクセサ
- 等価比較メソッド(equals,hashCode )
- 文字列変換メソッド(toString)
## レコード型の基本的な宣言
サンプルとして座標(X, Y)を扱うプレーン・データ・キャリアクラスを宣言します。
```java
public record Point(int x, int y) { }
```
レコードクラスは、以下のようなクラスを実装と同じことになります。
かなり実装量が減ることがわかります。
```java
public final class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int x() { return x; }
    public int y() { return y; }

    public boolean equals(Object o) {
        if (!(o instanceof Point)) return false;
        Point other = (Point) o;
        return other.x == x && other.y == y;
    }

    public int hashCode() {
        return Objects.hash(x, y);
    }

    public String toString() {
        return String.format("Point[x=%d, y=%d]", x, y);
    }
}
```
# レコード・クラスのカスタマイズ
もちろん、レコード・クラスのカスタマイズ可能です。
## 標準コンストラクタを宣言できるぞ
自動で生成する標準コンストラクタはフィールドに値を設定するだけですが、設定する値を検証したい場合等に標準コンストラクトを宣言できます。

サンプルでは、座標のマイナス値は許さない仕様とします。
この場合、座標にマイナスを設定した場合エラーとします。
```java
public record Point(int x, int y) {
  public Point(int x, int y) {
    if (x < 0 || y < 0) {
            throw new java.lang.IllegalArgumentException(
                String.format("不正な座標値です。: %d, %d", x, y));
        }
        this.x = x;
        this.y = y;  
  }
}
```
せっかく実装を減らす為にrecordクラスを使用しているのに、フィールド設定を実装するのは面倒ですよね。
```java:フィールド設定
this.x = x;
this.y = y;  
```
安心して下さい。コンパクト・コンストラクタというコンストラクタが宣言できます。
```java
public record Point(int x, int y) {
  public Point {
    if (x < 0 || y < 0) {
      throw new java.lang.IllegalArgumentException(
        String.format("不正な座標値です。: %d, %d", x, y));
      }
  }
}
```
## 独自のメソッドも追加出来るぞ
サンプルとして、座標を指定したX,Y分移動するメソッドを追加。
```java
public record Point(int x, int y) {
  public Point move(int addX, int addY) {
    return new Point(x + addX, y + addY);
  }
}
```
[Dynatrace] 円安が気になるので、公開API経由で取得してダッシュボードに常に表示させておきたい

# 概要

Dynatrace SaaSのダッシュボードでは、外部APIにアクセスして値を取得して表示させておく機能 (タイル) が提供されています。本記事では公開APIを使って為替レートを取得し、ダッシュボードに表示させる方法をご紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/630682ca-ebe0-f21c-a5a7-ca16d280e8f9.png)

# ダッシュボードへタイルを追加

ダッシュボードの＋ボタンからタイルを追加できます。ここで`Add code`タイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/b1dad48e-57b2-eb36-5869-887decb91333.png)

# JavaScriptコードの追加

するとJavaScriptのコードを書くフィールドが現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/4c80e2e7-8709-4e5d-e273-a2e771f8afda.png)

ここではBitfinex社のAPIから、為替レートを取得できるAPI([ドキュメント](https://docs.bitfinex.com/reference/rest-public-foreign-exchange-rate))を使用しています。

関数の戻り値として、ダッシュボードで使用したい値を返すようにします。お気付きの通り、JavaScriptを書けるので、かなり自由度高くデータの取得や処理ができます。

なお、外部APIにアクセスするためには、Dynatraceの設定でAPIのホスト名をホワイトリストに入れておくか、制限無しと設定しておく必要があります。

# 視覚化の設定

関数の戻り値をどのように表示するかを設定します。

`Visualize`タブをクリックすると、ビジュアライゼーションの方法が選べます。ここでは`Single value`を選択しています。値の種類によって選べる表現が変わります。（選べないものは🚫が付いています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/37f6ba03-d13a-8993-f153-9ca38a780493.png)

あとは、小数点以下桁数や単位名を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/76695794-b4c0-79a1-f5e5-5c9e3a22340b.png)

完成！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/81b0d7c4-4587-f8b6-af59-eb290c3ab179.png)

これで、ダッシュボードのリフレッシュのタイミングでAPIにアクセスし、最新の値が表示されるようになります。（記事を書いている間に少し円が下がりました。）

このように、メトリクスなどとして内部に保存されているデータだけではなく、JavaScriptで取得・生成させることにより、さまざまなデータをダッシュボードで利用することが可能になります。ぜひあれこれ試してみてください。

Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/
.erb.mdファイルについて

# 内容
- `jekill`で `.erb.md` という拡張子のファイルを扱うことになった。
- 見慣れない拡張子でちょっと試行錯誤したので、扱い方のメモを残した。

# 前提知識
まず、`markdown`の中に`HTML`が埋め込めるということを知っておきましょう。
私は恥ずかしながら、これを知らなかったのでだいぶ混乱した。
そういえば「ハイパーテキスト **Markup Language**」に対する**Markdown** なのだと昔習ったわ...

# 使い方
要するに、`markdown`の中に`erb`が書けるよということらしい。
そして、`.erb`は`ruby`を`HTML`の中に埋め込むファイル形式なので、
`HTML`も`ruby`も`markdown`も全部ごっちゃに書けます、ということの模様。

▼例えばこんな内容を書いたら...
```md
# h1テキストです

クライアント名：<%= @client_name %>

業界：<%= @industry %>

<!-- 空白行必要です（後述） -->
```

▼こんなふうに出力されて...（画像はcss効いてます）
![スクリーンショット 2024-04-25 10.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/f4b9d846-fda7-f9d4-41f7-5ff298cccb05.png)

▼生成された`HTML`はこんな感じでした。
```
<h1 id="h1テキストです">h1テキストです</h1>
<p>クライアント名：テスト用顧客</p>
<p>業界：["建設", "農業"]</p>
```

`id`が自動で生成されているので、厳密にやるなら細かく調整したほうが良さそうです。

なお、空白行を設定しないとこうなりました。

```md
<!-- 書いた内容 -->
# h1テキストです
クライアント名：<%= @client_name %>
業界：<%= @industry %>

<!-- 出力結果 -->
<h1 id="h1テキストです">h1テキストです</h1>
<p>クライアント名：テスト用顧客
業界：[“建設”, “農業”]</p>
```

あえて行を詰めたいならこうする必要がありそう。

```md
<!-- 書いた内容 -->
# h1テキストです
<p>クライアント名：<%= @client_name %></p>
<p>業界：<%= @industry %></p>

<!-- 出力結果 -->
<h1 id="h1テキストです">h1テキストです</h1>
<p>クライアント名：テスト用顧客</p>
<p>業界：["建設", "農業"]</p>
```

# その他

ちなみにVSコード上はめっちゃエラー出るので、気にせず書き進める勇気が必要でした。特殊な拡張子を認識できるようにすればこれもなんとかなるのだろうけど...
![スクリーンショット 2024-04-25 10.44.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/9a3cdf8a-2344-61f2-3ee2-3a4d6c37c59a.png)
ユースケースとは

## ユースケースとは何か？
ユースケースは、ユーザー（または「アクター」）とシステム間の相互作用をシナリオベースで説明するアプローチです。各ユースケースは、ユーザーがシステムを通じて達成しようとする具体的な目標を中心に構成されます。この方法は、エンジニアとステークホルダーにシステムの機能を明確に伝え、要件を正確に把握するのに役立ちます。

## ユースケースの構成要素
ユースケースを作成する際には、以下のような主要な要素を含める必要があります：

- アクター（Actor）：システムと相互作用するユーザーや外部システムを意味します。
- ユースケース名：ユーザーの目標を簡潔に表現する名前を使用します。
- トリガー（Trigger）：ユースケースを開始するイベントや条件です。
- 主シナリオ（Main Scenario）：アクターが目標を達成するために行う一連のステップを順序立てて説明します。
- 拡張（Extensions）または代替シナリオ（Alternative Scenarios）：主シナリオから逸脱する例外状況や条件を処理します。
- 前提条件（Preconditions）：ユースケースが開始される前に満たされるべき条件です。
- 後続条件（Postconditions）：ユースケース実行後のシステムの状態です。

## ユースケースの重要性
ユースケースは、ソフトウェア開発プロジェクトで重要な役割を果たします。その理由は以下の通りです：

- コミュニケーションの改善：ユースケースは、エンジニア、プロジェクトマネージャー、顧客間の明確なコミュニケーションを可能にします。
- 要件の検証：ユースケースを通じて、初期段階でユーザーの要求が十分に反映されているかを確認できます。
- テストケースの準備：ユースケースはテストケースを設計する基盤を提供します。
- システム文書化：ユースケースはシステムの機能を文書化するのに役立ちます。
## ユースケースの効果的な作成のためのヒント
ユースケースを効果的に作成するためのいくつかのヒントは以下の通りです：

- ユーザー中心で考える：ユースケースはユーザーの視点から作成されるべきです。
- 簡潔で明確に書く：複雑さを減らし、重要な情報に焦点を当てます。
- 様々なシナリオを考慮：例外状況と代替シナリオを含め、システムの様々な反応を予測します。

ユースケースはソフトウェア開発の礎石であり、プロジェクトの成功に大きな影響を与えることができます。これをうまく活用して、ユーザーの要求とシステムの要求を調和させることがエンジニアの重要な目標です。
samba addc /etc/hosts編集備忘録

```
ozaki@raspberrypi:/etc/netplan$ sudo nano /etc/hosts
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
#     /etc/cloud/cloud.cfg or cloud-config from user-data
#
127.0.1.1 raspberrypi raspberrypi
127.0.0.1 localhost
192.168.2.154 example.local raspberrypi

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

ozaki@raspberrypi:/etc/netplan$ sudo reboot
```
Laravelを日本語対応させる方法

Laravel Breezeなどでログイン機能を実装したはいい物の、日本語の設定方法がわからず困っている方に必見です。
<br>
【前提条件】
Laravel Breezeのインスチールをお願いします。
<br>

方法は2種類あり、それぞれ解説しますが2つ目の方がおススメです。
<br>

# 1つ目
①config/app.php　を修正して、言語と時間を日本に変更しておく。
```config/app.php
// 'UTC'から'Asia/Tokyo'に変更
'timezone' => 'Asia/Tokyo',

// 'en'から'ja'に変更
'locale' => 'ja',

// 'en_US'から'ja_JP'に変更
'faker_locale' => 'ja_JP',
```
<br>

②langディレクトリの作成
```
# Laravel sailで環境構築をしている人向けコマンド
$ ./vendor/bin/sail php artisan lang:publish

# Laravel sail以外で環境構築をしている人向けコマンド
$ php artisan lang:publish
```
上記コードを実行すると、言語設定に必要なディレクトリとファイルが作成されるのでご確認ください。
<br>
③ja.jsonの作成
```
touch lang/ja.json
```
ja.json内に日本語の設定を書いていきます。
まずは、Laravel Breezeに必要なログイン機能の日本語設定を書いてみます。

```lang/ja.json
{
    "Email": "メールアドレス",
    "Password": "パスワード",
    "Remember me": "ログイン情報を保存する",
    "Forgot your password?": "パスワードを忘れた方はこちら",
    "Log in": "ログイン"
}
```

これでlocalhost/loginにアクセスすると、日本語設定が適用されているはずです。
<br>
<br>
# 2つ目

2つ目は既に構築されたGitHubで日本語の翻訳ファイルを読み込む方法です。

①日本語ファイルをインストールする
```
# Laravel sailで環境構築をしている人向けコマンド
$ ./vendor/bin/sail composer require askdkc/breezejp --dev
$ ./vendor/bin/sail php artisan breezejp

# Laravel sail以外で環境構築をしている人向けコマンド
$ composer require askdkc/breezejp --dev
$ php artisan breezejp
```
<br>
2つ目のコマンドを実行すると、下記のようにGitHubのリポジトリにスターをするか聞かれるので、[yes]と入力してください。

```
Laravel Breeze用に日本語翻訳ファイルを準備します
config/app.phpのlocaleをjaにします

 GitHubリポジトリにスターの御協力をお願いします🙏 (yes/no) [yes]:
 > yes
```
<br>
下記のメッセージが出力されれば日本語化は完了です

```
日本語ファイルのインストールが完了しました!
```

# 最終確認

lang/ja にいくつかファイルが作成されているのを確認してください。
これらを自身の用途によって付け足したりしてご活用ください。
No such file or directory

macbook
zsh 5.9

ディレクトリ「063山本」の中にmaster.texをコピーし、名前をyamamoto.texにしたい

そこで、
cp master.tex　063*/yamamoto.tex
とするが、

No such file or directory
と出てきてコピーできない。

https://www.wwwmaplesyrup-cs6.work/entry/2020/08/08/030240

みたいな感じが原因かと思い、.zshrcに追加してみるが、やっぱり同じエラーが出る。

謎です。
TiDB関連イベント 5月分

5月ですね!:seedling: 

毎月恒例のイベントの一覧です。今月はGWもありイベントは少なめですね。

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。
WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。
（こんなのもあるよ！という方、記事にコメントください。追加します）

## 5月8日(水) ochacafe NewSQLのランドスケープ

https://ochacafe.connpass.com/event/312940/

Golang, Kafka, NewSQLといった幅広いテーマの中で、TiDBについてもお話しいただけるようです :smiley:

## 5月30日(木) TiDB 8.0 DMR新機能の紹介

https://pingcap.co.jp/event/tidb-8-0-dmr-new-features/

色々と野心的な機能が追加されたTiDB 8.0 DMRの新機能について解説します。
講師はPingCAPの本田さんです。

## TBD

読書会が出来ないかなとTiDB User Groupで検討中です。
お楽しみに！
(java silver)データ型

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

# 配列の宣言・初期化について

### 配列の宣言
```java
//データ型[] 配列変数名
int[] num;

//もしくは、データ型　配列変数名[]
int num[];
```
### 配列の作成
```java
//配列変数名 = new データ型[要素数]
num = new int[3];

//初期化
int[] num = new int[3];
```

#### []の位置は変数名の後ろでもコンパイル可
```java
int[] num; //もしくは
int num[];

//二次元でも三次元でも同じ

int[][] num;
int num[][];

int[][][] num;
int num[][][];
```
#### []は分けて書いてもコンパイル可
```java
int[] num[];
int[] num[][]
```
#### 変数とインスタンスの次元は一致させる
```java
int[] array = new int[2][2];  //コンパイルエラー
```
#### 扱える要素数に浮動小数点は指定できない
```java
int[] array = new int[2.5];  //コンパイルエラー
```
#### 二次元配列を作成するとき、一次元目の要素数は省略できない
```java
int[][] araay = new int[][3];//コンパイルエラー

int[][] araay = new int[2][];//OK
```
#### {}(初期化子)で代入する際は次元数に合わせて{}をつける
```java
int[][][] array = {{1,2,3},{4,5,6}};//コンパイルエラー
int[][][] array = {{{1,2},{2,3}},{{4,5},{5,6}}};//OK
```
#### 配列の宣言時は要素数を指定できない
```java
int[5] num; //コンパイルエラー

int[] num; //OK
```
#### 配列インスタンスを生成するときは必ず扱える要素数を指定する
```java
//宣言と配列の作成
int[] array;
array = new int[]; //NG

int[] array;
array = new int[3]; //OK
```
```java
//初期化
int arrayB = new int[]; //NG

int arrayB = new int[3]; //OK
````

#### newと初期化子{}を使う場合は要素数を指定できない
```java
int[] array = new int[3]{100,200,300}; //NG

int[] array = new int[]{100,200,300}; //OK
```
#### 初期化子{}は変数宣言と同時にしか使用できない
```java
int[] array;
array = {100,200,300}; //NG
int[] array;
array = new int[]{100,200,300}; //OK
```
[Python] リストのコピーに関する注意点

pythonのリスト複製，コピーについての注意点をまとめました．
（間違いありましたらご指摘お願いします）

# 目次
**1. 「代入」≠「コピー」**
**2. 多重リストの場合も注意**


# 1. 「代入」≠「コピー」

list1の内容をlist2に複製しようと思って，通常の変数の代入で
```python:代入
list2=list1 
```
とすると，list1，list2の一方に対する操作が他方にも反映されてしまいます．
これは、変数にはリストのコピーではなく、リストへの参照が代入され、リストを共有するためです．

リストを安全に複製するためには
```python:コピーしてから代入
list2=list1.copy()
```
とすると，list2にはlist1のコピーが代入されるので，それぞれ独立した別のオブジェクトとして扱うことができます．

以下では，実際に通常の代入とコピーしてから代入した場合の違いについて，元のlistに変更を加えた場合に変更がどのように反映される（されない）のかを示します．

```python
array=[1,2,3,4,5]
copied_array1=array         #通常の代入
copied_array2=array.copy()  #copy()を使ってコピーしたリストを代入


array[0]=100    #array
print(f"array         : {array}")
print(f"copied_array1 : {copied_array1}")
print(f"copied_array2 : {copied_array2}")

print(f"arrayのid         : {id(array)}")
print(f"copied_array1のid : {id(copied_array1)}")
print(f"copied_array2のid : {id(copied_array2)}")
```

```
array         : [100, 2, 3, 4, 5]
copied_array1 : [100, 2, 3, 4, 5]
copied_array2 : [1, 2, 3, 4, 5]

arrayのid         : 4414692224
copied_array1のid : 4414692224
copied_array2のid : 4414696320
```

copied_array1はarrayを代入したもの，copied_array2はarrayのコピーを代入したものです．
arrayの先頭要素の値を変更すると，copied_array1（通常代入の方）には値の変更が反映されてしまっていますが，copied_array2(コピーの方)には反映されていません．

また，array,copied_array1,copied_array2のid（オブジェクトに固有の識別子）を比較すると，arrayとcopied_array1はidが同じで，copied_array2のidは異なります．
（idが同じオブジェクトに対する操作は，同idのオブジェクト全てに反映されてしまう）

# 2. 多重リストの場合も注意
また，以下のケースでも注意が必要です
```python
array=[1,2,3]
Array_List1=[]
Array_List2=[]

Array_List1.append(array)
Array_List2.append(array.copy())

array[0]=100
print(array)
print(Array_List1[0])
print(Array_List2[0])
```
```
>[100, 2, 3]   
>[100, 2, 3]   #arrayに対する変更が反映されている
>[1,2,3]       #arrayに対する変更が反映されていない
```

このケースでは，arrayの参照を直接Array_List1に追加(append)しているために，arrayの変更がArray_List内に追加した要素にも反映されてしまっています．一方，コピーを追加したArray_List2の方では,arrayの変更が反映されません．

# 結論
代入とコピーの違いについてまとめました．
コピーの方が，オブジェクト間の独立性が保証されるので安全．


# 参考
https://qiita.com/hrs1985/items/4e7bba39a35056de4e73
watsonx.aiの生成AIを使ってIBM i アプリの保守が可能か（ほんの少し）検証してみる ⑤RPGⅢ修正の検証2回目

前回の記事でRPGⅢが解析できなかった、という一時回答をしましたが、guri_guriさんのアドバイスを元に再チャレンジしてみました。

### 再チャレンジ内容
「RPGⅢプログラム修正の検証」も、具体的に記述すれば成功するでしょうか？

## 検証結果
### 指定した命令　と　入力例
下記のようにILE RPGの修正例と同様に具体的な例を与えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3cb26877-4b7b-27a0-6205-da96b2a49e4c.png)

### 利用したサンプルソース
     H            Y
     F* IPH110 *
     FIPH110S CF  E                    WORKSTN
     FTOKMSL01IF  E           K        DISK
     C                     DO   *HIVAL
     C*ＰＡＮＥＬ０１の表示
     C                     EXFMTPANEL01
     C           *IN03     IFEQ '1'
     C                     SETON                     LR
     C                     RETRN
     C                     END
     C*得意先マスターの読み取り
     C           S1TOKB    CHAINTOKMSL01             30
     C           *IN30     IFEQ '0'
     C*画面フィールドセット
     C                     MOVELTKNAKJ    S2NAKJ
     C                     MOVELTKADR1    S2ADR1
     C                     MOVELTKADR2    S2ADR2
     C                     MOVELTKTIKU    S2TIKU
     C                     MOVELTKPOST    S2POST
     C                     MOVELTKGEND    S2GEND
     C                     MOVELTKUZAN    S2UZAN
     C*係数計算
     C           KEISU     MULT 1.10      KEISU
     C           TKGEND    MULT KEISU     TKGEND
     C*
     C*差額計算
     C           TKGEND    SUB  TKUZAN    S2GAKU
     C*
     C*ＰＡＮＥＬ０２の表示
     C                     SETOF                     30
     C                     WRITEPANEL01
     C                     EXFMTPANEL02
     C           *IN03     IFEQ '1'
     C                     SETON                     LR
     C                     RETRN
     C                     ENDIF
     C*
     C                     ENDIF
     C                     ENDDO                        

### テスト結果
上記のサンプルソースを試行欄にコピペしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e9131b96-1668-1996-6ff9-d3007d57f731.png)

そして、生成ボタンを押下
テケテケテケ・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a103684b-dd8f-dd33-fd81-c33d6330c0ef.png)
正しく（期待通りに）プログラムソースが更新されました！

※所感
RPGⅢと明示指定しなければコード解析自体は問題なくできる模様
単純な例ですが、複雑なものであってもストリングサーチなどでプログラム修正はできるという事かと思います。

p.s
guri_guriさんありがとうございました。

[つづきはこちら・・⑥命令、試行の入力文を変えてみる](https://qiita.com/gomAnomalocaris/items/a72f453fc70af666375d)
ウェブアプリケーション、情報システム、およびオンラインサービスを開発および構築する

近年、ウェブ開発の需要が増加するにつれて、開発者はさまざまなプログラミング言語やフレームワークの中から最適な選択を迫られています。特に、Spring Framework、Django、Laravel、そしてNestJsなどの人気のあるフレームワークは、開発者に多くの機能と柔軟性を提供します。本記事では、それぞれのフレームワークの特徴と利点を比較し、どのようなプロジェクトに適しているかを探求します。
1. Spring Framework
Spring Frameworkは、Java言語でのウェブアプリケーション開発において広く使用されているフレームワークです。このフレームワークは、IoC（Inversion of Control）やDI（Dependency Injection）などの機能を提供し、開発者がコードをより効果的に管理し、テストするのに役立ちます。また、Spring Bootというサブプロジェクトは、アプリケーションのセットアップやデプロイメントを簡素化し、素早く効率的なウェブアプリケーションを構築するのに役立ちます。Spring Frameworkは、大規模な企業向けのアプリケーションから小規模なプロジェクトまで、幅広いシナリオに適しています。
2. Djangoとは
Djangoは、Python言語でのウェブアプリケーション開発において広く使用されているフレームワークです。Djangoは、優れたオブジェクトリレーショナルマッパー（ORM）、強力な管理インターフェース、セキュリティ機能など、多くの機能を提供します。また、Djangoのドキュメントやコミュニティの豊富さは、新しい開発者が学習しやすい環境を提供します。Djangoは、コンテンツ管理システム（CMS）、電子商取引サイト、ソーシャルメディアプラットフォームなど、多くのウェブアプリケーションの開発に適しています。
3. Laravelとは
Laravelは、PHP言語でのウェブアプリケーション開発において非常に人気のあるフレームワークです。Laravelは、エレガントな構文、強力なORM、ルーティング、ビューテンプレートなど、多くの機能を提供します。また、LaravelのComposerというパッケージ管理システムは、外部ライブラリの追加や更新を簡素化し、開発者がアプリケーションの拡張性を向上させるのに役立ちます。Laravelは、小規模なプロジェクトから大規模なアプリケーションまで、幅広いニーズに対応できる柔軟性を持っています。
4. NestJs
NestJsは、TypeScript言語でのNode.jsアプリケーション開発において使用されるフレームワークです。NestJsは、Angularの影響を受けたモジュールベースのアーキテクチャを提供し、開発者がモジュール、コントローラ、サービスを効果的に構築するのに役立ちます。また、NestJsは、Express.jsやFastifyといった人気の高いNode.jsフレームワークとのシームレスな統合を可能にし、柔軟性と拡張性を提供します。NestJsは、リアルタイムアプリケーションやマイクロサービスの開発に適しています。
5. 仕様
"仕様"は、プロジェクトや製品の設計、機能、動作に関する具体的な要件や基準を指します。仕様は、開発者や関係者が一貫した理解を持ち、期待される結果を達成するための基盤を提供します。
以上のフレームワークと概念は、それぞれ独自の利点と利用シナリオを持ちますが、プロジェクトのニーズや開発者の技術スタックに応じて適切な選択を行うことが重要です。これらの選択肢を比較検討し、最適なフレームワークを選択することで、成功に近づくことができます。

Spring Framework、Django、Laravel、そしてNestJsは、それぞれ独自の強みを持つ優れたフレームワークです。プロジェクトの要件や開発者の技術スタックに応じて、最適な選択を行うことが重要です。Spring Frameworkは、Javaのエンタープライズ開発に適しており、大規模な企業向けのアプリケーションを構築するのに最適です。Djangoは、Pythonのシンプルさとパワフルな機能を組み合わせ、多種多様なウェブアプリケーションを開発するのに適しています。Laravelは、PHPの柔軟性とエレガントな構文を活かし、素早く効率的なウェブアプリケーションを構築するのに最適です。NestJsは、TypeScriptとNode.jsの組み合わせで、リアルタイムアプリケーションやマイクロサービスを構築するのに最適です。
開発者は、各フレームワークの特徴や利点を熟考し、プロジェクトのニーズに最も適した選択肢を見極める必要があります。適切なフレームワークを選択することで、開発プロセスがスムーズに進み、最終的な成果物がより優れたものになることが期待されます。重要なのは、プロジェクトの目標を達成するために、最適なツールとテクノロジーを選択することです。
ホリゾンタル設計書：SPA開発プロジェクトの効果的な戦略

近年、SPA（Single Page Application）開発は、ウェブ開発の新たな標準となっています。このアプローチは、ユーザーエクスペリエンスを向上させ、ウェブアプリケーションのパフォーマンスを最適化するための効果的な方法として広く採用されています。SPA開発は、従来のアプリケーションとは異なる独自の設計アプローチを必要とします。本記事では、SPA開発プロジェクトにおけるホリゾンタル設計書の重要性と効果的な戦略について探ります。
ホリゾンタル設計書の重要性
SPA開発プロジェクトでは、複雑なフロントエンドの要件やコンポーネント間の相互作用を管理することが必要です。[ホリゾンタル設計書](https://newwave-solutions.co.jp/horizontal-saas-and-vertical-saas/)は、開発チームが共通の理解を持ち、一貫したアーキテクチャを確立するのに役立ちます。この設計書には、アプリケーション全体の機能、データフロー、およびコンポーネント間のインタラクションが明確に記述されています。これにより、開発者は目標を共有し、プロジェクトのさまざまな側面に対する責任を理解することができます。
効果的な戦略
定期的な更新とレビュー: ホリゾンタル[設計書](https://newwave-solutions.co.jp/design-documents/)は、プロジェクトの進行に伴い、定期的に更新される必要があります。新しい機能や要件が追加されるたびに、設計書を更新し、開発チーム全体が最新の情報にアクセスできるようにします。また、定期的なレビューを行うことで、不明瞭なポイントや矛盾が早期に発見され、問題の解決が容易になります。
クロスファンクショナルなコラボレーション: ホリゾンタル設計書の作成には、開発チーム全体の協力が必要です。バックエンドエンジニア、フロントエンドエンジニア、デザイナーなど、異なる専門分野のメンバーが協力して、全体のアーキテクチャを構築することが重要です。クロスファンクショナルなコラボレーションにより、異なる視点からのフィードバックを受け取り、より総合的な設計を実現することができます。
明確な文書化と共有: ホリゾンタル設計書は、プロジェクト全体で明確に文書化され、開発チーム全体と関係者と共有される必要があります。設計書は、コードベースと同様に重要な資産であり、新しいメンバーのオンボーディングや将来の変更の理解を支援します。また、関係者が設計の決定プロセスに参加し、意見を共有できるようにすることも重要です。
SPA開発の概要
SPAは、従来の多ページアプリケーションとは異なり、1つのHTMLページでアプリケーション全体が構築されます。これにより、ページの読み込みが高速化され、ユーザーエクスペリエンスが向上します。SPAは、JavaScriptフレームワーク（例: Angular、React、Vue.js）を使用して開発されることが一般的です。また、SPAはAPIを活用し、サーバーとのデータの双方向通信を可能にします。
[SPAの開発](https://newwave-solutions.co.jp/spa-development/)には、多くの利点があります。まず第一に、高速なページ読み込みが挙げられます。SPAでは、最初に必要なリソースを一度だけ読み込み、以降はデータのみを取得します。これにより、ユーザーは迅速なページ遷移を体験することができます。また、SPAはリッチなユーザーエクスペリエンスを提供し、アプリケーションの見栄えや操作性を向上させます。さらに、SPAはモバイルデバイスにも適しており、レスポンシブなデザインを実現します。


結論
SPA開発プロジェクトでは、ホリゾンタル設計書が成功の鍵となります。適切に作成され、定期的に更新され、開発チーム全体と関係者と共有されるホリゾンタル設計書は、プロジェクトの一貫性と効率性を向上させます。効果的な戦略を採用し、クロスファンクショナルなコラボレーションを促進することで、SPA開発プロジェクトの成功を確実なものにすることができます。
フロントエンドとコーディング：ウェブ開発の基礎


フロントエンドとコーディングは、現代のウェブ開発において不可欠な概念です。これらの用語は、情報技術分野でよく使われる言葉であり、ウェブサイトやアプリケーションの開発において重要な役割を果たしています。

フロントエンドとは

まず、[フロント](https://newwave-solutions.co.jp/front-end-web/)エンドについて説明しましょう。フロントエンドとは、ウェブサイトやアプリケーションのユーザーが直接触れる部分を指します。具体的には、ウェブページのデザインやレイアウト、ボタンやフォームなどの操作要素が含まれます。フロントエンドの目的は、ユーザーがウェブサイトやアプリケーションを使いやすく、快適に利用できるようにすることです。

コーディングとは

次に、[コーディン](https://newwave-solutions.co.jp/web-coding/)グについて見ていきましょう。コーディングとは、プログラミング言語を使用してソフトウェアやウェブサイトを開発するプロセスを指します。これには、HTML、CSS、JavaScriptなどの言語を使用して、ウェブページやアプリケーションのデザインや機能を実装する作業が含まれます。コーディングを行うことで、フロントエンドの要素を構築し、ユーザーが利用するインターフェースを作成することができます。

フロントエンドとコーディングの関係

フロントエンドとコーディングは、密接に関連しています。フロントエンドの開発には、コーディングが必要不可欠です。プログラミング言語を使用して、ウェブページやアプリケーションのデザインや機能を実装します。また、フロントエンドの要素を作成する際には、デザインとユーザー体験にも配慮する必要があります。つまり、フロントエンドとコーディングは、ウェブ開発の中核を成す重要な要素であり、互いに補完し合っています。

まとめ

フロントエンドとコーディングは、現代のウェブ開発において不可欠な概念です。フロントエンドは、ユーザーが直接触れる部分を担当し、コーディングはその実装を支えます。両者の組み合わせにより、我々は使いやすいウェブサイトやアプリケーションを作成することができます。これらの概念を理解し、上手に活用することで、より良いデジタル体験を提供することができるでしょう。
Workato：カスタムコネクタのバージョンアップ方法

# はじめに

Community LibraryやWorkatoパートナー経由で提供されたカスタムコネクタは、次の手順でバージョンアップを行うことができます。

# 手順

## １．[Tools] - [Connector SDK]をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/24589dcf-eb4d-8191-de31-7875e33cd44c.png)

## ２．バージョンアップしたいコネクタを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4544935d-907d-e4aa-8678-dab9cfdd0b8d.png)

## ３．[Update connector]をクリックします

:::note info
バージョンアップが存在する場合のみ「An update is available」という表示ならびに[Update connector]ボタンが表示されます。
:::
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7c3874c3-3d4a-ef55-4bf9-41bf3197654e.png)

## ４．バージョンアップ完了後、[Release latest version]をクリックします

:::note warn
[Release latest version]がクリックされるまでは、運用環境のカスタムコネクタは更新（バージョンアップ）されず、バージョンアップ前の状態（前回リリース時の状態）で動き続けます。このボタンをクリックすることで、運用環境のカスタムコネクタは最新バージョンに更新されます。
:::

バージョンアップが完了すると、「Successfully updateted to latest version」というメッセージが表示されます。確認後、[Release latest version]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/276bb401-64f0-c556-d27e-45902ed34a12.png)

## ５．コメントを確認、あるいは追記・変更し、[Release]をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/36ec9afd-c62b-233d-a453-d022ffe9427a.png)

## ６．以下のメッセージが表示されれば、バージョンアップ完了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/bb3e6130-772a-7cc6-f061-e70602992808.png)


# バージョンアップしたものを戻したい

:::note info
バージョンアップしたコネクタに不具合があった場合や互換性の問題が生じた場合は、以下の手順でカスタムコネクタを過去のバージョンに戻すことが可能です。
:::

:::note warn
戻したバージョンを取り消したい（バージョンアップ時の状態に戻したい）場合も、同様の手順でバージョンを選択することで対応可能です。
:::

## １．Connector SDKのコネクタの画面上で、[Versions]タブをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/43749d8a-e70b-0d13-394e-08fef0b8f7c4.png)

## ２．戻したいバージョンを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/407f9428-ac07-70fc-d7e4-357b6d818187.png)

## ３．[Restore this version]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/390e24d4-d71c-fb94-5f0f-364f33917d1f.png)

## ４．内容確認のうえ、[Release latest version]をクリックします

:::note info
以後の手順は、バージョンアップと同様です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d0bb0f9a-7c12-df09-dafe-2ada8ebb2d86.png)
PowerShellでWindowsの様々な情報を確認する

# What's？

PowerShellで、Windows上の様々な情報を確認するコマンドをまとめておきたいなということで。

# Windowsのバージョンを確認する

```powershell
> [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             10.0.19045.0 Microsoft Windows NT 10.0.19045.0


```

https://learn.microsoft.com/ja-jp/dotnet/api/system.environment.osversion?view=netframework-4.0

# CPUの情報を確認する

```powershell
> Get-WmiObject Win32_Processor


Caption           : Intel64 Family 6 Model 142 Stepping 12
DeviceID          : CPU0
Manufacturer      : GenuineIntel
MaxClockSpeed     : 2304
Name              : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
SocketDesignation : U3E1

```

https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/win32-processor

# 搭載メモリを確認する

```powershell
> Get-WmiObject Win32_PhysicalMemory | Select-Object Capacity

   Capacity
   --------
17179869184

```

複数表示される場合は、その和になるようです。

https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/win32-physicalmemory

使用状況は`systeminfo`で見た方がよいかもしれません。

```powershell
> systeminfo | Select-String メモリ

物理メモリの合計:       16,147 MB
利用できる物理メモリ:   xx,xxx MB
仮想メモリ: 最大サイズ: xx,xxx MB
仮想メモリ: 利用可能:   xx,xxx MB
仮想メモリ: 使用中:     xx,xxx MB

```

https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/systeminfo

# PowerShellのバージョンを確認する

```powershell
> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  4291

```

```powershell
> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.4291
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.4291
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

```

[about_Automatic_Variables / $PSVersionTable](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1#psversiontable)

# .NETのバージョンを確認する

```powershell
> [System.Environment]::Version

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  42000

```

https://learn.microsoft.com/ja-jp/dotnet/api/system.environment.version?view=netframework-4.0
ソフトウェア開発における異なるアプローチとプロセス

ソフトウェア開発において、適切な開発モデルの選択はプロジェクトの成功に直結します。ウォーターフォール、MVC、V字の3つの人気のある開発モデルは、それぞれ独自の特徴と利点を持ちます。本記事では、これらの開発モデルを比較し、それぞれの適用範囲と利点を探求します。
1. ウォーターフォールモデル
[ウォーターフォールモデル](https://newwave-solutions.co.jp/system-development-waterfall-model/)は、古典的な開発モデルの一つであり、段階的なアプローチを採用しています。このモデルでは、要件定義、設計、実装、テスト、リリースの各段階が順番に進行します。一度進んだ段階は戻ることができず、次の段階に進む前に前の段階が完了する必要があります。ウォーターフォールモデルは、プロジェクトの範囲や要件が明確であり、変更が少ない場合に適しています。しかし、要件の変更や不明確な点がある場合には適用が難しく、柔軟性に欠けるという欠点があります。
2. ソフトウェア開発モデル
[ソフトウェア開発モデル](https://newwave-solutions.co.jp/system-development-models/)は、ソフトウェア開発プロセスを定義し、管理するための枠組みや方法論を指します。このモデルは、特定の開発方法論（例: ウォーターフォール、アジャイル）や開発手法（例: スクラム、XP）を含みます。ソフトウェア開発モデルの選択は、プロジェクトの要件や目標、チームの能力などに応じて行われます。適切なモデルの選択は、プロジェクトの成功に不可欠です。
3. MVCモデル
MVC（Model-View-Controller）モデルは、ソフトウェアの設計パターンの一つであり、アプリケーションの構造化と分離を提供します。このモデルでは、アプリケーションをモデル（データ）、ビュー（ユーザーインターフェース）、コントローラ（ロジック）の3つの要素に分割します。[MVCモデル](https://newwave-solutions.co.jp/system-development-mvc-models/)の利点は、各要素が分離されているため、変更やメンテナンスが容易であり、アプリケーションの柔軟性と拡張性が高いことです。
4. V字モデル
[V字モデル](https://newwave-solutions.co.jp/system-development-v-models)は、ウォーターフォールモデルの拡張版であり、開発プロセスとテストプロセスが対応して進行する特徴を持ちます。このモデルでは、各開発段階に対応するテストが計画され、テストフェーズが重要な役割を果たします。要件分析や設計段階で策定された仕様書に基づいて、テストケースが作成され、システムが要求仕様を満たしていることが確認されます。V字モデルは、品質保証とテストに重点を置き、品質の向上と問題の早期発見に貢献します。
まとめ
ウォーターフォール、MVC、V字といったソフトウェア開発モデルは、それぞれ異なるアプローチを提供しますが、プロジェクトの成功に貢献します。開発チームは、プロジェクトの要件や目標、チームのスキルに応じて、最適な開発モデルを選択する必要があります。適切な開発モデルの選択は、プロジェクトの成功に不可欠であり、品質の向上と開発プロセスの効率化につながります。
Anacondaのインストール手順【写真付き手順】

## ANACONDAインストール方法

### Anaconda Download Page

https://www.anaconda.com/download

### インストール手順

・上記のリンクからAnacondaのダウンロードサイトにアクセスして、使用しているPCの環境に適しているかを確認した後、Downloadを押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/8f16c7ae-9e75-301c-1667-0f7f2432f7c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/505f5ceb-6da2-3b40-079c-b66ab0645454.png)

任意の場所に保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/61e8d066-82e6-ef73-7830-5816db927a38.png)

「Next」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/653fe464-6057-97b8-d93b-832d0f3b1a2a.png)

「I Agree」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/804d4041-da89-66b7-2f56-7c07eeed16a5.png)

「Just Me」→「Next」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/cfccfcb8-6d4c-9363-dc25-378b166c87e1.png)

インストール場所の選択「Next」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/0ebf56a5-129a-d984-cf42-a73d70240349.png)

デフォルトのままで問題なし「Next」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/35fbfe6d-9eeb-3311-4c53-7780c22efa50.png)

5分ほど待機(思ったより時間かかります)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/01fcefeb-591a-635b-a3d9-cbdc390a7050.png)

「Next」

これでAnacondaのインストールは完了です。


## Anacondaとは？

Anacondaは、科学計算やデータサイエンスに特化したPythonのディストリビューションです。データ科学、機械学習、大規模データ処理、予測分析などの分野で広く利用されています。PythonやR言語でのプログラミングをサポートし、データ分析に必要なライブラリやツールがプリインストールされているため、環境構築が容易になります。

### Anacondaで使用できる主な機能

1. **パッケージ管理**:
   - Anacondaは、Condaというパッケージ管理システムを使用します。CondaはPython環境を管理するツールで、Anaconda内で独立したPython環境を作成し、管理することができます。これにより、プロジェクトごとに異なるライブラリのバージョンを管理しやすくなります。

2. **豊富な科学計算ライブラリ**:
   - NumPy、Pandas、SciPy、Matplotlib、Scikit-learnなど、科学計算やデータ分析に必要な多数のライブラリがプリインストールされています。

3. **データサイエンスツール**:
   - Jupyter NotebookやSpyderなどの人気のあるデータサイエンスツールが含まれています。これらのツールを使用することで、コードの記述、データの可視化、計算の実行を一か所で行うことができます。

4. **環境の再現性**:
   - Condaを使用して環境をエクスポート・インポートすることができるため、他のユーザーと環境を共有したり、異なるマシン間で一貫性を保つことが容易です。

5. **クロスプラットフォーム**:
   - Windows、macOS、Linuxの各プラットフォームに対応しており、幅広いユーザーに利用されています。

### 使用例
- **データ分析**: PandasやNumPyを使用してデータを操作し、MatplotlibやSeabornでデータを可視化する。
- **機械学習**: Scikit-learnを用いてデータをモデリングし、予測モデルを構築する。
- **統計分析**: R言語の環境を利用して高度な統計分析を行う。
【Access VBA】配列

# はじめに
C#でアプリ開発を行っていたエンジニアが、半年にわたるAccess案件で学んだことをまとめています。
今回はAccessVBAでの配列についてまとめます。

### ⋙Dictionary
>```
>Dim dic As Dictionary
>Set dic = New Dictionary
>dic.add key1, 値1
>dic.add key2, 値2
>```
>このようにkeyと値のセットで格納していきます。
>値には配列やクラスモジュールを指定することも可能です。
>
>Dictionaryは格納した順番が保持されたり、keyの一覧・値の一覧などデータの取得方法が柔軟であるというメリットがあります。
:::note warn
値に配列を指定して使う方法は以下の「DictionaryとArrayの組み合わせ」を参考にしてください
:::
>Dictionaryを利用する際には以下の様な使い方が可能です。
>```
>ForEach d In dic
>	d 
>	dic.Item(d) 
>Loop
>```
>このようにすると、`d`でkeyを、`dic.Item(d)`で値を取得できます。

### ⋙Array
>```
>Dim arr() As String
>ReDim arr(1)
>arr(0) = "Text0"
>arr(1) = "Text1"
>```
>`ReDim`で配列の要素数を指定しています。要素数を指定しないと、値を入れられずエラーになりますので注意してください。
:::note warn
ReDimにはDimでの宣言がなければ宣言の代わりも同時に行う性質を持っていますが、宣言自体はされていないものと認識されるため不都合が生じてきます。
必ずDimでの宣言を行うようにしましょう。
:::
>```
>Dim arr() As String
>ReDim arr(1)
>arr(0) = "Text0"
>arr(1) = "Text1"
>ReDim arr(2)
>```
>配列を変更しようと上記のように書いてしまうと、`ReDim arr(2)`で要素数を書き換えるタイミングで、それまで入っていた値は初期化されます。
>すでに配列の中にある要素はそのままで配列数を変更したい場合は以下のようにします。
>```
>Dim arr() As String
>ReDim arr(1)
>arr(0) = "Text0"
>arr(1) = "Text1"
>ReDim Preserve arr(2)
>```
>このように`ReDim`のあとに`Preserve`を入れることで、葉入れるの中身はそのままで要素数を変更することができます。

### ⋙DictionaryとArrayの組み合わせ
>```
>Dim dic As Dictionary
>Set dic = New Dictionary
>
>Dim arr1 As Variant
>arr1 = Array(XXXX, YYYY・・・)
>
>dic.add Key1, arr1
>
>dic.Item(key1)(0) → XXXX
>dic.Item(key1)(1) → YYYY
>```
>このようにすると、`dic.Item(key1)(0)`で`XXXX`を、`dic.Item(key1)(1)`で`YYYY`を取得することができます。

# さいごに
いかがでしたか？
少しでも役に立つ知識があれば幸いです。
他に気づくことがあれば追記していきます。