OmniAICreator/Qiita-1.07M huggingface dataset:
HeliScriptを扱う上での事前設定＆Tips

:::note info
本記事は、[HeliScriptでリッチなアスレチックワールドを作ろう！【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/63e6bbca2bc1f13ed57e)の記事の一部です

VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。
:::

## はじめに
HeliScriptの開発を行うときは、何度もビルドアンドランを行う必要があります。VketCloudSDKでは開発中のビルドアンドランを素早くするための機能が複数搭載されているので、事前にそれらの設定を行いましょう。
下記の設定を行うことで、開発スピードが飛躍的に上昇します。

また、これらの設定は基本的にはビルドアンドラン時のみ有効であり、ワールドアップロード時は自動的に解除されるため、気兼ねなく設定して問題ありません。

:::note alert
デバッグモードのみワールドアップロード時に自動的でオフになることはありません。
:::

## UIなしでビルドを行う。
Vket Cloudのロード時間は、**Vket Cloudを動かすエンジン**と、**UIの配置情報や画像**と、**VketCloudSDK上で作成した固有のワールドのデータ**に分けられます。
この内、**UIの配置情報や画像**に関しては、開発中は必要ないことがほとんどです。

VketCloudSDKにはUIなしでビルドアンドランを行う機能が存在しており、VketCloudSDK > ビルドオプション > 高速ビルド（UIなし）という機能を有効にすることで、UIなしでビルドすることが出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/1952109e-e9ac-68df-fb7d-f1c105b35ba9.png)

:::note alert
VketCloudSDK13以降のバージョンでは高速ビルド（UIなし）機能は提供されなくなりました
:::

## 書き出し設定を機能をオフにする
VketCloudSDK > 設定 > ビルドに含まれているビルド設定は、特殊な場合を除いて開発中は必要ないことが多いです。こちらもHeliScriptの開発を行う際はすべての書き出し設定をオフにしてビルドすることをおすすめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/77630098-a820-fe42-cefa-ea30e2fce23e.png)

## なるべくシンプルなワールドで試す
Vket Cloudのロード時間の内、**自身で作成したワールドのデータ**の読み込みのほとんどは、容量の大きい画像や、数多くの画像を読みこんでいることに起因します。
これらはロード時間をどんどんと増やしてしまうため、HeliScriptの開発中はテクスチャなしのCubeで構成されたようなシンプルなワールドを使って開発を進めることをおすすめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/1c396109-9a89-ec6d-3a30-184f3f9d77a0.png)

## デバッグモードをオンにする
VketCloudSettingsのBasicSettings内の項目であるデバッグモードは、HeliScriptで、`hsSystemWriteLine(string text)`といった、デバッグ用のプリント関数をすぐに表示することが出来るようになります。
これに限らず、F3キーを押すことでコライダーの表示を行うモードに移行することが出来たりと開発に便利な機能が含まれているので、デバッグモードは、基本的にはオンにしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/9e44c64a-65c6-3ca7-a112-768a41cc06d7.png)

:::note info
Update関数内にプリント関数を含ませると、画面を占有して邪魔になることがあります。その時は、ブラウザのデベロッパーツールからConsoleを確認することでも表示内容を確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/fd4fbb3d-e2de-20c0-99c5-d1e91ff6b8ea.png)
:::

:::note alert
デバッグモードのみワールドアップロード時に自動的でオフになることはありません。
:::

:::note alert
VketCloudSDK13以降のバージョンではローディング画面でデバッグ表示が行われなくなりました
:::

## ブラウザのキャッシュの削除を行う
VketCloudSDKでの開発を行っていると、HeliScriptの内容を変更したにもかかわらず、うまく反映されなくなることが稀にあります。
その時は、ブラウザ上に以前のHeliScriptの内容がキャッシュとして残ってしまっていることが考えられるため、キャッシュの消去とハード再読み込みを行うことで解決することがあります。

Chromeであれば、ブラウザの検索バーをクリックして選択した状態でF12キーを押して、デベロッパーツールを開いたのちに、再読み込みボタンを右クリックすることで、選択ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629942/88acb738-97db-c266-e0d7-9aa2ced17a43.png)

ブラウザの履歴などからキャッシュを削除するのは階層が深く面倒になってくるため、このキャッシュの消去とハード再読み込みを行うようにすると素早くテストができるようになります。

## メャbド
```
関数【 Item@SetPos 】の第1引数はstruct参照値ではなくメャbドです
```
といった警告が表示されることがありますが、メャbドは、**メソッド**という意味です。(12.3時点)
メソッドを呼び出したときに、`()` を書き忘れていないか、他にも引数の型が違う、数が足りないといった部分がないかを確認しましょう。

 **前 :** [Heliscriptを扱う上での事前設定＆Tips](https://qiita.com/IwahanaFuku/private/3622a2d2ac15a97a5e06)
 **次 :** [Heliscriptでアイテムをまっすぐ動かす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/f171b7af2a9e15dc2139)
Privacy Manifest対応時の注意点

# Privacy Manifestとは？
2023のWWDCにてAppleが発表したThird-party SDKを対象にした新たなプライバシー宣言ファイルです。これまでApp Store Connect上で設定していたものを拡張したという感じに近いと思います。本記事で細かい説明は割愛します。

# Privacy Manifest対応方法について
現在Flutterで開発を行っているため，下記の記事がとても参考になりました。

https://zenn.dev/wutchy_zenn/articles/0bdc7163508172

基本的には導入しているパッケージをPrivacyManifestに対応しているバージョンまで上げることでよさそうです。

# 空のPrivacy Manifestはつくるな！
Apple Developer Forum内の[この質問](https://developer.apple.com/forums/thread/746481?answerId=782256022#782256022
)を確認してみると， Developer Technical Support(DTS)からこんな回答をみつけました。
```
あなたのフレームワークがプライバシー・マニフェストを必要としない場合、何もしないでください。
```
つまり，Privacy Manifestを必要としない(指定のAPIを使用していない)場合は何もしなくて良いということです。

:::note warn
既に空のPrivacy Manifestをいれるアップデートを実施してしているパッケージ等も多々見受けられますが，それが原因で審査に落ちるのか？いうところは現時点では不明です。
:::

以下、回答の原文
```text
If your framework doesn't require a privacy manifest, do nothing. 
Avoid adding an empty privacy manifest to your framework.
```

以下、DeepLさんの翻訳

```text
あなたのフレームワークがプライバシー・マニフェストを必要としない場合、何もしないでください。
フレームワークに空のプライバシーマニフェストを追加することは避けてください。
```

# 結論
**Privacy Manifestを必要としない(指定のAPIを使用していない)場合は空のPrivacy Manifestの作成の必要なし！**

何か追加でわかったこと等があれば，本記事に追記したいと思います。

# 追記（2024/5/21）
空のPrivacy Manifestが含まれるプロジェクトでも　Appleからの警告なしで審査が通ることを確認しました！　
とりあえず空のPrivacy Manifestについては気にせずで大丈夫そうですね。👏
raspberry pi 4を利用してsnapで簡単にnextcloudを構築。無料でhttps化。

実行環境：
raspberry pi 4
Ubuntu sever 22.04.4 LTS
snap --version
snap 2.61.2
snapd 2.61.2
series 16
ubuntu 22.04
kernel 5.15.0-1049-raspi
Nextcloud Hub 6 (27.1.7)
~~~
sudo snap install nextcloud
~~~
このコードを実行すればインストールできます。特になにか事前にインストールしておく必要はありません。セキュアな通信にはhttps化が必要なので、lets-encryptを利用して無料でhttps化します。そのためにはドメインが必要です。何を使ってもいいですが、私はmydnsで無料でドメインを取得しました。
```
sudo nextcloud.enable-https lets-encrypt
```
このコードを実行し、指示通りにメールアドレスとドメインを指定すれば完了です。
```
/var/snap/nextcloud/(ここは各自の環境で表示される数字）/nextcloud/config
```
```
cd 
```
で移動します。
移動したら
```
ls
```
コマンドを打ちます。そしたら恐らく`config.php`があるので
```
sudo vi config.php
```
で編集画面に入り、`i`を押し入力モードに入り下記のところに取得したドメインを指定します。
```
'trusted_domains' =>
  array (
    0 => '192.168.1.9',//自分のpcのipアドレス
    1 => 'your.domin.com',//取得したドメイン
  ),
  ```
  これで取得したドメインにアクセスすればセキュアな通信ができるようになります。
  外付けHDD等を利用したければ下記のサイトの通りにマウントすれば勝手に認識されます。
  https://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=ubuntu:%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88
AWS認定 DevOpsエンジニア プロフェッショナル(DOP-C02)試験範囲で個人利用しにくいサービスの概要まとめ

# はじめに
AWS認定 DevOpsエンジニア プロフェッショナルでは、ソリューションアーキテクト プロフェッショナル同様、個人利用だけでなく企業利用を想定しているケースの知識を求められるものがあるため、個人で検証しにくいサービス構成に関する設問も多い。これらのサービスに関するポイントをまとめてみた。
なお、試験範囲はDOP-C02を前提として作成している。

# 障害復旧系
障害復旧系は、実際に障害が発生しないと検証ができないため、実務経験の中で知識を蓄えていくのに時間がかかる分野だ。
※ただし、一部の障害はAWS Fault Injection Serviceで発生させることが可能になったので、FISが無かった頃と比べると検証しやすくなったと言えるだろう。

## EC2

### EC2アクション
CloudWatchアラームに基づいてEC2インスタンスに対して自動的に行うことができる操作のことを指す。

- 対応するアクションは、インスタンスの停止、終了、再起動、復旧(回復)
- 復旧(回復)は、障害の発生したインスタンスを作り直すので、サーバの電源故障やネットワークの障害に対応可能
- 復旧(回復)に対応できるアラームは、StatusCheckFailed_Systemのみ。StatusCheckFailed_Instanceは未対応

参考: [Linux インスタンス用ユーザーガイド](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/UsingAlarmActions.html)

# AWS Organizations系
複数AWSアカウント(しかも数百という単位)を扱うためのノウハウであるため、環境を揃えにくくて実証を伴った勉強がしづらい分野。

## Amazon GuardDuty
マネージド型の脅威検出サービスで、個人利用も可能だが、組織の管理アカウントでGuardDuty管理者アカウントを設定し、既存のアカウントをメンバーとして追加することで、管理や監視を集中管理することができる。
- 発生した脅威のイベントをEventBridgeで処理することが可能

## AWS CloudFormation
AWS CloudFormationの拡張機能で、複数のAWSアカウントまたは複数のリージョンに対してスタックを作成、管理することができる。

### AWS CloudFormation StackSets
複数のAWSアカウントまたはリージョンにわたって一連のAWSリソースを作成と管理を自動化する。制定されたポリシーに準じたデプロイに適している。
- AWS Service Catalogとの住み分けとして、AWS Service Catalogは組織(Organization)管理で、こちらは組織とは関係なく使用できるという違いがある

## AWS Service Catalog
承認されたITサービスを組織全体で一元管理し、迅速なデプロイや制御されたポリシーを体現する。

## IAM Identity Center
AWSやオンプレミスアプリケーションとサービスへのシングルサインオンアクセスを管理する。

### 権限セット
1つまたは複数のIAM ポリシーのコレクションの定義を作成および維持するテンプレート。組織内のユーザーとグループAWSアカウントへのアクセスの割り当てを簡素化する。

## AWS Config組織アグリゲータ
組織全体のAWS Configのデータを集約するためのリソース。このアグリゲータを使用することで、組織内のすべてのアカウントからの設定情報を一元的に確認できる。

# Active Directory系
Active Directoryの運用自体を個人で検証するのが難しい上に、IdPとして連動するものを扱うとなると更にハードルが上がる。

## SSMとの連動
- CloudFormationのAWS::SSM::Associationを使って、オートメーションランブックのAWS-JoinDirectoryServiceDomainを呼び出してADをEC2を関連付けすることができる
- AWS::SSM::Associationで連動する場合は、EC2側にAmazonSSMManagedInstanceCore, AmazonSSMDirectoryServiceAccessのポリシー付与が必要なので注意
GradleのContainuous Buildsを使い、タスクの自動実行を実現する

## Containuous Buildを使うと、タスクの自動的な再起動が可能

普段実行しているGradleコマンドに`-t`または`--continuous`を付ける事で、ファイルが変更された時のタスクの再実行が可能です。

## 実現したかったこと

最近は以下の記事のようなGradleを用いたJARライブラリのビルド環境を整えているのですが、

- [Qiita - GradleでMavenローカルリポジトリにpublishをする](https://qiita.com/yoyoyo_pg/items/61ea8dc2e4e434f53f99)
- [Qiita - CodeArtifactでのJAR公開パイプラインをAWSで実現する](https://qiita.com/yoyoyo_pg/items/1647d65f5b4ae4ae4270)

手元の環境でJARライブラリを開発する時に、ローカルMavenリポジトリ`.m2`への反映の自動実行として`Containuous Build`が上手く利用できそうでした。

## 動作環境

Windows 11  
Gradle 8.6  
openjdk 20.0.2  

## 試してみる

- 試しに`publishToMavenLocal`を実行します
  - こちらは[Maven Publish Plugin](https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven)のローカルMavenリポジトリへの反映のコマンドです
- `maven-publish`プラグインを利用し、以下の`publish`の設定を記載します
  - 詳細は[こちら](https://qiita.com/yoyoyo_pg/items/61ea8dc2e4e434f53f99)の`publishToMavenLocal`の紹介記事の設定を参照ください

```build.gradle
plugins {
    id 'java-library'
    id 'maven-publish'
}

...

publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'com.sample.yoyoyo-pg'
            artifactId = 'jarSample'
            version = '1.0.0-SNAPSHOT'
            from components.java
        }
    }
}
```

- `./gradlew publishToMavenLocal -t`を実行
- 最初の実行後、`IDLE`状態となります

```powershell
PS C:\Users\yoyoyo-pg\git\gradle-sample> ./gradlew publishToMavenLocal -t
Starting a Gradle Daemon, 9 incompatible and 4 stopped Daemons could not be reused, use --status for details

BUILD SUCCESSFUL in 4s
5 actionable tasks: 3 executed, 2 up-to-date

Waiting for changes to input files... (ctrl-d then enter to exit)
<-------------> 0% WAITING
> IDLE

```

- 最初の`publish`が成功している事が分かります

![first-publish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411902/866e2c74-f219-018e-6127-b0ecfee3c5e3.png)

- 適当な`src/main`配下のJavaファイルを変更すると、変更を検知して再度タスクが走ります

```powershell
modified: C:\Users\yoyoyo-pg\git\gradle-sample\lib\src\main\java\gradle\sample\Library.java
Change detected, executing build...


BUILD SUCCESSFUL in 650ms
5 actionable tasks: 5 executed

Waiting for changes to input files... (ctrl-d then enter to exit)
<=============> 100% EXECUTING [10m 13s]
> IDLE

```

- ファイルが更新されている事が分かります

![second-publish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411902/765420b1-b012-f9e5-0219-9529821dbfd4.png)

## 参考文献

[Gradle User Manual - Continuous Builds](https://docs.gradle.org/current/userguide/continuous_builds.html)
[Next.js]API経由でCookieがセットされない場合

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです。）
今回は自分が体験して苦労したNext.jsでのCookieの扱いについて記事にまとめました。

# 原因
元々は、以下のようにログインするとjwtがCookieにセットされるAPIを呼び出す関数を作成しておりました。
``` SignIn.ts
export async function SignIn(email: string, password: string) {
  const res = await fetch(`http://localhost:8080/login`, {
    method: "POST",
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email: email,
      password: password
    }),
  })
  const data = await res.json()
  return { status: res.status, data: data }
}
```

バックエンド側でも、CORSの設定してるのになあ…と悩んでいましたが、原因としてはNext.jsで`Fetch API`のリクエストを行う際に、異なるオリジンへのリクエストにはクッキーや認証情報を含めないことがデフォルトになっていたことでした。（知りませんやん…）

# 対処法
`Fetch API`の中に`credentials: "include"`を付けることで、リクエストに対してクッキーや認証ヘッダーといった認証に関する情報を含めるようにするとCookieがセットされるようになります。

``` SignIn.ts
export async function SignIn(email: string, password: string) {
  const res = await fetch(`http://localhost:8080/login`, {
    method: "POST",
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email: email,
      password: password
    }),
    credentials: "include", // 追加
  })
  const data = await res.json()
  return { status: res.status, data: data }
}
```

# さいごに
自分は上記で解決しましたが、これでも解決しない場合がありましたら以下のライブラリでCookieをセットしに行くのも手の一つにはありそうです。

[next-client-cookies](https://github.com/moshest/next-client-cookies)

（Cookieのバケツリレーみたいになるので好ましくはないですが…）

最後まで見ていただきありがとうございます！
アドバイスや意見などありましたら、是非コメントしていただきたいです！
PHPで"Hello, World!"を表示させる方法を詳しく解説！初心者向けの手順とコード例あり

PHPを利用して **`「Hello, World!」`** を表示する方法について詳しく説明します。この手順は、PHPを初めて学ぶ方や、基本的な構文を確認したい方に適しています。

まず、ブラウザで **`「Hello, World!」`** を表示するためのPHPコードを紹介します。以下の手順に従ってください。

<a href="https://brain-market.com/u/sun_tomo_0218/a/bxITOykTMgoTZsNWa0JXY">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756609/690f2b5a-5b93-2f4b-a804-121789e5b646.jpeg">
</a>


## PHPファイルを作成する

まず、テキストエディタ「VScodeなど」を開き、新しいファイルを作成します。このファイルの拡張子は **`.php`** になります。例えば、 **`hello.php`** という名前で保存します。

## PHPコードを追加する

次に、作成したPHPファイルに以下のコードを追加します。

```php:hello.php
<?php
    echo "Hello, World!";
?>
```

 **`<?php`** と **`?>`** の間に挟まれた部分は、PHPコードの開始と終了を示します。
　・PHPコードは通常、これらのタグで囲まれています。

**`echo`** は、文字列や変数の内容を出力するためのPHPの組み込み関数です。
　・ここでは、ダブルクォーテーションで囲まれた **`「Hello, World!」`** という文字列を出力しています。

**`"`** (ダブルクォーテーション) は、PHPで文字列を囲むための記号です。
　・文字列を表示するときには必ずダブルクォーテーションまたはシングルクォーテーションで囲みます。

## ブラウザで表示する

 **`hello_world.php`** ファイルをウェブサーバー上に配置し、ブラウザでアクセスします。
 例えば、ローカル環境であれば **`localhost:8080/hello.php`** といったURLでアクセスできます。すると、以下のようにブラウザ上に **`「Hello, World!」`** というメッセージが表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756609/4bbb7127-5e0a-c543-e037-95618c361c1e.png)


以上で、PHPを使用して **`「Hello, World!」`** と表示させる方法の解説を終えます。

<a href="https://brain-market.com/u/sun_tomo_0218/a/bxITOykTMgoTZsNWa0JXY">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756609/f8758b9e-3879-8922-ecaf-a95f9227a116.jpeg">
</a>
Fluentdをgemでインストールする（RHEL 9）

## はじめに

現在関わっている業務では、OSSはなるべく最新の安定版を使いたいという意向があります。それで、OSのパッケージからではなく、ソースからのインストールを行うことがあります。

それで、Fluentdもソースからのインストールを行おうとしたのですが、ソースからのインストールは開発者向けの方法のようで、安定版をインストールするためのものではなさそうでした。それでも実際にソースからのインストールを試みたら、エラーが頻発しまして、試行錯誤を強いられました。

そのため、ソースからのインストールは諦め、代案としてRuby Gemでのインストールを提案・実施しました。最新版は使いたいが、運用は安定的に行いたいということであれば、よい方法だと思います。

## 公式ドキュメント、Ruby Gemでのインストール

https://docs.fluentd.org/installation/install-by-gem

## 環境

* OSはRHEL9.1

## インストール前の準備

### Ruby本体とFluentdのインストールで必要とされるパッケージのインストール

ここで1点、注意があります。

公式ドキュメントの要件には、必要なRubyのバージョンは2.4以上で、その他に`ruby-dev`のパッケージが必要とありました。ただ、実際にやってみたところ、`redhat-rpm-config`のパッケージも必要でした。

```
$ sudo dnf install -y ruby ruby-devel redhat-rpm-config
```

### RubyとGemのバージョン確認

RubyとGemがインストールできたことの確認を兼ね、RubyとGemのバージョンを確認しておきます。Rubyの要件は2.4以上でしたので、これならFluentdをインストールできます。

```
$ ruby --version
ruby 3.0.4p208 (2022-04-12 revision 3fa771dded) [x86_64-linux]
```

```
$ gem --version
3.2.33
```

## Fluentdのインストール

### Gemでインストールする

ここはドキュメントに載っているとおりです。

```
$ gem install fluentd --no-doc
Fetching concurrent-ruby-1.2.3.gem
Fetching yajl-ruby-1.4.3.gem

（中略）

Successfully installed cool.io-1.8.0
Successfully installed fluentd-1.16.5
12 gems installed
```

## Fluentdの動作確認

ここもドキュメントに載っているとおりですが、動作確認をします。

```bash:Fluentdの動作確認
$ fluentd --setup ./fluent
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test
```

各コマンドの説明:

1. 設定ファイルを作成
    * カレントディレクトリの直下に`fluent`ディレクトリを作成して、その中に設定ファイルを作成している
1. Fluentdをデーモンとして起動する
    * ログは標準出力に出力される
1. Fluentdにメッセージを送る
    * fluent-catコマンドでFluentdにメッセージを送る

標準出力にログが送られてくるので確認しにくいですが、以下のメッセージが確認できれば、動作確認は成功です。

```:fluent-catでFluentdに送ったメッセージ
2024-03-27 21:21:10.823176653 +0900 debug.test: {"json":"message"}
```
【失敗】claude 3でpower automate desktopを構築してみた。

<h2>経緯</h2>
<p>直近でAIの進歩が目覚ましく、PC上で行えることのほとんどをAIのリソースで構築できるようになってきています。名刺の自動読み取りツールや決算書の読み込みなど、本来ならば人が考えて設計構築しないといけない部分をLLM（大規模言語モデル）で解決できるようになってきました。</p>
<p>単純作業の効率化やサービスの生成として、ソースコードの生成はより精度が高まってきていますが、RPAをAIを用いて自動生成できるかどうかというところを試してみました。</p>

<h2>利用AI</h2>
<ul>
	<li>ChatGPT</li>
	<li>Claude 3</li>
</ul>

<h2>利用RPA</h2>
<ul>
	<li>Power Automate Desktop</li>
</ul>

<h3>Power Automate Desktopについて</h3>
<p>Power Automate Desktopを採用した理由として、GUI上でRPAの処理フローを構築することができ、それをコピーしてテキスト形式に直すとそれぞれの処理がRobin言語という形式のソースコードとして書かれているためです。逆に言うと、Robin言語形式でテキストを記載があればPower Automate Desktopで貼り付けして利用できるので採用しました。</p>

<h2>結果</h2>
<p>結果としてはうまくいきませんでした。出力されたテキストはRobin言語としてどちらのツールも認識はしてくれますが、出力されたものを貼り付けても不明なアクションとして正しいソースとして認識はされませんでした。</p>
<p>Robin言語のドキュメントが少なく、文法の知識がないのかもしれません。自動のRPA構築にはMicrosoft CopiIotのサービスを待った方が良いかもしれません。</p>
関数型言語の厳密な定義はないけど、雑な判定ならできる

- 関数を変数に割り当てられる
- 関数を他の関数の引数として渡せる
- 関数から他の関数を返せる
- 式指向であり、プログラムのほとんどの部分が値を返す式で構成される
- ループによる繰り返し処理よりも、再帰や高階関数を用いた処理を奨励している
- 変数の値を変更できない、または変更しないことを奨励している
- 純粋関数の作成を奨励している

5つ以上当てはまるなら関数型言語と言って差し支えなさそう。
ITパスポート 認証

・利用者認証
利用者が許可されている正規の利用者であるか確認する必要がある

・PIN(Personal Identification Number)
個人を識別する番号

・バイオメトリクス認証
指紋、顔、声紋、掌、虹彩などの身体的特徴を利用した認証

・ワンタイムパスワード
一度きりの使い捨てパスワードによる認証

・マトリクス認証
位置と順序についてのイメージによる認証

・画像認証(CAPTCHA)
歪んだ文字の画像が表示され、それを読み取って入力することによる認証

・多要素認証
二つ以上の異なる手段での認証を組み合わせることで、セキュリティを高める方法
知識情報ｘ所持情報ｘ生体情報

・SMS認証
スマートフォンなどのSMSを利用した認証

・シングルサインオン
許可された複数のサービスやアプリケーションに対して、利用する都度に利用者認証しなくても利用できる仕組みのこと
【Go】マップへの値追加時に発生する「panic: assignment to entry in nil map」

## はじめに

Go言語でキーがint型、バリューがbool型のマップを作成したいです。初期化時は空で生成し、値は後から追加していきます。

初期化して値を追加したらエラーになりました。

```go
var m map[int]bool 
m[1] = true
```

```bash
# エラー
panic: assignment to entry in nil map
# 日本語訳「パニック: nil マップのエントリへの代入」
```

## 原因：マップが初期化されていない

`var m map[int]bool`で初期化したつもりでしたが、これは**宣言しただけ**でまだ初期化されていません。
なのでmはnilの状態です。nilのマップに値を追加しようとすると上記のようなエラーになります。

```go
var m map[int]bool 
fmt.Println(m == nil) // true
```

## 対策：マップを正しく初期化する

初期化方法は3種類あります。

### 方法1：make関数を利用

```go
m := make(map[int]bool)

// 確認
fmt.Println(m == nil) // false
m[1] = true
fmt.Println(m) // map[1:true]
```

### 方法2：宣言と同時に空のリテラルで初期化

```go
m := map[int]bool{} 

// 確認
fmt.Println(m == nil) // false
m[1] = true
fmt.Println(m) // map[1:true]
```

### 方法3：宣言後に改めて空のリテラルで初期化

これももちろんできますが、冗長ですね。

```go
var m map[int]bool
m = map[int]bool{}

// 確認
fmt.Println(m == nil) // false
m[1] = true
fmt.Println(m) // map[1:true]
```

## 終わりに

Goはまだまだ基礎でつまづくことが多いですが、1つ1つ丁寧に調べて理解して慣れていきたいです。
【PHP】PHPの開発環境、XAMPPの使い方

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 今回は、プログラミング言語のPHPの開発環境である<font color="red">XAMPP</font>の使い方について説明したいと思います。
# What's XAMPP??
XAMPPとは、先程も説明した通り、PHPの開発環境です。主にPHPのプログラムを実行するときに使います。たとえPHPのコードがきちんと書けていたとしても、XAMPPが正常に動いてなければ実行ができません。そのため、PHPをやる上で、XAMPPは必須なのです!!
# 使い方
先程、PHPをやる上でXAMPPは必須と言いましたが、XAMPPでやることは1つだけです。それはXAMPPにあるモジュールを動かすことです。やり方は、XAMPPを開いて、Actionsの下に「start」ボタンがあるのでそれを押します。しばらく待つとモジュールの色が緑色になります。そうなったら終わりです。<font color="red">以上!!</font>![スクリーンショット 2024-03-27 203545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749972/eb73404a-8fe7-196d-2c1d-9ad7c5b6a8ab.png)
# おわりに
以上です。思ったより簡単にできちゃいます。余談ですが、自分のパソコンはシャットダウンするとこの作業が<font color="red">**やり直しになります!!**</font>(意味不明) なのでいつもスリープ状態にしています。
この記事が良いと思った方はいいねとフォローをしてくれると嬉しいです。
asとangle bracketの違い


# 1. 背景
型アサーション(Type-Assertion)のasとangle bracket(<>,山括弧)の違いが分からないので調べてみました

# 2. 違いがあるのか調査 
## 同じものでした

最初に追加された構文はangle bracket(<>,山括弧)だそうです。

JSX(TSX)でangle bracketのアサーションを使用する場合はエディタでエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/e1fdc8ed-96da-df23-7bd9-ecfaf8ee041d.png)

その為、JSX(TSX)ではasを使わないといけません。

# 3. 参考
- [Type Assertion（型アサーション）](https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion#as-footofoonoi)
削除ボタンがないお手製のdatepickerを作ってみた

# 背景

https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/

削除ボタンがないdatepickerが上のdocumentにありましたので、SemanticなHTMLに書き換えて実装したいなと思ったからです。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxBZxGj" data-user="uuylkesg-the-styleful" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/uuylkesg-the-styleful/pen/xxBZxGj">
  datepicker-dialog</a> by 山根大生 (<a href="https://codepen.io/uuylkesg-the-styleful">@uuylkesg-the-styleful</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## その他調べたこと
- aria-modal:要素が表示されたときにモーダルであるかどうかを示す
- aria-label:現在の要素にラベルを付ける文字列値を定義する
- aria-selected:現在の selected 状態を示す
- aria-live:内容が更新された際にユーザーに伝達するかどうかを指定できる
- event.whichが3とは:右クリックのこと

# 参考
- https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/which
- https://www.w3.org/TR/wai-aria-1.1/
- [web.devの「ダイアログ コンポーネントを作成する」を読んでみた](https://qiita.com/yamatai12/items/270b520a5febc12abccd)
- [aria-live属性を使ってフォームのエラーをスクリーンリーダーに伝えよう](https://qiita.com/sukoyakarizumu/items/c536e3f0819482b238c3)
- [MDN aria-live](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-live)
【Laravel】ログアウトが動かない時

完全honaki用
悪しからず

## Laravelでログアウトをこのように記載したら動かなかった
```app.blade.php
<div class="my-navbar-control">
    @if(Auth::check())
        <span class="my-navbar-item">{{ Auth::user()->name }}</span>
        /
        <a href="#" id="logout" class="my-navbar-item">ログアウト</a>
        <form id="logout-form" action="{{ route('logout')}}" method="POST" style="display: none;">
                @csrf
        </form>
        <script>
            document.getElementById('logout').addEventListener('click', function(event) {
                event.preventDefault();
                document.getElementById('logout-form').submit();
            });
        </script>
    @else
        <a href="{{ route('login') }}" class="my-navbar-item">ログイン</a>
        /
        <a href="{{ route('register') }}" class="my-navbar-item">会員登録</a>
    @endif
</div>
// ⭐️↓ここ
<script src="{{ mix('/js/app.js') }}" defer></script>
</body>
</html>
```

## 理由
```app.blade.php
/js/app.js
```
これとJavaScriptの共存がダメだかららしい。
そして優先されるのが
素のJavaScript < /js/app.js
になるから、ログアウトができなくなってしまった。

参考
https://nebikatsu.com/7232.html/

##　今回の解決策
```app.blade.php
    <div class="container-fluid mb-3">
        <div class="container">
            <nav class="navbar">
                <span class="navbar-brand mb-0 h1"></span>
                <div>
                    @if(Auth::check())
                        // ⭐️↓ここ
                        <form id="logout-form" action="{{ route('logout')}}" method="POST">
                            @csrf
                            // ⭐️↓ここ
                            <input class="btn btn-danger" type="submit" value="ログアウト"></input>
                        </form>
                    @endif
                    </button>
                </div>
            </nav>
        </div>
    </div>
</div>
<!-- Scripts -->
<script src="{{ mix('/js/app.js') }}" defer></script>
</body>
</html>
```

ログアウトのためには
```app.blade.php
<form id="logout-form" action="{{ route('logout')}}" method="POST">
```
の、action="{{ route('logout')}}"を繋げればいいので
Javascriptで繋ぐのではなく、
formタグとinputタグのsubmitでルーティングまで繋いでログアウト機能を実装した。
ALB背後にリバースプロキシを配置した構成で５０３エラーが発生する

# はじめに
ALB配下のリバースプロキシサーバからべつのALBに接続するという構成で、たびたび５０３エラーが発生することがあり、対処した事例をまとめていきます。

# 構成
![スクリーンショット 2024-03-20 16.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/fdb9a007-35b9-7de9-3a5b-d2ae144c39b9.png)
上記のような構成で、リバースプロキシをApacheで実装しており、特定のURLを別のALBにリダイレクトするような構成をとっていました。この構成において、ユーザが５０３エラーを観測しており原因を調査しました。

# 原因
![スクリーンショット 2024-03-20 17.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/354a11f7-c5b4-b5bf-ec1e-0994b28c5ccf.png)
結論から見ると、上記のようなエラーになっていました。まず、前段のリバースプロキシを担うApacheはデフォルトで、接続先の名前解決を実施し、一定期間キャッシュを持ちます。ALBは、スケーリングなどの任意のタイミングでENIを置き換えるため、同じIPアドレスでの接続が保証されません。今回は一度名前解決を行って返却されたIPアドレスを保持するALBのENIが置き換えられたことにより、リバースプロキシが対象のIPアドレスに接続できず５０３エラーを引き起こしてしまいました。

# ログ
Apacheのログ上では以下のようなエラーが出力されます。
```
[XXXX][proxy:error][pid xxxx:tidxxxx](xxx)Connection timed out:XXX:HTTP:attempt to connect XXXX (ALBのFQDN)failed
```
エラーが出力された時間帯で、CloudTrailのログを確認します。
以下のようなイベントが該当時間帯に出力されていれば、ENIが置き換わっていることが裏付け可能です。

Event name:CreateNetworkInterface
Source IP address:elasticloadbalancing.amazonaws.com

# 対策
## 前段にNLBを挟む
![スクリーンショット 2024-03-20 17.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/62c40e64-1a08-698a-2177-bf6029868c92.png)
本構成をとるとIPアドレスが固定化可能です。対象のドメインに対してNLBのIPアドレスを割り当てる（Route53等による名前解決）もしくは、NLBのIPアドレスに直接送信すればよいです。この構成を取った場合IPアドレスをキャッシュしても、固定IPであるため問題ありません。

## Apacheのコネクションプーリングを無効化する。
![スクリーンショット 2024-03-20 17.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/7f3adf43-424c-1c3f-0906-fa4802fd62a2.png)

Apacheでは上記の様に、コネクションプーリングにより、１つのプロセスが接続を保持します。プロセスが接続を保持するため、接続がタイムアウトするまでは、同一IPでの接続をスレッドで繰り返します。
そのため、この仕組みを無効化してしまい、必ずリクエストごとに名前解決する仕組みに変更します。
リバースプロキシにおいて以下のような設定を行います。
```
ProxyPass /xxxx ALBのFQDN diisablereuse=On
```
この場合、コネクションがリクエストごとに生成されるため、リバースプロキシ側に多少なりとも負荷がかかることになるため注意が必要です。

# まとめ
クラウドではやはり名前解決に注意です。ALBやRDSなど名前解決でしか接続をサポートしないサービスが多いです。
安易にIPアドレスをキャッシュしないことはもちろんですが、切り替え時にキャッシュがどの程度影響するかなどは考慮しておくのがよいでしょう。
Apache Spark徹底入門を出版しました！

2024/4/12に翔泳社より**Apache Spark徹底入門**を出版しました！いやー、長生きはするものです。出版社から本を出せる日が来るとは。発起人の方に感謝です。

<a href="https://www.amazon.co.jp/dp/4798182281/"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/87910d7c-8a63-c198-8e82-216ea7a8ee07.jpeg" width=300></a>

こちらのイベントで紹介させていただきました！
<iframe width="560" height="315" src="https://www.youtube.com/embed/XpsohzjuK_Q?si=iTeAhKGnq4bXzuMk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

ちなみに、過去に同人誌として以下の本も書いています。
<a href="https://www.amazon.co.jp/dp/B09TWXN35R"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ca1243cf-c512-d97f-67c4-273c1d228c53.jpeg" width=300></a>

https://www.amazon.co.jp/dp/B09TWXN35R

つきましては、書籍の[サンプルノートブック](https://github.com/databricks/LearningSparkV2/blob/master/notebooks/LearningSparkv2.dbc)の翻訳版(全てではありませんが)のリポジトリを作成しました。

https://github.com/taka-yayoi/SparkSample/tree/main

また、上記ノートブックをウォークスルーする記事を以下にまとめました。

第2章
- [Sparkでテキストの行数を数える](https://qiita.com/taka_yayoi/items/dce556e9a872f856faa9)
- [SparkでM&M'Sを数える](https://qiita.com/taka_yayoi/items/bb5178d649803ac7de29)

第3章
- [Sparkデータフレームのスキーマ定義、エクスプレッションの活用](https://qiita.com/taka_yayoi/items/62bfafc7a30281c67684)

第4章
- [SparkのUDF、Spark SQL](https://qiita.com/taka_yayoi/items/81a434c43bda4cfcc35a)
- [Sparkのデータソース](https://qiita.com/taka_yayoi/items/b0c78cdfde1b375f642e)
- [Sparkのテーブル](https://qiita.com/taka_yayoi/items/9aa9a9f4c37cb49902a5)

第5章
- [Sparkのユーザー定義関数、高階関数](https://qiita.com/taka_yayoi/items/7a8749bbc45c7fb1e2b1)
- [SparkデータフレームとSpark SQLの一般的なリレーショナルオペレーター](https://qiita.com/taka_yayoi/items/c8923c799a4159fb0e5a)

第7章
- [Sparkのベクトライズドユーザー定義関数](https://qiita.com/taka_yayoi/items/c91c4a1857a8266066ba)
- [Sparkにおけるデータキャッシュ](https://qiita.com/taka_yayoi/items/0fe326871e34be403d65)

第10章
- [SparkによるAirbnbデータセットのクレンジング](https://qiita.com/taka_yayoi/items/8cc41de976a161d9df19)
- [Sparkによる線形回帰モデルのトレーニング](https://qiita.com/taka_yayoi/items/83135a21756ece99e49b)
- [Sparkによるワンホットエンコーディング、ログスケールによる予測性能の改善](https://qiita.com/taka_yayoi/items/3750d21c542448f01f01)
- [Sparkによる決定木モデルのトレーニング](https://qiita.com/taka_yayoi/items/790734663e639db956e9)
- [Sparkによるハイパーパラメータチューニング](https://qiita.com/taka_yayoi/items/b2c409064d8d27b6ba58)
- [SparkによるK\-Meansクラスタリング](https://qiita.com/taka_yayoi/items/b86cf85ff71917c39d27)

第11章
- [MLflowによるモデルのトラッキング](https://qiita.com/taka_yayoi/items/d1d940fd6e2cf8df88c8)
- [Sparkによるモデルの分散トレーニング](https://qiita.com/taka_yayoi/items/db64fbc68690bbf08feb)

第12章
- [SparkのEXPLAINによる論理計画・物理計画の確認](https://qiita.com/taka_yayoi/items/dcc4370d3e1ef21849fe)

相当夜鍋して翻訳しました！ご興味がある方は是非！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Clipyで人生変わった話


# 初めに:sunny:

突然ですが皆さんは「開発速度を上げる」と聞いて何が思い浮かびますか？

・ショートカット
・ブラインドタッチ
・コマンドでファイル/ディレクトリ作成
・スニペット
・エイリアス　etc...

ペアプロやってて少しもたついてしまうと、焦って余計に手が遅くなってしまうこと、ありますよね。
頻繁に使用するコマンドやhtmlのDTD宣言など、一撃で入力できたら便利だと思った経験のある方は多いのではないでしょうか。（他でもない自分がそうです。）

そんな自分が出会ったツールについて記事を書きました。


# Clipy
ClipyはMacOS専用のスニペット編集＋登録アプリです。
直前に使用していたコマンドやテキストの履歴を保持したり、頻繁に使う定型文をスニペット登録しておいて簡単に呼び出せるツールです。

## 便利な機能

### ①コピーした履歴を残せる＆呼び出せる
![スクリーンショット 2024-03-27 19.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/969b1fdc-b52f-10bd-6166-240fa6cd2fcb.png)

このツールの真骨頂です。
![スクリーンショット 2024-03-27 19.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/cb0f7cd6-bcea-87cd-6038-8220b31a7788.png)
エディターなどの入力欄で簡単に呼び出せます。しかも保持しておける数が結構多い。

もちろんショートカットキーで呼び出し可能です。
![スクリーンショット 2024-03-27 19.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/1fd58470-dcf2-1613-3aaa-4efdb3103bc5.png)

自分は他のショートカットと競合しにくいという理由から option ＋ V　で設定してます。

### ②スニペット登録で開発速度UP
スニペットは英語で「切れ端」とかそんなニュアンスの言葉です。
プログラミングでは切ったり貼ったりして繰り返し利用するパターン文や部品を指す用語として使われます。

しょっちゅう使うものは勿論のこと、「たまにしか使わないコマンドだけど、いざ叩こうとするとオプション含めパッと出てこない・・・」といったものをスニペット登録しておけば、いちいちggらず済むので速度が上がるという訳です。
※やたらオプションの多いGitコマンド（git diffとか）みたいなものを登録しておくと重宝します。

![スクリーンショット 2024-03-27 19.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/b733d0f5-f15f-beab-2f63-f8b7252ee603.png)
画像にあるようにスニペットごとにフォルダを分けて管理できるので、煩雑になりにくいのもありがたいですね。

## ダウンロード方法

下記リンクから無料でダウンロードできます。細かい仕様はリンク先をご参照ください。
https://clipy.softonic.jp/mac

2024年3月27日時点で1.1.5が最新バージョンとなっているようです。

ダウンロードボタンをクリックすると下のようにAVAST（セキュリティソフトの広告）が表示されますが、無視してもダウンロードに支障はありません。

![スクリーンショット 2024-03-27 19.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/3ef14b2d-30c6-ba0f-ed3e-9b155f34ce81.png)

## 
ここまで読んでいただきありがとうございました。

最後になりますがスニペット登録をおすすめしたいコマンドの参考に↓
[Gitコマンド早見表](https://qiita.com/kohga/items/dccf135b0af395f69144)

<参考>
・[コピペツールClipyでテンプレ化した入力を](https://qiita.com/kohga/items/dccf135b0af395f69144)
puppeteerがGCFローカル環境で動作しない

## environment/tech
### environment
- Docker
- BuildPack-CLI(https://buildpacks.io/)
    - よしなにDockerコンテナを作成してくれる
- GoogleCloudCLI
### tech
- typescript
- pupetter
    - html -> pdfにするために使用

## デプロイ & 実行
GCFをローカル上で動作させるために、以下コマンドを使用してデプロイしています。
``` bash:
gcloud alpha functions local deploy test-container --builder gcr.io/gae-runtimes/buildpacks/google-gae-22/nodejs/builder --entry-point testFunction --gen2 --runtime nodejs20
```


実行時は、作成したコンテナのポート宛にPOSTします。
``` typescript:run.ts

async function run() {

  // NOTE: https://cloud.google.com/functions/docs/running/calling?hl=ja#cloudevent_functions
  const headers = {
    'Content-Type': 'application/json',
    'ce-id': '123451234512345',
    'ce-specversion': '1.0',
    'ce-time': '2020-01-02T12:34:56.789Z',
    'ce-type': 'google.cloud.pubsub.topic.v1.messagePublished',
    'ce-source': '//pubsub.googleapis.com/projects/MY-PROJECT/topics/MY-TOPIC',
  };
  const json = {
    message: {
      data: 'data',
      attributes: {
        attr1: 'attr1-value',
      },
    },
  };

  await ky.post('http://localhost:8080', {headers, json});
}

await run();
```

## エラー☠️
```
Error: Could not find Chrome (ver. 122.0.6261.69). This can occur if either
2024-03-22 17:28:20  1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or
2024-03-22 17:28:20  2. your cache path is incorrectly configured (which is: /www-data-home/.cache/puppeteer).
2024-03-22 17:28:20 For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
2024-03-22 17:28:20     at ChromeLauncher.resolveExecutablePath (file:///workspace/node_modules/.pnpm/puppeteer-core@22.3.0/node_modules/puppeteer-core/lib/esm/puppeteer/node/ProductLauncher.js:259:27)
2024-03-22 17:28:20     at ChromeLauncher.executablePath (file:///workspace/node_modules/.pnpm/puppeteer-core@22.3.0/node_modules/puppeteer-core/lib/esm/puppeteer/node/ChromeLauncher.js:190:25)
2024-03-22 17:28:20     at ChromeLauncher.computeLaunchArguments (file:///workspace/node_modules/.pnpm/puppeteer-core@22.3.0/node_modules/puppeteer-core/lib/esm/puppeteer/node/ChromeLauncher.js:83:37)
2024-03-22 17:28:20     at async ChromeLauncher.launch (file:///workspace/node_modules/.pnpm/puppeteer-core@22.3.0/node_modules/puppeteer-core/lib/esm/puppeteer/node/ProductLauncher.js:44:28)
```
どうやらpuppeteerを使用するためのcacheディレクトリが想定外のところにあるらしい。

https://github.com/puppeteer/puppeteer/issues/9694#issuecomment-1444007732

こちらを参考に、ルートディレクトリにpuppeteer.config.tsを配置します。
``` typescript:puppeteer.config.ts
import { join } from 'path';
import { Configuration } from 'puppeteer';

const puppeteerConfig: Configuration = {
  cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
};

export default puppeteerConfig;
```

これでデプロイした時に、作業ディレクトリにpuppeteerがインストールされます！

### 補足
コンテナビルドの時に
```
pnpm i
```
が走り、puppeteerがインストールされる
デフォルトのままだと、docker上の`/www-data-home/.cache/puppeteer`にインストールされるが、その後の処理か何かで消えてしまう。
`/workspace/.cache/puppeteer`にインストールさせることで使えるようになった。

## まとめ
GCFをローカルで使用するのに、意外と苦労している。
現状もGCSにアップロードする箇所でエラーです。。
また、なぜか消えてしまう箇所もう少し調査すれば良かったかもしれない。。
Salesforce認定アドミニストレーター過去問+時々解説　Q121 ~ Q130

## Q121. 優先度の高いケースが少なくとも4時間以内に応答されるようにするか, 「優先度の高いキュー」と呼ばれるキューのエスカレーションすることを望んでいる. 管理者はこの要件を実装するためにケース管理プロセスをどのように構成する必要がありますか？

A 割り当てルールを作成して、ステータス=高のすべてのケースを高優先度キューに割り当てます。
B 最終変更時刻に基づいてステータス=高のすべてのケースを高優先度キューに割り当てるケースマイルストーンを作成し、経過時間を4（時間）に設定します。
C エスカレーションルールを作成して、ステータスが「高」のすべてのケースを最終変更時間に基づいて高優先度キューに割り当て、経過時間を4（時間）に設定します。
D エスカレーションルールを作成して、最終変更時刻に基づいて、ステータスが「高」のすべてのケースを高優先度キューに割り当て、経過時間を4（時間）に設定します。

<details><summary>解答</summary>
C
</details>

## Q122. 7月30日の終了日で作成された商談レコードは, 時間ベースのワークフロールールが適用されており, アクションは7月23日に予定されている. しかし, 7月23日より前にその商談は編集されてしまいました. このように基準を満たさなくなった商談レコードはその後どうなりますか？

A 時間ベースのアクションは自動的にキューから削除されます。
B 時間ベースのアクションが保留されます。
C 時間ベースのアクションは7月30日に実行されます。
D 時間ベースのアクションは7月23日に実行されます。

<details><summary>解答</summary>
A

解説: 時間ベースのアクションを設定していてトリガーされるタイミングで条件を満たさなくなった場合は, 自動的にキューから削除される.
</details>

## Q123. ワークフローアクションについて, 間違っている文章はどれ？

A 項目自動更新では、主従関係であれば、親オブジェクトの値を更新できる
B ワークフローTo-Doは、複数のユーザに割り当てられない
C 項目自動更新では、レコードタイプを変更できない
D ワークフローTo-Doは、活動履歴で追跡できる

<details><summary>解答</summary>
C

解説: 項目自動更新でレコードタイプの変更は可能.
</details>

## Q124. Salesforceモバイルアプリケーションでレポートを使用する際, どのレポート形式が表形式でのみ表示されますか？ 1つの回答を選択してください.

A サマリーレポートとマトリックスレポート
B 結合レポートと表レポート
C マトリックスレポートのみ
D サマリーレポートのみ

<details><summary>解答</summary>
A

解説: サマリーレポートとマトリックスレポートはモバイルアプリケーションで表形式として表示されるが, 結合レポートをモバイルアプリケーションで表示することはできない.
</details>

## Q125. モバイルアプリケーションでオフライン中にユーザーが行える操作はどれ？

A オフラインでの完全なコーディング開発作業
B キャッシュされたレコードの編集
C 新しいレコードのオンラインでの作成のみ
D Experience Cloud サイトの利用

<details><summary>解答</summary>
B

解説: キャッシュされたレコードへはオフライン中であってもアクセスできる. また, 編集も可能であるが, A, C, Dのような操作はオフライン中はできない.
</details>

## Q126. モバイルアプリケーションでダッシュボードを使用する際に利用できない機能はどれ？

A ダッシュボードの作成、編集、削除
B ダッシュボードのスケジュール設定
C ダッシュボードコンポーネントからのリンク使用
D すべての上記

<details><summary>解答</summary>
D

解説: A~Cの機能はデスクトップでサイトでのみ利用可能で, モバイルアプリでは一部の表示や参照機能に限られる.
</details>

## Q127. モバイルアプリケーションでオフライン中にサポートされていない機能はどれ？

A キャッシュされたレコードの削除
B メモへの画像の追加
C 最近アクセスしたレコードの表示
D ToDoの作成

<details><summary>解答</summary>
B

解説: キャッシュされたレコードへのアクセスが可能であるのでA,C,Dは可能であることがわかる. 
</details>

## Q128. モバイルアプリケーションでレコードを作成または編集する際に利用できない機能はどれ？

A レコード所有者の変更
B サービス予定の状況の編集
C インライン編集の利用
D 成功メッセージに新しいレコードへのリンクの表示

<details><summary>解答</summary>
C

解説: インライン編集とは, ページ遷移など移動をともわない表内で編集ができるもの. これは, 特定のフィールドをユーザーが直接編集できないことを意味する. 
</details>

## Q129. モバイルアプリケーションで使用できないアクションはどれ？

A 電話番号項目の編集
B 関連情報と共にコピーの使用
C ToDo アラームの設定
D 添付ファイルの追加

<details><summary>解答</summary>
B

解説: Bについて, これはレポートをコピーする際, 関連づけられた情報までもコピーすることを可能にするということなのだが, モバイルアプリケーションではこの機能がサポートされていない.
</details>

## Q130. AppExchangeのダウンロードが可能なユーザーはどれ？2つ選べ.

A システム管理者
B マーケティングユーザ
C AppExchangeパッケージのダウンロード権限があるプロファイルに属するユーザ
D 全てのユーザ

<details><summary>解答</summary>
A, C
</details>

## Q131 ~ Q140
https://qiita.com/taiga-shiokawa/items/068a6b417b9784412cfe
ITパスポート 暗号化技術

・暗号化技術
暗号化とは、第三者に容易に解読できないようにすること
復号とは、暗号化されたデータを元に戻すこと
暗号化されてないデータを平文、暗号化されたデータを暗号文という

・共通鍵暗号方式（家の鍵）
共通鍵暗号方式は、暗号化鍵と復号鍵が共通の同じ秘密鍵を使う暗号方式
暗号化鍵と復号鍵は同一の鍵
共通鍵で暗号化して、同じ共通鍵で復号
鍵の管理と配送が煩雑
暗号化や復号は高速

・公開鍵暗号方式（南京錠）
一方の鍵を公開する暗号方式
暗号化鍵は受信者の公開鍵で、復号鍵は受信者しか持っていない秘密鍵
暗号化鍵と復号鍵は対の鍵
受信者の公開鍵で暗号化して、受信者の秘密鍵で復号
鍵の管理と配布が容易
暗号化や復号には時間がかかる

・ハイブリッド鍵暗号方式
共通鍵暗号方式と公開鍵暗号方式を組み合わせた方式
共通鍵暗号方式は暗号化復号する処理が高速、公開鍵暗号方式は鍵の管理や配布が容易、という互いの長所を活かした暗号方式

・耐タンパ性
ハードウェアやソフトウェアなどの内部構造や情報を外部から読み取りにくくする能力のこと
Semantic Versioning とは？

最近、社内でnpmパッケージを配布していた時、versionはどのようなルールで決まるのかが気になりました。

そこで、バージョン管理について検索していたら、たまたまセマンティックバージョンという概念を知りました。

## Semantic Versioningとは、
>　バージョンナンバーは、メジャー.マイナー.パッチ とし、バージョンを上げるには、
>
>1. APIの変更に互換性のない場合はメジャーバージョンを、
>1. 後方互換性があり機能性を追加した場合はマイナーバージョンを、
>1. 後方互換性を伴うバグ修正をした場合はパッチバージョンを上げます。
>
>　プレリリースやビルドナンバーなどのラベルに関しては、メジャー.マイナー.パッチ の形式を拡張する形で利用することができます。

上記のようなアイデアを持って、メジャー/マイナー/パッチバージョンを有意義に更新するバージョン管理方法です。
セマンティックバージョニングはパッケージ利用者に、そのパッケージがどのように変更してきたかを知ることができる。

セマンティックバージョンの詳細な説明は以下のリンクで確認することができます。
https://semver.org/lang/ja/

重要な内容だけまとめると

1. 初回の配布バージョンは0.1.0とし、その後プロダクト化前までのリリースごとにマイナーバージョンあるいはパッチバージョンを更新する。
2. 1.0.0はプロダクトして利用される初めてのバージョンとする。
3. 特定のバージョンが配布された後、そのバージョンは絶対に変更されないこと。
バッチファイルFOR文［フォルダ指定］まとめ

「まとめ」と言うほどでもないのですが、バッチファイルのFOR文で、カレントフォルダではなく特定のフォルダを対象とする場合の表記の違い。
※ファイルサーバ上のファイルを操作するときとかに重宝します

```bat
:: カレントフォルダ
for %%F in (*.*) do echo %%F
```

```bat
:: カレントフォルダ（サブフォルダも含む）：rオプション
for /r %%F in (*.*) do echo %%F
```

```bat
set FILE_SERVER=\\fs001\IT事業部\開発課\Windows\BAT

:: フォルダ指定
for %%F in (%FILE_SERVER%\*.*) do echo %%F

:: これはだめ
for %FILE_SERVER% %%F in (*.*) do echo %%F
```

```bat
:: フォルダ指定（サブフォルダも含む）：rオプション
for /r %FILE_SERVER% %%F in (*.*) do echo %%F

:: これはだめ
for /r %%F in (%FILE_SERVER%\*.*) do echo %%F
```
※バッチファイルではなくコマンドプロンプトで実行する場合は `%%F` を `%F` にしてください。
Roomba in ROS 2

## 2024 3/26　現在のROS 2 ルンバについて
みなさまこんにちは。twitterでよくM1Macの環境でROS2を動かしているにゃんじばと申します。自身の備忘録も兼ねて、今回は現在のルンバのversion対応についてと、対応機種について話します。
## そもそもなぜROS2でルンバ？
ルンバは初代turtlebotの土台として利用されていました。
Roombaの500~800シリーズはmini-DINでシリアル通信ができ、ROS2対応ドライバーも公開されており、簡単にハックができます。
加えて、ルンバの開発元のiRobotさんがそのルンバの仕様書とルンバの外部操作方法を仕様書として公開されています。
これらから手軽にROS2を体験するものとしてルンバは最適なロボットと言えるでしょう。
ちなみにですが、私が出場するRobocupでもルンバを移動台車として利用してます。
## レポジトリ、簡単な操作方法の紹介
ROS 2対応しているものは現状create_robotのみとなっています。
URL
基本的にはreadmeに書かれていることをやっていけば良いのですが、引っ掛かりポイントを説明していきます。

### 引っ掛かりポイント
主に下の4つほどです。
- ルンバの電源が入っていない（充電切れ）
- シリアルパスの設定ミス
- Tx/Rxの向きを間違えている
- コードがデータ転送に対応していない(usb-serialの場合)
    
    :::note 
    - ルンバの電源が入っていない
    - usb-serialの時にUSBのコードがデータ転送に対応していない
    は飛ばします。

### シリアルパスの設定ミス
シリアル設定ミスについては、シリアルのパスがうまく通っていない、また、シリアルパスに対しての権限設定がうまくいっていないなどがあげられます。以下のコマンド等を使用してパスへの権限付与を行ってください。

```
$ chmod +x　${PATH}
```

シリアルパスの確認は以下のコマンドで実行できます。
```
$ ls -l /dev/tty*
```
ラズベリーパイなどを使用している場合、GPIOピンからシリアル接続することもできます。詳しくは拙著の記事をご覧ください。
URL

### ルンバのシリアルの繋げ方
以下の写真を見てTxとRxとGNDをそれぞれ合うところに繋げてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579313/92a07c3d-b718-5ea4-218e-f7822246aabf.png)


不明点などがありましたらtwitterなどで質問をしてもらえればと思います。
記事をご覧いただきありがとうございます。
cloudwatchのアラームの仕様を勘違いしていた

cloudwatchのアラームで設定している期間の時間より短い時間で通知されることがあったので気になったので調べてみました

例えば以下のような設定のアラームの場合に、前回のアラームから10分後に再度アラームが発生していることがありました
期間: 30分間
統計: 平均値
閾値: 30分内の1データポイントの平均値 < 10
アラームを実行するデータポイント: 1/1

そもそも公式によるとアラームは期間が5分などでも、アラームの評価自体は1分間毎に行われるとのこと
> 期間が 1 分以上の場合、アラームは 1 分ごとに評価され、評価は [期間] と [評価期間] で定義されている時間枠に基づいて行われます。例えば、[期間] が 5 分 (300 秒) で、[評価期間] が 1 の場合、5 分終了時に、アラームは 1 分～5 分のデータに基づいて評価されます。続いて、6 分終了時に、2 分～6 分のデータに基づいてアラームが評価されます。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarm-evaluation


なんとなく1枚目のイメージで使用していましたが、実際には2枚目のほうが正しいぽいです
![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/5a606d52-36cb-c85e-273b-03d4cc288c89.png)
![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/7e547187-0b72-7829-4a1b-b945231366b4.png)


# 1分毎のアラーム評価は期間によって変わるのか
> 期間が 1 分以上の場合、アラームは 1 分ごとに評価され、評価は [期間] と [評価期間] で定義されている時間枠に基づいて行われます。

期間がどの程度であればアラームが1分毎に評価されるかが公式のページで見つからなかったので試してみました
期間を変更して数分で閾値を超えたり、下回るようにしてみました

## 5分毎
5分以内でアラームが発生したので、1分毎に評価されていそうです

設定
期間: 5分間
統計: 平均値
閾値: 5分内の1データポイントの平均値 > 2
アラームを実行するデータポイント: 1/1
アクション：アラーム状態のとき、トピックにメッセージを送信します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/ac265caf-e862-fe31-a30b-03f68816d65d.png)

## 1時間毎
1時間でも数分毎にアラームの発生が確認できました

設定
期間: 1時間
統計: 平均値
閾値: 1時間の1データポイントの平均値 > 2
アラームを実行するデータポイント: 1/1
アクション：アラーム状態のとき、トピックにメッセージを送信します
![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/660faadc-32af-ee4e-dbf4-a9efbc91eab2.png)

## 1日毎
1日でも数分毎にアラームの発生が確認できました

設定
期間: 1日
統計: 平均値
閾値：1日の1データポイントの平均値 > 2
アラームを実行するデータポイント: 1/1
アクション：アラーム状態のとき、トピックにメッセージを送信します

![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/84c5e233-2f12-4f32-94d0-cbb2df0636f9.png)

1日以上は実行していませんが、思ったより長い期間でもアラームは1分毎に評価してくれるようです
1時間以上からはアラームの評価間隔も1分から変わると思っていました



# アラーム実行ポイントが1/1ではない場合
cloudwatchのアラームを設定する際にアラーム実行ポイントを`2/3`などと設定することで、3回中2回閾値を超えていた場合アラームとすることができます
この場合はアラームの評価がどうなるのか実施してみました

なんとなく1枚目かと思っていましたが、公式の説明を踏まえると2枚目のようになる？

![image-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/9b6d9590-314c-e420-e779-888d4a4da50f.png)
![image-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/bf0d8a3c-2d1f-c440-14f9-dfb9d4b87d02.png)

1分毎に閾値を超える、下回る状態を繰り返してみた結果、2分ごとにアラームが発生したので、予想と同じ評価のされ方をしているようです

設定
期間: 1分間
統計: 合計
閾値：5分内の3データポイントの合計値 > 2
アラームを実行するデータポイント: 3/5
アクション：アラーム状態のとき、トピックにメッセージを送信します

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/dca0e35f-7f76-4783-2db7-08225000b503.png)


# おわり
アラームの設定値などによっては想定よりも短い期間でアラームが来る理由がわかりました
間違っているところがあれば教えてください
RailsのModelで定義したenumの対応関係を確認する


## 背景
enumを設定したはいいものの、
一定数を超えると数字と文字の対応関係がわかりにくくなると思います。

そんな時にconsoleでパッと確認できますよ〜という内容です。

## 確認方法
まず、例として次のようなUserモデルがあるとします。

```ruby
class User < ApplicationRecord
  enum :status, [
    :active,
    :inactive,
    :suspended
    # ...省略
  ]
end
```

このモデルで定義されたstatus enumの数値と文字列の対応関係を表示するには、
rails consoleで以下のコマンドを実行します。

```ruby
User.statuses
```

これにより、以下のような出力が得られます。

```
{
    "active" => 0,
    "inactive" => 1,
    "suspended" => 2,
    ...
}
```

めでたし*2。
CSSセレクターまとめ

CSSセレクターについてメモ

## 📝 1. 基本的なセレクター
要素を指定

```css
p {
  color: blue;
}
```

## 🎨 2. クラスセレクター
クラスセレクターは、要素にクラス属性を付与してそれを選択します。

```
<p class="important">This is an important paragraph.</p>
```

```css
.important {
  font-weight: bold;
}
```

## 🔑 3. IDセレクター
IDセレクターは、要素に一意のIDを付与してそれを選択します。

```html
<div id="header">Header</div>
```

```css
#header {
  background-color: gray;
}
```

## 🛠️ 4. 属性セレクター
属性セレクターは、要素の属性に基づいて選択します。

```html
<input type="text" />
```

```css
input[type="text"] {
  width: 200px;
}
```

## 🌳 5. 子孫セレクター
子孫セレクターは、要素のネストされた関係を使用して選択します。
半角スペースを開ける。

```html
<div class="container">
  <p>This is a paragraph inside container.</p>
</div>
```

```css
.container p {
  font-style: italic;
}
```

## 👶 6. 直接子セレクター
直接子セレクターは、指定された要素の直接の子要素のみを選択します。

```html
<ul>
  <li>List item 1</li>
  <li>List item 2
    <ul>
      <li>Subitem 1</li>
      <li>Subitem 2</li>
    </ul>
  </li>
</ul>
```

```css
ul > li {
  list-style-type: square;
}
```

## 7. 疑似クラスセレクター
疑似クラスセレクタは、要素が特定の状態にある場合にスタイルを適用するためのCSS

#### よく使われるもの
`:hover:` マウスが要素の上にあるとき。
`:active:` 要素がクリックされているとき。
`:focus:` 要素がフォーカスを受け取っているとき。
`:visited:` 訪問済みのリンク要素に対して。
`:first-child:` 要素がその親要素の最初の子要素である場合
`:last-child:` 要素がその親要素の最後の子要素である場合
`:nth-child():` 指定した式で子要素を選択します。例えば、:nth-child(2n) は偶数番目の子要素を選択します。

```html
<div class="container">
    <p>最初の子要素</p>
    <p>2番目の子要素</p>
    <p>3番目の子要素</p>
    <p>最後の子要素</p>
</div>
```


```css

/* 最初の子要素に赤い背景色を適用 */
.container p:first-child {
    background-color: red;
}

/* 最後の子要素に青い背景色を適用 */
.container p:last-child {
    background-color: blue;
}

/* 偶数番目の子要素に緑の文字色を適用 */
.container p:nth-child(even) {
    color: green;
}

/* 奇数番目の子要素にオレンジの文字色と斜体を適用 */
.container p:nth-child(odd) {
    color: orange;
    font-style: italic;
}
```

https://developer.mozilla.org/ja/docs/Web/CSS/:nth-child

## 🎭 8. 疑似要素セレクター
疑似要素セレクターは、要素の特定の部分にスタイルを適用します。

`::before:` 選択した要素の最初の子要素としてスタイルを追加します。
`::after:` 選択した要素の最後の子要素としてスタイルを追加します。
`::first-letter:` 選択した要素の最初の文字にスタイルを適用します。
`::first-line:` 選択した要素の最初の行にスタイルを適用します。

```html
<p>This is a paragraph.</p>
```

```css
p::first-line {
  font-weight: bold;
}
```

## 🏡 9. 子孫要素の選択
孫要素

```
<div class="parent">
    <div>
        <p>親の孫要素1</p>
        <p>親の孫要素2</p>
    </div>
    <ul>
        <li>親の子要素2</li>
        <li>親の子要素3</li>
    </ul>
</div>
```

```css
.parent p {
    /* スタイル */
}
```

## 2つのクラスを持つ要素
 ```html
 <div class="container first">...</div>

```


```css
.container.first {
    /* スタイル */
}
```
New Relic でSlow Burn Rate を設定しよう！

# 概要

SREのみなさん、こんにちは！サービスレベルの監視をしてますか？

New Relicでは通常の閾値監視に加えて、サービスレベルの監視もできる機能があります。
この度、**New RelicではSlow Burn Rateが設定できる**ようになりましたので、知識の整理を兼ねて試していこうと思います。前半は知識整理の解説があるので、サクッと設定を見たい方は後半へ飛んでください。

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート(2023年2月)
](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202302 "New Relic アップデート(2023年2月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

# エラーバジェット管理のためのSlow Burn Rate
前提としてサービスレベルを設定するときにSLIとSLOを定めてることでエラーバジェットを算出します。このエラーバジェットは信頼性が損なわれてもどれほど許容されるか、その定量的な指標として機能し、エンジニアリグにおける様々な判断に利用されます。

ある意味信頼の残高といえるエラーバジェットを管理してく場合、単純な閾値監視でなく別の観点でエラーなジェットの消費を検知していくことになります。その1つは、Fast　Burn　Rate、そしてもう一つが Slow　Burn　Rateです。

# そもそもSlow Burn Rateとは
Slow Burn Rateは低速バーンアラートと訳され、ある期間におけるエラーバジェットの消費率が緊急性を要するほど消費はしていないが、無視できない状況を検知するための指標です。

特にGoogleのドキュメントではSlow Burn Rateは以下のように説明されています。
>低速バーンアラートは、アラートを発生させないと、コンプライアンス期間の終了前にエラー バジェットを使い切る場合に、消費率についてのアラートを発生させます。低速バーン状態は、急速バーン状態よりも緊急性が低くなります。「今月の予定は少し上回っているが、今のところ大きな問題はない」という状態です。
>
>低速バーンアラートでは、より短期間の消費量のばらつきをならすために、より長いルックバック期間を適用します。
>
>低速バーンアラートでアラートを発するしきい値は、ルックバック期間における理想的なパフォーマンスよりは大きくなりますが、大幅に上回るわけではありません。ルックバック期間が短く、しきい値が高いポリシーは、長期的な消費量が横ばいになってもアラートが多量に発生してしまう可能性があります。しかし、消費量が長期的に高い値を維持した場合、最終的にすべてのエラー バジェットが消費されてしまいます。

https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/alerting-on-budget-burn-rate?hl=ja

このようにエラーバジェットの消費を適切に運用するための手段として、Slow Burn Rateがあることが分かりました。そして、New RelicのSlow Burn Rateは<a href="https://docs.newrelic.com/docs/service-level-management/alerts-slm/">**6時間の期間でエラーバジェットを5%消費した場合**</a>にSlow　Burn　Rateとして検知できます。

# New RelicでSlow Burn Rateをサックと設定する

まず、Slow Burn Rateを設定たいサービスレベルを選択します。下記の例では「Plan Service - Latency」というサービスレベルを選択し、これに対してSlow Burn Rateを設定します。

![スクリーンショット 2024-03-26 18.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820651/424ef1e4-5fbd-38bb-328d-a5c4ac6af2fb.png)

右上「・・・」から「Create an alert」を選択し、次に進みます。

![スクリーンショット 2024-03-26 18.48.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820651/d74ad91c-1334-d069-ea56-bd6e24ec0c33.png)

　「Suggested alert types」から「Slow-burn rate」を選択し、policy設定を済ませた上で「Enable condition」を押し、有効化します。
![スクリーンショット 2024-03-26 18.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820651/6749ce07-3faa-1e2a-b5c3-4062ff8bea99.png)

### 　　　　　　　　　　これで設定は完了です

数ステップでSlow Burn Rateの設定が完了しました。一般的にサービスレベルの計算式は複雑ですが、このようにNew Relicでは簡単に設定できます。

また、もし設定したSlow Burn Rateを確認したい時は該当のサービスレベルから「Alert Conditions」で確認できます。
![スクリーンショット 2024-03-26 19.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820651/475f7da0-e348-f05e-5a54-a7cc91a38db6.png)

New Relicでサービスレベルの設定と監視を簡単に行うことで、本来の業務である信頼性に集中していきましょう。
クラウドサービスを中心とした効果的な英語学習法：生成AIとの併用で学習効果を最大化

## はじめに

英語学習において、クラウドサービスを活用することで効果的に学習を進めることができます。本記事では、主にクラウドサービスを使った英語学習法に焦点を当て、補助的に生成AIを活用するテクニックについても紹介します。

## クラウドサービスを活用した英語学習

### 1. リスニング（Azure Speech Studio活用）

Azureの「Speech Studio」の「音声ギャラリー」機能を使うことで、テキストから音声の出力が可能です。英語圏でもイギリスやカナダ、アメリカ英語の男性、女性と切り替えができるため、多様なアクセントに触れながらシャドーイングの練習をすることができます。

以下ですが実際の設定イメージとなります


![スクリーンショット 2024-03-27 18.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516324/e57ea555-4d7b-f232-c445-2886b8ea3a26.png)

### 2. 発音チェック（Azure Speech Studio活用）

同じくAzureの「Speech Studio」の「音声テキスト変換による発音評価」機能を使って、自分の発音をチェックしてみましょう。発話した内容のスコアリングや、様々な国の発音に合わせたスコアリングが可能です。また、発話した内容を後で音声として聴くこともできるため、自分の発音を客観的に評価できます。

実際のイメージは以下の通りとなります（マイクで発話しております）
![bbb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516324/b1ac775e-0eda-2e63-8fbf-b4093148c0d0.gif)



## 生成AIを使った英語学習の可能性と限界

### 可能性

1. ライティング
  - 生成AIを活用した文章の添削や英文を使ったコミュニケーションが可能。

2. リーディング
  - インターネット上の英語記事を読み、LLMに理解度をチェックしてもらうことで、読解力を向上させられる。

### 限界

1. リアルタイムの英会話が困難
  - マイクからのストリームデータをMP3に変換し、APIを介してLLMで処理する過程でタイムラグが発生するため、リアルタイムの英会話が難しい。

2. 発話した音声の正確性の判定が現状では不可能
  - 2024年3月現在、LLMには発話した音声の正確性を判定する機能は存在しない。

## 具体的な活用例：リーディング（生成AI活用）

気になった英語の記事について、単純に翻訳依頼をしてもらったり、わからない単語ごとに確認したり、自分が想定している日本語文で添削してもらったりすることができます。

## その他の英語学習リソース

Netflix等のストリーミングサービスでは、英語字幕付きの番組が豊富にあり、リスニングスキルの向上に役立ちます。

## おわりに

クラウドサービスを効果的に活用することで、リスニングや発音など、英語学習のさまざまな側面を強化できます。また、補助的に生成AIを活用することで、ライティングやリーディングの学習効果を高めることができます。これらのテクノロジーを上手に取り入れ、継続的に学習することで、英語力の向上が期待できるでしょう。