OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】CRIで音声を制御する（スクリプト）

# CRIとは？

CRIとは、CRI・ミドルウェア株式会社が提供している、
ゲームやマルチメディアコンテンツの開発を支援するための技術とツールの総称です。
本稿では、CRIWAREというツールを使用していきます。

# インストール方法

こちらの [ダウンロードページ](https://game.criware.jp/products/adx-le/) から、Unity向けのプラグインである
「ADX LE Unity SDK(3.10.01)」をダウンロードしましょう。

ダウンロードしたフォルダを展開して、「"cri\unity\plugin\criware_unity_plugin_v2_42_46_le_ja.unitypackage"」
のパスにあるパッケージを自身のプロジェクトにインポートします。

Assetsフォルダ直下に「CRIMW」というフォルダがあればインストール完了です。

# 音声データの準備

UnityでCRIWAREを使用して音声を再生するには、
AtomCraftというツールでビルドされた音声データが必要になります。

「音声のビルド→Unityにインポート→再生」というイメージです。

ビルドの方法は、[こちらの記事](https://qiita.com/GameDevEgg/items/23a042ab43c720786098) で紹介しています。

# 音声のインポート

音声のビルドが終わったら、Unityにインポートしていきます。

「Window→CRIWARE→Atom Browser」の順に開きましょう。

「Atom Browser」下部の「Import Assets from Atom Craft Project」を開き、

「Import From」に、AtomCraftで作成したプロジェクトのAssetsフォルダを指定します。

最後に「Import Assets」ボタンをクリックすれば、音声のインポートは完了です。

# スクリプトで音声を制御する

音声の再生については、[こちらの記事](https://qiita.com/GameDevEgg/items/5c838090cf909f7a1823) で紹介しました。

今回は、再生・停止・再開・終了の4段階による音声の制御をしていきます。

いずれも、対応するメソッドを呼び出す形で実装します。

再生の場合、プレイヤーを作成して再生するだけですが、
停止・再開・終了の3つは**再生済みの音声**に対する処理なのでアプローチが異なります。
具体的には、「CriAtomExPlayback」という再生済みの音声を制御する構造体を用います。
つまり、再生した音声を構造体として保持することで、3つの処理を行います。

再生：CriAtomExPlayer.Start()
停止：CriAtomExPlayback.Pause()
再開：CriAtomExPlayback.Resume()
終了：CriAtomExPlayback.Stop()

この4つの処理をまとめたものが以下のコードです。

```cs
using UnityEngine;
using System;
using System.Collections.Generic;

public class Test : MonoBehaviour
{
    private CriAtomExPlayer _player; // プレイヤー
    private CriAtomExPlayback _playback; // 再生済み音声

    void Start()
    {
        _player = new CriAtomExPlayer();
    }

    // 再生
    public void Play(string cueSheetName, string cueName, float volume)
    {
        var currentAcb = CriAtom.GetAcb(cueSheetName); // Acbを取得
        _player.SetCue(currentAcb, cueName); // キューを設定
        _player.SetVolume(volume * _volume); // ボリュームを設定
        var playback = _player.Start(); // 再生済み音声を取得
    }

    // 停止
    public void Pause()
    {
        _playback.Pause();
    }

    // 再開
    public void Resume()
    {
        _playback.Resume(CriAtomEx.ResumeMode.AllPlayback);
    }

    // 終了
    public void Stop()
    {
        _playback.Stop(false);
    }
}
```
各メソッドを呼び出すことで、コメントの処理が実行されるはずです。
以上が、CRIを用いたスクリプトベースの音声制御でした。
最後までご覧いただきありがとうございました :laughing:
Azure Data Factory のメタデータ駆動のコピータスクにて差分連携時のファイル名を適切に実施する方法

## 概要

Azure Data Factory のメタデータ駆動のコピータスクにて差分連携時のファイル名を適切に実施する方法を共有します。デフォルトで作成すると下記のように`.parquet`などの拡張子の後にウォーターマーク列の値が設定される不思議なファイル名となってしまいます。本記事の手順を実施することで、想定通りに末尾に拡張子を設定できます。

> dboadf_metadata_01.parquet-2024-04-03T00:00:00.000Z-2024-06-01T00:00:00

## 実施手順

### 1. メタデータ駆動コピータスクを作成時に`ファイル名のサフィックス`を空にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7ed88dcc-6e95-92a2-042a-2086c564f864.png)

### 2. `DeltaLoadOneObject`アクティビティにおけるシンクの`cw_fileName`の末尾にファイル拡張子（例L:`.snappy.parquet`）を追記

```text
@{json(item().SinkObjectSettings).fileName}-@{json(item().DataLoadingBehaviorSettings).watermarkColumnStartValue}-@{activity('GetMaxWatermarkValue').output.firstRow.CurrentMaxWaterMarkColumnValue}.snappy.parquet
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/728ce8fe-16e7-0ca0-3582-eb8f86891dd8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b434c00a-5017-4615-305d-9ec9443cd4e1.png)

## 動作確認

### 1. パイプラインを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6fac73ad-170f-6c6c-9af3-aff914154e43.png)

### 2. ファイル名が想定となっているを確認

> dboadf_metadata_01-2024-06-01T00:00:00-2024-06-01T00:00:00.snappy.parquet

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/37493747-c31e-16fd-3057-49cbd06f2f95.png)
【Unity】CRIで音を鳴らす（スクリプト）

# CRIとは？

CRIとは、CRI・ミドルウェア株式会社が提供している、
ゲームやマルチメディアコンテンツの開発を支援するための技術とツールの総称です。
本稿では、CRIWAREというツールを使用していきます。

# インストール方法

こちらの [ダウンロードページ](https://game.criware.jp/products/adx-le/) から、Unity向けのプラグインである
「ADX LE Unity SDK(3.10.01)」をダウンロードしましょう。

ダウンロードしたフォルダを展開して、「"cri\unity\plugin\criware_unity_plugin_v2_42_46_le_ja.unitypackage"」
のパスにあるパッケージを自身のプロジェクトにインポートします。

Assetsフォルダ直下に「CRIMW」というフォルダがあればインストール完了です。

# 音声データの準備

UnityでCRIWAREを使用して音声を再生するには、
AtomCraftというツールでビルドされた音声データが必要になります。

「音声のビルド→Unityにインポート→再生」というイメージです。

ビルドの方法は、[こちらの記事](https://qiita.com/GameDevEgg/items/23a042ab43c720786098) で紹介しています。

# 音声のインポート

音声のビルドが終わったら、Unityにインポートしていきます。

「Window→CRIWARE→Atom Browser」の順に開きましょう。

「Atom Browser」下部の「Import Assets from Atom Craft Project」を開き、

「Import From」に、AtomCraftで作成したプロジェクトのAssetsフォルダを指定します。

最後に「Import Assets」ボタンをクリックすれば、音声のインポートは完了です。

# スクリプトで音声を再生する

スクリプトから音声を再生するには、
「プレイヤーを作成→Acbを取得→キューを設定→ボリュームを設定→再生」
という工程が必要になります。

以下のコードを適当なスクリプトにコピペしましょう。

```cs
using UnityEngine;
using System;
using System.Collections.Generic;

public class Test : MonoBehaviour
{
    private CriAtomExPlayer _player; 

    void Start()
    {
        _player = new CriAtomExPlayer(); // プレイヤーを作成
    }

    public void Play(string cueSheetName, string cueName, float volume)
    {
        var currentAcb = CriAtom.GetAcb(cueSheetName); // Acbを取得
        _player.SetCue(currentAcb, cueName); // キューを設定
        _player.SetVolume(volume * _volume); // ボリュームを設定
        player.Start(); // 再生
    }
}
```

コードの処理と工程の対応をコメントしています。
Acbの取得・キューの設定で必要な「キューシート名・キュー名」は、
「Atom Browser」を開いて再生したい音声のものを探しましょう。

ボタンなどからPlayメソッドを呼び出すと音声を再生できるはずです！

最後までご覧いただきありがとうございました :laughing:
ユーザー離脱の原因？「私はロボットではありません」の画像選択はスキップできる

## 誰もが一度はやったことがあるreCAPTCHAの操作
フォームを入力する際によく出てくる「私はロボットではありません」という文言とともに画像パネルを選択するあの~~クソゲー~~操作。

![fe9e66503c5519fde60229058cb5181f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902958/839567b2-caed-6527-337f-0c18aa33308d.jpeg)
参照元：https://dev.classmethod.jp/articles/intro-google-recaptcha/

これは「**reCAPTCHA**」といって、ロボットと人間を区別し、スパムなどのサイバー攻撃を防ぐGoogleのサービスです。
簡単に導入できるので、スパム攻撃を防ぐ手段として、多くのWebページで使われています。

確かにセキュリティー対策は大事ですが、ユーザーからしたら信号機だの車だの映っているパネルをポチポチ選択するのは煩わしいと感じてしまうのも事実。
このわずらわしさは場合によってはユーザー離脱の原因にもなりかねません。

しかし、実はこの操作を完全に廃止することができるのをご存じですか？

## 煩わしいユーザーアクションが不要なreCAPTCHA v3
2009年からGoogleが提供しているreCAPTCHAですが、今は主にv2とv3の2種類が提供されています。

従来のreCAPTCHA v2では、画像パネル選択などのユーザーアクションが必要でしたが、2018年10月から提供されているreCAPTCHA v3では、ユーザーアクションが不要となりました。

v3は、高度な機械学習技術を用いて、ユーザーの行動を分析し、自動的にスパムかどうかを判断しています。
そのため、ユーザーは画像パネル選択などの操作をする必要がなく、ストレスを感じることなくスパム対策の恩恵を受けることができます。

## reCAPTCHA v2からv3への移行方法
reCAPTCHA v2からv3への移行は、以下の手順で行います。
1. [Google reCAPTCHA管理コンソール](https://www.google.com/recaptcha/admin/create)からサイトキーとシークレットキーを取得
2. ソースコード内のreCAPTCHA v2 スクリプトを削除
2. reCAPTCHA v3のスクリプトを埋め込む
## まとめ
もちろんreCAPTCHA v3はv2同様、無料で導入できます。
セキュリティレベルを下げることなくユーザー離脱の原因となる画像ポチポチを省略することができます。
ユーザー離脱を防ぎ、利便性を向上させたいWebサイト運営者は、ぜひreCAPTCHA v3を導入することを検討してみてはいかがでしょう。
【Drupal】Contextual Filter 教材まとめ

Drupal の Contextual Filter って初学者の方、結構登竜門だと思います。
中級者の方でもちょっと苦手意識ある方いませんか？

今回は、理解を深めるための選りすぐりのブログ記事を 5つ 持ってきたのでぜひ学習に活用してください。

## １つ目
https://www.mochiya.ad.jp/blog/drupal_knowledge/detail/views_related-articles_part1

関連ブロックに関する記事です。
Contextual Filter がどんなシチュエーションで活躍するのかを体系的に学ぶことができます。
Part. 1 と Part. 2の 2編構成で、Part. 2では他の重複の制御設定等にも着目しています。

## ２つ目
https://www.studio-umi.jp/blog/7/789

Contextual Filterを扱う際に切っても切り離せない、Relationshipについてもわかりやすく説明してくれています。

初学者目線でわかりやすい記事です。

### 3つ目
https://qiita.com/umekikazuya/items/f541c1dc8f8cad2f584b

すみません。私の記事です。
Contextual Filterって何者なのか。概要を詳しく説明しています。

### 4つ目
https://qiita.com/umekikazuya/items/67ae4cd42922f45ef70b

すみません。こちらも私の記事です。
設定項目についてまとめています。

## 5つ目
https://www.drupal.org/node/1578558

公式ドキュメントです。
なんだかんだ公式が一番理解しやすいですよね。

ブログ記事ってとっつきやすさはあっても個人の見解が入ってしまうので、誤解を生むリスクもあります。

## まとめ
5 記事読めば、きっと便利さが伝わるかと思います。

単なる絞り込みだけでなく、テクニカルな表示制御やデータの抽出・集計にも応用が効きます。

Drupalのサイトビルディングを行うにあたっての、データベースの設計やURL設計クエリパラメータ操作など、視点が変わって来ると思います。
【Swift】ログ出力について

# はじめに
最低限のログ出力について記載していこうと思います。
特別なことは何もやっていませんが、ふと前職でログに顔文字を仕込んでいたエンジニアのことを思い出したので、この記事を書こうと思いました。
※どんなことがあっても、例えばデバッグ中の一時的なログだったとしても顔文字なんかはログ出力しないでくださいw 

前提は以下の通り
・Mac OS	Sonoma 14.5
・Xcode	15.4
・使用言語	Swift (バージョンは5)

# 最低限出力するログ
・クラス名
```
String(describing: type(of: self))
```

・メソッド名
```
#function
```

・ログ出力する行数
```
#line
```

・変数の中身をログ出力
```
\(変数名)
```

上記をメソッドにまとめると、例えば以下のような感じになる
```
    private func logMethod(logParam: String) {
        let logger = Logger()
        logger.log("\(String(describing: type(of: self))): \(#function)[L\(#line)]:  logParam=\(logParam), hogehoge")
    }
```
上記メソッドを実行すると、以下のようにログ出力される。
![スクリーンショット 2024-07-05 1.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/58ca0724-d3f4-c682-e6ef-4df6c4842c7a.png)
![スクリーンショット 2024-07-05 1.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/3a16dd80-c5cb-7d00-56fb-738625aeddb5.png)

共通用のメソッド化して使いやすくすると良いかも。

# 最後に
デバッグ途中のログだと、割と適当にログ出力する文字列を書く人がいます。
ですが、これはやめた方が良いと思っています。

一時的なログとはいえログを追いづらくなって結局自分自身が整理しづらくなるし、
**何よりも第三者に説明するときに適当なログだと恥ずかしいしハッキリ言ってダサいか**とw

そのため、第三者に見せても恥ずかしくない、かつ自分自身が整理しやすいようなログ出力を心がけるようにしましょう、というお話でした。

以上
tailwindcssのui kitサイトからcardだけまとめ

tailwindcssで、ブログコンテンツに、サムネイル画像とタイトルとコンテンツを一纏めのブロックにできるCardが便利すぎて。

サイトのここに欲しいけど、自作で作るのはちょっとシンドいという時に便利なUIキット。

でも毎回UIキットを開いて試して、やっぱりイメージと違うからと別のUIキットを探して…となるので、個人的に使ってみて便利だったCardのみを抜き出してみました。

基本無料で使えるサイトがメインです。

## preline

https://preline.co/docs/card.html

https://preline.co/examples/card-sections.html

prelineのカードはパターンも豊富で使いやすい。サムネイルはcard幅固定。

## pines

https://devdojo.com/pines/docs/card

https://devdojo.com/pines/marketing/blog

パターンは少ないけど、ui kit自体が使いやすくベースにする場合も多いので。Blogページは有料コンテンツだけど、Cardのレイアウトの参考に。

## HyperUI

https://www.hyperui.dev/components/marketing/blog-cards

https://www.hyperui.dev/components/marketing/cards

https://www.hyperui.dev/components/application-ui/media

CardとBlog Cardが分かれていて、どちらもデザインが良くて使いやすい。サムネイルの位置を調整する際にはMedia Componentsが最強ツールになります。

## Wickedblocks

https://www.wickedblocks.dev/?group=card

Cardのリストレイアウトが検索結果などにとても参考になります。とくに縦のリストの例がありがたい。

## Meraki UI

https://merakiui.com/components/application-ui/cards

ちょっとCardからサムネイルがはみ出していたりとデザイン性高めが多いです。使いどころはその分難しい。

## tailwind-kit

https://www.tailwind-kit.com/components/blog

タグやカテゴリーを入れた場合などステップごとに分かれていて、ブログページのCardレイアウトにおすすめ。

## tailblocks.cc

https://tailblocks.cc/

もはや全部Cardに見える。

## Sailboart UI

https://sailboatui.com/docs/components/card/

Simple、With photo、Background、With Listの４種。どれも実践志向でありがたい。

## TailwindFlex

https://tailwindflex.com/tag/card

まとめ的な。個性的なものも多いけど、この中から探すのはかなり大変。どうしても見つからない時に。

## burnworks

https://ui.burnworks.com/contentscard/

日本語ウェブサイトに最適化されたUIライブラリ。企業サイトに採用するとカッチリハマります。

# まとめ

迷ったらバーっと広げて、気になるものだけをピックアップしてみると自分のほしかったものがわかるかも。

結局、最後に調整しても気に入らず、オリジナルで作ることになることも多いですが、ヒントにはなるはず。

サイトによっては追加のJSライブラリが必要なので、使うときはライセンスとInstallationを見ましょう。

# 参考

https://qiita.com/Masahiro111/items/f7d6ad8280ae92717f0f
【SQL】条件に応じたデータ処理/SQLマスターへの道「WHEN/CASE」

## 導入

SQL文で複雑な条件に対応できる式、`WHEN/CASE` を紹介します。

- データの属性に応じて異なる処理を行いたい時
- 条件に依って、ソートキーを変えたい時

と、SQLクエリへの柔軟性を向上させることができます。

## **WHEN/CASEの基本**
CASE式は、分岐ロジックを提供してくれます。

具体例を見たほうが早いと思いますので、ぜひご覧ください。

## 実践① ~ 得点に応じてラベルの割当
テストで90点Overの人は「Excellent」、60点以下の人は「赤点だよ」のラベル表示をしてみます。
（高専の赤点は60点でした。）

### サンプルデータ

| student_id | name | score |
| --- | --- | --- |
| 1 | Alice | 88 |
| 2 | Bob | 92 |
| 3 | Carol | 67 |
| 4 | Dave | 85 |
| 5 | Eve | 58 |

### SQL文

```sql
SELECT student_id, name, score,
       CASE
         WHEN score >= 90 THEN 'Excellent'
         WHEN score >= 80 THEN 'Good'
         WHEN score >= 60 THEN 'Average'
         ELSE '赤点だよ'
       END AS performance
FROM Students;
```

### 結果
| student_id | name  | score | performance |
| ---------- | ----- | ----- | ----------- |
| 1          | Alice | 88    | Good        |
| 2          | Bob   | 92    | Excellent   |
| 3          | Carol | 67    | Average     |
| 4          | Dave  | 85    | Good        |
| 5          | Eve   | 58    | 赤点だよ     |

### 解説
なんとなくイメージはつきましたか？
スコア値に応じて、ラベル名の表示を変更する分岐ロジックを実装してみました。

## 実践② ~ 従業員の区分に応じて給与計算
従業員テーブルから区分に応じて、給与の増減を計算してみます。
管理職は給与を10%増、一般職はそのまま、インターンは20%減で処理を行います。

### サンプルデータ

| employee_id | name | position | salary |
| --- | --- | --- | --- |
| 1 | Alice | Manager | 5000 |
| 2 | Bob | Staff | 3000 |
| 3 | Carol | Intern | 2000 |
| 4 | Dave | Staff | 3200 |
| 5 | Eve | Manager | 5500 |

### SQL文

```sql
SELECT name, position, salary,
       CASE
         WHEN position = 'Manager' THEN salary * 1.10
         WHEN position = 'Staff' THEN salary
         WHEN position = 'Intern' THEN salary * 0.80
         ELSE salary
       END AS adjusted_salary
FROM Employees;
```

### 結果

| name | position | salary | adjusted_salary |
| --- | --- | --- | --- |
| Alice | Manager | 5000 | 5500 |
| Bob | Staff | 3000 | 3000 |
| Carol | Intern | 2000 | 1600 |
| Dave | Staff | 3200 | 3200 |
| Eve | Manager | 5500 | 6050 |

### 解説
いかがですか？データの属性に応じて柔軟に処理を変えることができます。

## 実践③ ~ 在庫管理システムログの入力
INSERT文でもやってみましょう。
締め作業で、製品の在庫状況をログに入力するタスクがあると想定してください。

商品数の在庫数に応じて、「適切」or「在庫不足」の入力をしてみましょう。

### サンプルデータ

#### 製品テーブル

| product_id | name | quantity |
| --- | --- | --- |
| 101 | 製品 A | 75 |
| 102 | 製品 B | 40 |
| 103 | 製品 C | 55 |

#### ログテーブル（入力用）

| log_id | product_id | log_description |
| --- | --- | --- |

### SQL

```sql
INSERT INTO ProductLogs (product_id, log_description)
SELECT product_id,
       CASE
         WHEN quantity > 50 THEN '適切'
         ELSE '在庫不足'
       END
FROM Products
WHERE product_id IN (101, 102, 103);
```

### 結果
| log_id | product_id | log_description |
| --- | --- | --- |
| 1 | 101 | 適切 |
| 2 | 102 | 在庫不足 |
| 3 | 103 | 適切 |

## まとめ
今回は、`WHEN`/`CASE`を使ってSQL文での条件分岐ロジックについて触れてみました。

## ちなみに...。
条件付きソートの要件に対応する記事も書いています。
こちらもぜひ。

https://qiita.com/umekikazuya/items/a0132b6ac5123002932e
【Python】OpenCVを使った顔検出アプリの作成手順

![2024-07-05 1.05の画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806587/d542323f-44d1-c2a2-eadf-070253a7bc0f.jpeg)

## はじめに
この記事では、macOSでOpenCVを使用してWebカメラから顔を検出するアプリの作成手順を説明します。Python仮想環境の設定から、必要なライブラリのインストール、顔検出スクリプトの作成までをカバーします。

## 前提条件
- macOSがインストールされていること
- Homebrewがインストールされていること
- Pythonがインストールされていること

## Homebrewの確認とPythonのインストール

### Homebrewの確認

まず、Homebrewがインストールされていることを確認します。ターミナルで以下のコマンドを実行してください。

```bash
brew --version
```

Homebrewがインストールされていない場合は、以下のコマンドを実行してインストールします。

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

### Pythonのインストール

Homebrewを使用してPythonをインストールします。

```bash
brew install python
```

### Pythonとpipのバージョン確認

正しくインストールされたか確認します。

```bash
python3 --version
pip3 --version
```

## プロジェクトディレクトリの作成と仮想環境の設定

### プロジェクトディレクトリの作成

デスクトップにプロジェクトディレクトリを作成します。

```bash
cd ~/Desktop
mkdir face_detection_project
cd face_detection_project
```

### 仮想環境の作成

Python仮想環境を作成します。

```bash
python3 -m venv venv
```

### 仮想環境のアクティベート

仮想環境をアクティベートします。

```bash
source venv/bin/activate
```

ターミナルのプロンプトが変わり、仮想環境がアクティベートされていることが確認できます。

## 必要なライブラリのインストール

仮想環境がアクティベートされた状態で、OpenCVとnumpyをインストールします。

```bash
pip install opencv-python numpy
```

## 顔検出スクリプトの作成

プロジェクトディレクトリ内に`face_detection.py`ファイルを作成し、以下のコードを貼り付けます。

```python
import cv2

def detect_faces():
    # カスケード分類器のファイルパス
    cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
    face_cascade = cv2.CascadeClassifier(cascade_path)

    # カメラキャプチャを開始
    cap = cv2.VideoCapture(0)

    while True:
        # フレームをキャプチャ
        ret, frame = cap.read()
        if not ret:
            print("Failed to grab frame")
            break

        # グレースケールに変換
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 顔を検出
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

        # 検出した顔に四角を描画
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

        # フレームを表示
        cv2.imshow('Face Detection', frame)

        # 'q'キーで終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # リリースとウィンドウの破棄
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect_faces()
```

## スクリプトの実行

仮想環境がアクティベートされた状態で、以下のコマンドを実行してスクリプトを実行します。

```bash
python face_detection.py
```

これでWebカメラが起動し、顔を検出して四角で囲むウィンドウが表示されるはずです。`q`キーを押すとプログラムが終了します。

## トラブルシューティング

### カメラアクセスの許可

macOSでは、アプリケーションがカメラにアクセスするための許可が必要です。システム設定で以下の手順を行ってください。

1. **システム設定**を開く
2. **セキュリティとプライバシー**を選択
3. **プライバシー**タブで**カメラ**を選択
4. Pythonまたはターミナルにカメラアクセスを許可

カメラのアクセス権限をリセットするには、以下のコマンドを実行します。

```bash
tccutil reset Camera
```

再度Pythonスクリプトを実行し、カメラアクセスの許可を求めるプロンプトが表示されることを確認します。

## おわりに

以上で、OpenCVを使った顔検出アプリの作成手順の説明は終了です。この手順を参考にして、顔検出アプリを作成してみてください。何か質問があれば、コメントでお知らせください。

この記事が参考になったら、ぜひフォローして、いいねをお願いします！
量子エンジニア(アニーリング式)勉強会メモ #3

量子エンジニア(アニーリング式)第3回の勉強会メモです。第1回、第2回のメモは以下。

https://qiita.com/y-vectorfield/items/25b2ac76dbf3a0f6e923

https://qiita.com/y-vectorfield/items/bf50b135cd07b238e28a

# 方程式制約

```math
x_0 + x_1 + x_2 = 3
```

```math
x_0 + x_1 + x_2 - 3 = 0
```

```python
H = 0
H += (q[0] + q[1] + q[2] - 3)**2
```

# 報酬とペナルティ

## 2個の量子ビットが同時に1になったら報酬

```python
H = 0
H += -(q[0]*q[1])
```

## 2個の量子ビットが同時に1になったらペナルティ

```python
H = 0
H += (q[0]*q[1])
```

# Reference
https://github.com/tytansdk/tytan_tutorial
[Rails] Rspec_uninitialized constantになったら、described_classを見直す！？

# はじめに
先日、以下の現象が起きました。

・・・

今回の`rspec`の内容です。
- `describe`に`it`ブロックを複数定義
- `subject`で、インスタンスを作成する処理をしている
- そのインスタンスが返す値をテストしている

```rb
RSpec.describe 'PostShortcode' do
  subject { TestPost::Shortcode::PostShortcode.new(params) }

  ...

  it 'hoge' do
    expect(subject.hoge).to eq 'hoge'
  end

  it 'fuga' do
    expect(subject.fuga).to eq 'fuga'
  end
```

上記で実行すると、なぜか**2回目以降**の`it`の時に、`NameError: uninitialized constant`が発生します。

```sh
NameError:
       uninitialized constant TestPost::Shortcode::PostShortcode
```

1回目の`it`は、テスト成功します。
**2回目以降**が、必ず失敗してしまいます...。定義はしているはずなのに...。

今回は、その解決方法をアウトプットいたします。

# 解決方法
`.new`するクラスを、`RSpec.describe`で記載をして、`described_class`を使用するようにしましょう。

```rb
RSpec.describe TestPost::Shortcode::PostShortcode do
  subject { described_class.new(params) }
```

`described_class`を使用すると、`RSpec.describe`直後に記載しているクラスを参照してくれます。

ただ、なぜこれで解決したかは謎のままです...。

# まとめ
`described_class`を指定すれば、記載したクラス名を参照してくれるので、シンプルにテストを書くことができます。
ただ、それが今回の解決に繋がったのかは謎のままなので、分かり次第追記していこうと思います。

最後までご覧いただき、ありがとうございました。

# 参考文献
https://qiita.com/mightysosuke/items/c7c00dcbaae3ba5f6734
LLVM IRの勉強メモ #3

個人的な学習メモです。

### グローバル変数に関する種々のルール[^1]

- グローバル変数はコンパイル時に割り当てられるメモリ領域を定義する。定義は初期化される必要がある

```txt
@G = external global i32
```

- グローバル変数はオプションでリンケージタイプを指定できる。また、定義または宣言のいずれかに、配置するセクション、アラインメントを指定することができる
- 変数が決して変更されない場合はグローバル定数として定義することができる。グローバル定数は最適化が容易になるほか、実行ファイルの読み取り専用セクションにグローバルデータを置くことができるなどの利点がある
- LLVMではグローバル変数の最終的な定義が変数でなくても、言語定義上保証できる場合は、その宣言を明示的に定数とすることができる
- グローバル変数のアドレスが重要ではない場合に`unnamed_addr`属性をつけることができる。この変数は同じイニシャライザをもつ他の変数とマージすることができることを示している。同様に`local_unnamed_addr`はモジュール内でアドレスが重要ではないことを示す属性である

```txt
define i32 @main() local_unnamed_addr #0 {...}
```

- LLVMではグローバル値に明示的なセクションを指定することができる。ターゲットがこれをサポートする場合、指定されたセクションにグローバル値が発行されることになる
- 外部宣言には、明示的にセクションを指定することができる。セクション情報は、この情報を使用するターゲットのためLLVM IRに保持される
- 2のべき乗の明示的なアラインメントをグローバル変数に指定できる
以下の例はアドレススペースと初期値、セクション、アラインメントを明示したグローバル変数

```txt
@G = addrspace(5) constant float 1.0, section "foo", align 4
```

- LLVMではグローバル値に対して明示的なコードモデルを指定できる

```txt
@G = internal global i32 0, code_model "large"
```

- デフォルトでは、モジュール内で定義されたグローバル変数は変更されないと仮定して、グローバルイニシャライザが最適化される。これは、外部リンクのある変数や@llvm.used変数など、モジュール外からアクセスできる可能性のある変数でも同様である
- グローバル値は、コンパイル時にそのサイズが不明なため、スケーラブルベクターを含めることができない。スケーラブルベクターは構造体の中で使用することができる

[^1]: https://llvm.org/docs/LangRef.html#global-variables
ElastiCacheの新UI(2023)を使ってFargateのコンテナからRedisに接続する方法

結論から申し上げると下記のドキュメントがとても参考になりました。
https://aws.amazon.com/jp/blogs/news/amazon-elasticache-serverless-for-redis-and-memcached-now-generally-available/

## はじめに
ElastiCacheに初めて触るとなると、過去のElastiCacheのハンズオン動画などから見始めて理解を進めていくのが一つの定石だと思いますが、つい半年前にElastiCacheのUIと機能が大々的に変更されたことで、新規でElastiCacheを使おうとする方は逆に導入が大変な時期なのではないかと思います。

たとえば以前ElastiCacheのクラスター作成と呼ばれていたものが、現在だとRedis OSS　キャッシュを作成というものに変わっていたり、以前はノード数なるものを設定していたのが、現在だとノードの指定項目がそもそもRedisOSSキャッシュでは見つかりません。

Redisへの接続も(最新verなら)以前使っていたコマンドが使用できなくなっています。

今回はElastiCacheを使ったRedisにFargateのコンテナからRedisに接続する方法をまとめます。
セキュリティグループ周りはあまり説明しないのでご容赦ください。

## ElastiCacheとは？
ElastiCacheについてそもそもまだよくわからないという方は「イラストで理解するElastiCache」という下記のZenn記事が数ある中でとてもわかりやすいためおすすめです。
https://zenn.dev/fdnsy/articles/6dd98ba5318bb6

### ズバリ新ElastiCacheの注意点
注意点であり僕が沼ったところなのですが、「redis-cliを使ったRedisに接続する際のコマンド」が気をつけるポイントです。

普通は作成したElastiCacheのRedisエンドポイントを使って接続テストを実施しますが、新ElastiCacheでは--tlsオプションをつけなければ正常にログインできません。

``` before. 
redis-cli -h Redisエンドポイント -p 6379
```
``` after.
redis-cli -h Redisエンドポイント --tls -p 6379
```
え？これだけ？と思われるかもしれませんが、ここでミスると基本的にセキュリティグループが間違っているのかとか、エンドポイントが間違っているのかとか、ネットワーク周りのミスだと思って確認にかなり時間が取られちゃうんですよね。

## ElastiCacheの作成
1. サービス検索欄から「ElastiCache」を検索
1. リソースのRedis OSS キャッシュをクリック
1. Redis OSS キャッシュを作成をクリック
    1. 設定のデプロイオプションはサーバーレス
    1. 作成方法は新しいキャッシュ
    1. 任意の名前を作成(ElastiCache-Redisなど)
    1. デフォルト設定タブを開きデフォルト設定をカスタマイズ
        1. VPCを選択
        1. AZからプライベートサブネットのものを全て選択
    1. セキュリティ設定をカスタマイズ
        1. 管理ボタンをクリックして作成しておいたSGを選択。これはインバウンドルールが接続したいECSコンテナのSGをソースとしておきます。
    1. その他はデフォルトの設定で大丈夫です。

## Redisへの接続手順
1.作成したコンテナにコンソールからログインします。(その前にAWSへのログインは済ませておいてください。)
```
$ aws ecs execute-command --region [リージョン名] --cluster [クラスタ名] --task [タスクID] --container [コンテナ名] --interactive --command "/bin/sh"
```
2.次にredis-cliをインストールします。
```
# apt-get update
# apt-get install -y redis-tools
```
3.バージョンを出力して正しくインストールされていることを確認します。
```
# redis-cli --version
redis-cli 7.0.15
```
4.redis-cliを使ってRedisに接続
``` 
# redis-cli -h Redisエンドポイント --tls -p 6379
```
以上です。

## さいごに
いかがでしたでしょうか。ElastiCacheの作成はめちゃめちゃ簡単なのですが　、ドキュメントが少なく僕はここでハマってしまいました...。
もっと詳しく知りたい方は冒頭で示したドキュメントが本当にわかりやすいので、ぜひ読んでみてください。
TypeExpressTutorial - 2

:::note info
やりたいこと
- Dockerを使ってローカル環境でMysqlのDBを起動させる
- Prismaを使ってUsersテーブルを作成する
- データベースの管理アプリであるSecuelAceを使ってアクセスできる
:::

<details><summary>全体像</summary>

1. [プロジェクト作成](https://qiita.com/yk-graph/items/b5f0551cb368fb86c50c)
1. [DB構築 - Mysql + prisma](https://qiita.com/yk-graph/items/02333bd99b625dbcc49d)
1. [環境変数設定](https://qiita.com/yk-graph/items/e37cd011c6da3feb93d2)
1. [API設定 - 簡略版](https://qiita.com/yk-graph/items/e5b52a4d35cd43d95f7a)
1. [ユーザー登録とログイン](https://qiita.com/yk-graph/items/dd093a286377843441e1)
1. [カスタムエラーハンドリング](https://qiita.com/yk-graph/items/fb47753e55986bafdb1d)
1. [バリデーション - zod](https://qiita.com/yk-graph/items/84214e03a6119523ac18)
1. [8](https://qiita.com/yk-graph/items/b5f0551cb368fb86c50c)
1. [9](https://qiita.com/yk-graph/items/b5f0551cb368fb86c50c)
1. [10](https://qiita.com/yk-graph/items/b5f0551cb368fb86c50c)
1. [11](https://qiita.com/yk-graph/items/b5f0551cb368fb86c50c)
1. [12](https://qiita.com/yk-graph/items/b5f0551cb368fb86c50c)
</details>


## docker-compose で Mysqlを起動
ルートディレクトリにファイル作成
```yaml:docker-compose.yml
version: '3.9'

services:
  db:
    image: mysql:8.0
    platform: linux/amd64 # M1 Macの場合はplatformをlinux/amd64に指定する
    container_name: type-express-db
    ports:
      - 3306:3306
    volumes:
      - mysql:/var/lib/mysql # ボリューム領域を指定 ※ボリュームの指定 -> {ボリューム名}:{コンテナ内の絶対パス}
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: type-express-db

volumes:
  mysql:
```

```zsh
$ docker compose up -d db
```

## prismaの導入
```zsh
$ npm install prisma @prisma/client

$ npx prisma init --datasource-provider mysql
```

```.env
DATABASE_URL="mysql://root:password@localhost:3306/type-express-db" // <- 追記
```

## UsersテーブルのSchemaの設定
`prisma/schema.prisma` のファイルに Userテーブル の Schema を追記

```prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String
  password  String

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@map("users")
}
```

## マイグレーション
```zsh
$ npx prisma migrate dev --name CreateUsersTable
```

## SecuelAceを使って接続を確認
![スクリーンショット 2024-07-06 16.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472343/9c556230-6bee-e862-941c-957fedbd1f43.png)

- `TCP/IP` を選択
- Name : 何でもOKです。適用な文字列を入力してください
- Host : 127.0.0.1
- Username : docker-compose.yml内で特にしてしていない場合は、 `root` と記述します
- Password : docker-compose.yml内で指定したパスワード（今回の場合だったら `password` と記述します）
- Database : docker-compose.yml内で指定したデータベース名（今回の場合だったら `type-express-db` と記述します）
- Port : 特に記述なしでOKです
- Connect ボタンをクリック
[Azure] Fluid Relay - Fluid Framework Server のマネージドサービス

Azure Fluid Relay が GA されたとのことですが、個人的によく知らなかったので調べてみました。

## はじめに

🤖
> 現代のアプリケーション開発において、リアルタイムのコラボレーション機能は非常に重要です。[Fluid Framework](https://fluidframework.com/) と [Azure Fluid Relay](https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/) は、このニーズを満たすための強力なツールです。

## Fluid Framework の概要

🤖
> Fluid Framework は、Microsoft が開発したオープンソースのライブラリで、リアルタイムの共同編集とデータ同期を実現するための基盤を提供します。このフレームワークは、複数のユーザーが同時にデータを操作できるようにし、高いパフォーマンスとスケーラビリティを誇ります。Fluid Framework の最大の特徴は、データの分散管理と効率的な同期メカニズムにあります。これにより、ユーザーは一貫したデータ体験を享受できるのです。

### 動作やコードのサンプルについて

下記のチュートリアルページが分かりやすいと思います。

https://fluidframework.com/docs/start/tutorial/

ざっくり、下記のような処理ロジックでデータ同期を実現しています。

1. クライアントコードによって、データがローカルにて変更される
1. Fluid ランタイムから Fluid サービスにその変更が送信される
1. Fluid サービスにて操作がシーケンス処理され、すべてのクライアントにブロードキャストされる
1. Fluid ランタイムにより、操作がローカルデータに組み込まれた後 "valueChanged" イベントが発生する
1. クライアントコード側で "valueChanged" イベントを処理する

## Azure Fluid Relay について

Azure Fluid Relay は、Fluid Framework を利用したアプリケーションのためのバックエンド側をサービス (マネージドサービス) として提供するものです。

### 内部は AKS などの Azure サービス群

下図の通り、Azure Fluid Relay は内部で AKS (Azure Kubernetes Service) や Azure Front Door, Azure Cache for Redis, Azure Cosmos DB などを利用しているとのことです。

![](https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/07/a-diagram-of-a-computer-process-description-autom.png)

https://devblogs.microsoft.com/microsoft365dev/fast-and-compliant-routing-in-azure-fluid-relay/

### 主な制約など

* データは[ペアリージョン間で冗長化](https://learn.microsoft.com/ja-jp/azure/reliability/cross-region-replication-azure#azure-paired-regions)
* [リソース作成後はリージョンの変更ができず、リソースの再作成が必要](https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/resources/faq#can-i-move-fluid-relay-resource-between-azure-regions)
* [セッション単位の同時接続数は 100 ユーザーまで](https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/reference/service-limits#fluid-sessions)。用途によっては結構少ない
* [クライアント側でネットワーク断などの際はローカルに蓄積して後で再送は可能だが、本記事執筆時点では猶予は 1 分までと結構厳しい](https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/resources/faq#does-azure-fluid-relay-support-offline-mode)ので、繋がらない場合にはエラー処理などをする方が無難か
* 課金の単位は[「in / out の処理数」や「クライアント単位のコネクション時間」など](https://azure.microsoft.com/ja-jp/pricing/details/fluid-relay/)。サービスの起動時間ではないところは嬉しいかも

https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/reference/service-limits

https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/resources/faq

### ひと通りのチュートリアル

https://learn.microsoft.com/ja-jp/azure/azure-fluid-relay/how-tos/provision-fluid-azure-portal

※上記ページだけではなく「次のステップ」へどんどん進んでいくチュートリアルです。

## おわりに

最近、こういうフレームワークを実現するためのサーバー側のコンポーネントもマネージドサービス側で提供されるケースが多くなってきたなーと感じます。AKS や Azure Container Apps での Dapr 統合も近いと言えば近いかと。

まさに**コードに集中するための周辺機能はできるだけ手間をかけないで済ます**、ですね。

Fluid Framework を使う機会は多いとは言えないかもしれませんが、こういうのがあるんだということは覚えておこうと思います😁
PowerShellで巨大なログファイルの先頭や最終行からn行を確認したいとき

PowerShellで大きなログファイルの一部（先頭や最終行など）を参照する際に。

先頭だったり最終行付近を確認したい事あるかと思います。

何も意識しないでコマンドを実行したりすると意外と処理時間を食う結果になるので紹介。

## 先頭から

Get-Contentのオプションを利用すればOK

```powershell
# Get-Contentでは先頭行から指定行読み込むTotalCountオプションが用意されている
Get-Content -TotalCount 10 -Path .\hugelog.txt

# エイリアスとしてFirstやHeadも用意されている
Get-Content -First 10 -Path .\hugelog.txt
Get-Content -Head 10 -Path .\hugelog.txt

#　Slect-Objectに渡して、Select-Object側のFirstオプションでも先頭か指定行取得できる
Get-Content -Path .\hugelog.txt | Select-Object -First 10
```

## 最終行から

こちらもGet-Contentのオプションを利用すればOK

```powershell
#　Get-Contentには末尾から指定行読み込みオプションとしてTailオプションが用意されている
Get-Content -Tail 10 -Path .\hugelog.txt

# エイリアスとしてLastも用意されている
Get-Content -Last 10 -Path .\hugelog.txt
```

## Get-Content foobar | Select-Object -Last n とすると時間がかかる

先頭行からの所と同様にSelect-Objectに渡してLastオプションで表示しようとすると非常に時間がかかります。

```powershell
#　Select-Object側のLastオプションでも表示できるが、これは遅い
Get-Content -Path .\hugelog.txt | Select-Object -Last 10
```

これはGet-Contenctの部分で先頭からファイルを読んでいってしまっているので、結局の所`Select-Object -Last 10`の部分はファイル全体を読みこんだ後に実行されるからだと思います。

## 総評

いつの間にか当たり前のように利用していましたが、知らないとだいぶ不便な気がします。
Unity 6 PreviewにSentryを入れるとGCが壊れて落ちる

## TL;DR
- Sentryを消したら直った
- ~~IL2CPP周りだけを無効化できれば改善するかもしれないがまだ試していない~~ 追記を参照

## 環境
- Windows 11
- Unity 6000.0.8f1
- sentry-unity 2.1.0
- Scripting Backend: IL2CPP
- C++ Compiler Configuration: Release
- Windows build

## 症状
- Sentryを入れてReleaseビルドを実行するとプロセスの終了時にGC周りでEXCEPTION_ACCESS_VIOLATION_READが出て落ちる
- `il2cpp::gc::GCHandle::GetTarget`でエラーが発生している

## 試したこと
### 改善なし
- Unity 6000.0.2f1まで下げる
- C#からネイティブコードを呼ばないようにする
- SentryのWindows Native Supportのチェックを外す

### 改善あり
- sentry-unityを削除する
- Sentryを無効化する(Enable Sentryからチェックを外す)

## 試していないこと
- UnityのバージョンをLTSなどに下げる
- ~~`IL2CPP line numbers`のチェックを外す(設定項目が見つからず断念)~~ 追記を参照

## 似た事例
- [il2cpp::gc::GCHandle::GetTarget #1442 - getsentry/sentry-unity](https://github.com/getsentry/sentry-unity/issues/1442)

## 追記
- IL2CPP line numbersが隠れていてすこしウィンドウを伸ばしたら見えた。えーっ。
![スクリーンショット 2024-07-05 010317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/907015/44bd228c-9431-d248-94d9-d56421c1d337.png)
![スクリーンショット 2024-07-05 010326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/907015/bca23cae-e68b-f034-79ba-8611a2378518.png)

- IL2CPP line numbersを無効化すると症状が改善。先に記述したissueを読む限り、内部構造が変更されたためエラーの捕捉で失敗するようになったようだ
AtCoder Beginner Contest 325 B - World Meeting を modを使わないで解く

modで折りたたみたくなるが、そのまま右に伸ばしていきます。

https://atcoder.jp/contests/abc325/tasks/abc325_b

入力例1 
```
3
5 0
3 3
2 18
```

# 解説解法
時差0の時間を基準に1時間を1マスとして表して各拠点がミーティングに参加できるコマを緑のマス図示します。入力例1を例にとり図示します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/8d921a03-bd65-b6b7-65d5-28f8259d5e48.png width=50%>
入力`(w, x)`ごとに(xは0が9:00であることを注意して)xを含む9マスが参加可能(緑マス)で`w`人参加可能です。このとき、拠点3のように時差18時間の拠点は18-24時まで塗ったあとに0時に戻って3時まで塗る必要があります。これは解説のように各拠点は`i=[0..8]`に対して`(x+i) % 24`時のマスを塗ればよいです。

```Python
def do():
    n = int(input())
    can = [0] * 24
    for _ in range(n):
        w, x = map(int, input().split())
        for i in range(9, 17+1):
            can[(i+x)%24] += w
    print(max(can))
    #print(can)
```
https://atcoder.jp/contests/abc325/submissions/46798370

# こう考えてもいい
考える時間を24時間ではなく72時間で考え、各拠点の`業務開始から`をスタートとする`2日分`の時間を考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/2de601fe-c9dd-ffc3-5478-7c671d5e2965.png)
各拠点は`i=[0..8]`に対して`(x+i)` および `(x+i+24)` の時のマスを塗ります。`業務開始から`の区間だけを塗っているので拠点3はday0の0-3時の区間参加可能ですが塗られていません。ですが、18-27時を塗ったことでday1の0-3時は塗られました。

```Python
n = int(input())
ret = [0] * 72 # 72時間分考える
for _ in range(n):
  w, x = map(int, input().split())
  for i in range(9, 18): # 9-17時スタート
    ret[i + x] += w      # 開始が含まれるday1
    ret[i + x + 24] += w # 開始が含まれるday2
print(max(ret))
```

https://atcoder.jp/contests/abc325/submissions/46878790
Dataikuで加工したものをTableauで可視化させたい。Dataiku編

# 1.やりたいこと。

Kaggleで、HandMのデータがありまして、そちらのデータを使って
直近一週間で売れたアイテムをTableauで可視化させると言うものです。

Transformのツールには『Dataiku』と言うものを使っていきたいと思います。


# 2.データの読み込み

本当は、SnowFlakeの元テーブルをDataikuと接続して
実行エンジン・データはSnowflakeにしたかったのですが、

プロジェクトのデータソースにSnowflakeを選ぶためにはEnterprise Editionじゃないとダメだそう。

致し方なく、今回は、ローカルサーバーのDataikuにデータを読み込ませて
前処理をしていきたいと思います。

Customerテーブルもありますが、一旦は

Transactionテーブルと
Articleテーブルを使っていきたいと思います。

# 3.データの抽出

Transactionテーブルは都度インサートされる想定です。
そのため、まずは直近のデータを抽出してから結合をしないとえらい効率が悪いので、

レシピの中の『Top N』と言うもので、7日前までの値を取ってきます。

数字とどの列に対してのTop Nなのかを選択すれば、加工されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/ff354676-f651-80e1-504a-43a2a12893af.png)

次はジョインです。レシピの中にJoinと言うものがあるので、それを選択します。
もし、テーブルのカラム名が恐らく一致していれば以下のように自動的に選択されます。

マッチしないカラムについてはドロップされるという表記もありますね。
今回の場合は、売れたアイテムを正確に知りたいので、マッチしないものは削除でOKです。

左下の『RUN』を記述すると、実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/45ddfeeb-fa23-130f-9e2f-c7a91800e61e.png)

特段DBでの処理ではなく、ローカルサーバーでの処理なので

最終的な出力はCSVとします。


。。。
んー遅い。待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/3ee485d9-a723-ce0b-fc01-83b6a5904a41.png)



終わった！ローカルなんで、直近7日といえども6minかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/de15829b-cf21-de3c-b8a1-0bd81f5618b9.png)

# 4.処理の自動化

一旦Tableauに移る前に。。。

これ一週間手動でやるのもいいですが
できるならCronみたいなので自動化させたいですね。

Dataikuの公式のknowledgeに記載されていますが、ライセンスがないからか
私の内部では設定ができませんでした。
やってみたい

https://knowledge.dataiku.com/latest/mlops-o16n/automation/tutorial-scenarios.html#add-steps-to-a-scenario

日本語のQAもありました。

https://community.dataiku.com/discussion/41209/%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B7%E3%83%94%E3%82%92%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95


Tableauのビジュアライズは、一旦今度の投稿で。
【Xcode】Playgroundについて

# はじめに
Playgroundについて触りの部分だけ紹介し、iOSアプリの開発に少しでも役立てる記事を書いていきます。

※この記事ではアプリとしてのPlaygroundの紹介はしません。
　あくまでXcode上でplaygroundファイルを作成し、どのようなことができるかについてフォーカスした記事となります。

 # playgroundファイルの作成
 Xcodeを起動し、MenuのFile > New > Playground...　を選択
 ![スクリーンショット 2024-07-05 0.24.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/7853b5e8-4356-e6a0-121a-0b9fe02e75d6.png)

そうするとテンプレート選択画面に遷移するので、ひとまずBlankを選択
![スクリーンショット 2024-07-05 0.32.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/9de41551-8f31-5bbc-e126-21f724d7d857.png)

# なにができるの？
プログラムの実行結果をすぐに確認することができます。
実行速度も非常に速いです。

例えば簡単にログ出力プログラムを作成し、実行した結果が以下とのなります。
![スクリーンショット 2024-07-05 0.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/49d7d6f7-d540-8612-7b6c-ab9348db7aee.png)

他にもplaygroundファイルにメソッドを作成し、メソッドの実行結果を確認することも容易にできます。
![スクリーンショット 2024-07-05 0.37.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/e1c07f3a-76ba-0547-5421-fe2de6f22d97.png)

また、テンプレートのGameやMapを選択すると分かりますが、
playgroundファイル内にクラスを作成し、クラスの実行結果も確認することができます。
以下ScreenShotのように描画系の動作確認も可能で、非常に確認できる範囲が広いです。
(以下はテンプレートのMapを選択し、実行した結果)
![スクリーンショット 2024-07-05 0.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/10ad85c4-c278-cb2b-e12d-0f8300caefa4.png)

# 最後に
playgroundを上手く活用し、iOSアプリ開発を効率良くこなしましょう。
法人向け生成AIサービスChatSense

# はじめに

ChatGPTを直接契約するのではなく、企業向け生成AIを使うメリットには、データのセキュリティ強化、業務効率化、カスタマイズ性の向上があります。
専門的な知識を持っていない、自社向けにカスタマイズする人員の余裕がないなどの理由からこういったサービスを活用することを検討しています。

# ChatSense

https://chatsense.jp/

ChatSenseは企業や自治体向けの法人専用ChatGPTサービスです。セキュリティ強化を重視し、データ流出防止やID一括管理、シングルサインオン（SSO）などの機能を提供します。データはAIの学習に使用されず、利用状況の可視化や独自プロンプトの共有も可能です。料金プランは、スターター（無料）からビジネス、エンタープライズまであり、企業の規模やニーズに応じて柔軟に対応します。

- 学習に利用されない
- プロンプトを共有できる
- 社内データを学習したオリジナルAIを作成可能
- 企業向けの様々な機能がある
- 導入実績、300社以上

## スタータープラン

回数制限はあるものの無料でお試しできるのはいいですね。良心的。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/9be21c6c-8879-01cf-0494-c29b2e093e6e.png)

## ビジネスプラン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/0c21973d-4317-3a5f-684e-5725382b647f.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/ba32ffe0-598d-1859-af81-1bf9a5de57c6.png)

## エンタープライズプラン

かなり内容が充実していていいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/29092f69-61ea-427d-d5ea-7faa5b1754f5.png)

# 検討するポイント

何を重視するかは各社異なると思いますが、個人的には以下かなと思いました。

・自社データを学習したチャットボットの作成
・業務自動化、チームでのナレッジ共有
・管理しやすいこと
・コストが明確であること
・最新の機能が使えるかどうか
・技術サポートの有無

# おわり

カスタマイズの費用次第なところもありますが、概ね良さそうな印象でした。
企業向け生成AIサービスも増えてきていて、比較検討するのに時間が掛かりますが
引き続き調査したいと思います。
railsでアプリケーション情報の表示するコマンド

## はじめに
あれ？このシステムのrailsのバージョンってなんだっけってことよくありますよね。
Gemfileを見れば分かりますが、わざわざファイルを見に行かなくてもrails,rubyのバージョンを知ることができるコマンドを見つけました。

## アプリケーション情報の表示するコマンド
rails aboutというコマンドを打つだけでrails,rubyのバージョンを知ることができます。
開発メンバーで同じ環境を使えているか確認する際などに使えそうですね。
```sh
$ rails about

About your application's environment
Rails version      7.1.3.3
Ruby version       ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]
RubyGems version   3.5.9
Rack version       3.0.11
Middleware         ActionDispatch::HostAuthorization, Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActionDispatch::ServerTiming, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::ActionableExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ContentSecurityPolicy::Middleware, ActionDispatch::PermissionsPolicy::Middleware, Rack::Head, Rack::ConditionalGet, Rack::ETag, Rack::TempfileReaper
Application root   /app
Environment        development
```
仮想コンテナでRISC-Vのエミュレート

RISC-Vの本を買ったので、自宅のIntelマシンにエミュレート環境を作ることにしました。

CPU: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
OS: Ubuntu 22.04

### ホストの設定：QEMUのインストール

今回もQEMUで仮想コンテナを動かすことにしました。
ホストにQEMUのパッケージをインストールします。

```console
$ apt install -y qemu-user-static
```

qemu-riscv64がenabledになっていることを確認します。

```console
$ cat /proc/sys/fs/binfmt_misc/qemu-riscv64
enabled
interpreter /usr/libexec/qemu-binfmt/riscv64-binfmt-P
flags: POCF
offset 0
magic 7f454c460201010000000000000000000200f300
mask ffffffffffffff00fffffffffffffffffeffffff
```

### コンテナの起動と動作確認

イメージは[riscv64/ubuntu](https://hub.docker.com/r/riscv64/ubuntu)を使うことにしました。

```console
$ docker run -it riscv64/ubuntu:22.04 /bin/bash
```

これで、QEMUエミュレートのRISC-V仮想コンテナができました。
RISC-VのGNUコンパイラ(GCC)は通常の`apt`でインストールできます。

```
$ apt install -y gcc
```

試しに以下のコードをコンパイルしてみます。

```c
# a.c
#include <stdio.h>
int main(void) {
  printf("Hello RISC-V!\n");
  return 0;
}
```

```console
$ gcc -O2 a.c
```

実行バイナリがRISC-Vに対応していることがわかります。

```console
$ objdump -d a.out | grep format
a.out:     file format elf64-littleriscv
```

実行もできました。

```console
$ ./a.out 
Hello RISC-V!
```
Athenaでデータを取得しようとしたらパーティションスキーマーエラ「HIVE_PARTITION_SCHEMA_MISMATC」がでた

# 問題
タイトルの通りAWSのAthenaでデータを取得しようとしたら下記のエラーが発生。
```
HIVE_PARTITION_SCHEMA_MISMATCH: There is a mismatch between the table and partition schemas. The types are incompatible and cannot be coerced. The column 'col1' in table 'database_name.table_name' is declared as type 'bigint', but partition 'partition1=aaa/partition2=bbb' declared column 'col1' as type 'struct<long:bigint,string:string>'.
```
テーブルのスキーマのパーティションのスキーマが一致しないとエラーが出ていました。
csvファイルのcol1列が文字列の時と数値の時があったため今回の問題が起きました。
データを入れなおしてCrawlerを実行すれば直ると思っていましたがエラーが出たままでした。

# 解決策
正しい形式でデータを上書きしているのであればパーティションを一度消して再生成すれば直る。
```sql
-- パーティションを削除
ALTER TABLE table_name DROP PARTITION (partition1 = 'aaa', partition2 = 'bbb');

-- パーティションを再生成
MSCK REPAIR TABLE table_name;
```

# おわりに
今回の問題が発生してはじめてパーティションごとにもスキーマを管理しているということを知りました。
テーブルでスキーマ管理しているのに何で必要なんでしょうか...
Glueに関しては、まだまだ分からないことばかりですが少しずつ理解を深めていければと思います。
JSTQB Foundation Levelを受けてみた

# 経緯
こんばんは。OREOです。
直近1年間は主にモバイルアプリ開発の業務に携わっていましたが, 今年はQA関連の業務にも従事する機会が増えてきました。業務を遂行するにあたり, テストに関する体系的な知識を身につけたいと考え, JSTQBの勉強を始めました。
# JSTQBとは
公式サイトより引用
>JSTQBとは、日本におけるソフトウェアテスト技術者資格認定の運営組織で、 各国のテスト技術者認定組織が参加しているISTQB（International Software Testing Qualifications Board）の加盟組織として2005年4月に認定されています。
ISTQBの加盟組織の各国団体は資格および教育・訓練組織認証について相互認証を行っています。つまり、JSTQBが運営するソフトウェアテスト技術者資格は海外でも有効な資格となっています。
>JSTQBは次のような3つの委員会（Commitee）から構成されています。 それぞれの委員会は国内における品質保証関連の研究を行っている研究者、高いスキルを持つテストエンジニアやコンサルタントなどを中心に構成されています。

https://jstqb.jp/committee.html


つまりはソフトウェアテスト技術者向けの国際認定資格のようなものです。テストコンサルを行っている企業では営業の方も含め社員が全員取得していることもある資格です。直近2024年度の合格率は70.06%と非常に高めです。

https://www.juse.or.jp/sqip/qualification/jstqb/result.html#fl32


# 勉強方法
JSTQBの勉強を始めようと持ったタイミングで上司よりこちらの研修を紹介されたので, まず初めにこちらを受講しました。

[JSTQB認定　ソフトウェアテスト技術者 ― Foundation Levelトレーニングコース](https://www.juse.or.jp/src/seminar/detail/99/29070)

講義はシラバスに沿った形式で進められ, テストで問われるポイントや演習も含まれており非常に有用な内容でした。また講義の中で日々のQA業務に関する質問の時間も設けられており, 豊富なQA経験を持つ講師に相談する機会もありました。
3日間の研修ということもあり， 内容は非常に濃く非常に満足できるものでした。


試験勉強はおもに研修資料を読みながら下記のテス友という問題演習アプリを用いて行っていました。

https://www.qbook.jp/info-testomo/

勉強期間は約３週間でした。
毎日30分程度問題を解いて理解が浅い部分を資料を読んで知識補完というようなことを繰り返していました。

# 受験してみた
### テスト概要
試験時間：60分
設問数：４０問
合格基準：26問以上正解

先ほど紹介したテス友で４０問の解答時間はだいたい２0~30分だったので試験時間に対する心配は特にありませんでした。

### 感想
多少の緊張を感じながらの受験ということもありますが, 出題された問題の難易度はテス友で出題されるものと比較して結構難しいと感じました。

いつも通り30分程度で問題歯解き終えましたが, 確信が持てない問題が9問程度ありましたので10分ほどで再考して回答しました。その後5分で全ての問題の見直しを実施しました。

試験勉強としてはテス友でのみ演習を行っていましたが下記のような違いを感じました。
- 問題文が結構長い
- 言葉の定義に関して深く聞かれる
- 「適切なもの」を選ぶ問題しか出題されない

本番の難易度＞＞テス友の難易度

# 試験結果
試験受験から5日後の朝7時にメールで試験結果の通知が来ました。結果は合格でした。受験直後は確信を持てていなかったので嬉しかったです。
合格通知から約１ヶ月後に認定証が送付されてくるようです。

# まとめ
JSTQBを取得して良かったと感じる点はやはりテストを体系的に理解できたというところです。

知識だけでなく実践も経験してこそのスキルだと思いますので，今後は開発業務のみならずQA業務も頑張っていきたいと思いました。



### 補足（蛇足）
試験受験後に下記の本を読んだのですがこちらの教科書で出題されている問題の方が本番のレベルに近いと感じました。テス友での演習のみで合格もできましたが，お金に余裕のある方はこちらの本を買ってみてもよいかもしれません。..

[JSTQB Foundation 第4版: ソフトウェアテスト教科書 シラバス2018対応](https://amzn.asia/d/0dtc7Orx)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（37/100）

【37日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（4/10）

≪問題37≫
アドバンスト計画のMRPに関する文書で、無限計画を通じて新規計画手配が登録されることを知りました。新規計画手配の能力所要量に関して、これはどのような意味を持ちますか。
□作業区に十分な能力がある場合のみ、MRPによって能力所要量が設定される。
□最も早い利用可能能力がある作業区に対して、能力所要量が自動的に割り当てられる。
□作業区の能力をチェックせずに、MRPによって能力所要量が設定される。
□作業区で最後に計画された計画手配の後で、能力所要量が自動的に割り当てられる。

≪解答≫
□作業区に十分な能力がある場合のみ、MRPによって能力所要量が設定される。
□最も早い利用可能能力がある作業区に対して、能力所要量が自動的に割り当てられる。
■作業区の能力をチェックせずに、MRPによって能力所要量が設定される。
□作業区で最後に計画された計画手配の後で、能力所要量が自動的に割り当てられる。

≪解説≫
◆無限計画および有限計画を使用した生産計画の特徴は以下の通りです。
（1）無限計画を使用した生産計画
- 計画手配の登録時にリソースがチェックされません。能力過負荷があっても、計画手配が登録されます。
- ダウンストリームDSヒューリスティック（能力所要量計画）により、実行可能な生産計画が生成されます。
- 計画の最終的な最適化が可能です。
（2）有限計画を使用した生産計画
- 計画手配の登録時に全ての（有限）リソースがチェックされます。
- 計画手配は、残存能力がある場合にのみ登録されます。
- 計画のダウンストリーム最適化が可能です。
VSCodeで作業効率をアップ！便利なショートカット一覧

# はじめに

Visual Studio Code（VSCode）は、開発者にとって非常に強力なツールです。
そして、ショートカットキーを活用することで、より作業効率が上がります！
便利なショートカットをカテゴリ別にまとめていますので、是非参考にしてみてください！

## 基本ショートカット

| 操作                    | Windows/Linux       | Mac               |
|-------------------------|---------------------|-------------------|
| 新しいファイルを作成    | `Ctrl + N`          | `Cmd + N`         |
| ファイルを開く          | `Ctrl + O`          | `Cmd + O`         |
| 保存                    | `Ctrl + S`          | `Cmd + S`         |
| すべて保存              | `Ctrl + K S`        | `Cmd + Option + S`|
| 閉じる                  | `Ctrl + W`          | `Cmd + W`         |
| すべて閉じる            | `Ctrl + K W`        | `Cmd + Option + W`|

## 編集ショートカット

| 操作                    | Windows/Linux       | Mac               |
|-------------------------|---------------------|-------------------|
| コピー                  | `Ctrl + C`          | `Cmd + C`         |
| カット                  | `Ctrl + X`          | `Cmd + X`         |
| ペースト                | `Ctrl + V`          | `Cmd + V`         |
| 元に戻す                | `Ctrl + Z`          | `Cmd + Z`         |
| やり直す                | `Ctrl + Shift + Z` / `Ctrl + Y` | `Cmd + Shift + Z`|
| 行の移動                | `Alt + ↑ / ↓`       | `Option + ↑ / ↓`  |
| 行のコピー              | `Shift + Alt + ↑ / ↓` | `Shift + Option + ↑ / ↓`|
| 行の削除                | `Ctrl + Shift + K`  | `Cmd + Shift + K` |
| 行のコメントアウト      | `Ctrl + /`          | `Cmd + /`         |
| 複数行選択              | `Alt + Click`       | `Option + Click`  |

## ナビゲーションショートカット

| 操作                    | Windows/Linux       | Mac               |
|-------------------------|---------------------|-------------------|
| クイックオープン        | `Ctrl + P`          | `Cmd + P`         |
| エクスプローラー表示切替| `Ctrl + Shift + E`  | `Cmd + Shift + E` |
| 検索表示切り替え      | `Ctrl + Shift + F`   | `Cmd + Shift + F`         |
| 検索                    | `Ctrl + F`          | `Cmd + F`         |
| 置換                    | `Ctrl + H`          | `Cmd + Option + F`|
| ターミナル表示切替      | `Ctrl + Shift + ^`  | `Cmd + Shift + ^`        |

## デバッグショートカット

| 操作                    | Windows/Linux       | Mac               |
|-------------------------|---------------------|-------------------|
| デバッグ開始/再開       | `F5`                | `F5`              |
| ステップオーバー        | `F10`               | `F10`             |
| ステップイン            | `F11`               | `F11`             |
| ステップアウト          | `Shift + F11`       | `Shift + F11`     |
| デバッグ停止            | `Shift + F5`        | `Shift + F5`      |

# まとめ
ショートカットを使うと、VSCodeでの作業をさらにスムーズに行えます。
少し時間がかかるかもしれませんが、一度慣れれば、作業効率が上がるのでおすすめです！
【UE5】今さらUnrealC++のTArray「Insert」の範囲外アクセスの挙動を見てみる　4日目

# 0.最初
配列の長さより大きい所にInsertを行うとどのような挙動をするのか気になりました
テストBPは以下の感じ
・長さ3の配列
・100番目に文字列「DDD」を追加

![スクリーンショット 2024-07-04 233043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/b930e121-32a2-9bb0-a961-59df378b1520.png)

以下の2点のどちらかが行われるだろうと予想しました
・指定したIndexの差分だけResizeされる
　→長さ3の時Insertで100番目に追加する時、97個分の配列が確保される

・「配列の長さ分の場所に追加できません」的なエラーが表示され動作停止する
# 1.結果
以下のワーニングが表示され「Insert」ノードがスキップされました

> ![スクリーンショット 2024-07-04 234659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/f8f23668-70f3-25e1-c0cf-407f71a5fbf8.png)
> Script Msg: Attempted to insert an item into array StrArray out of bounds [100/2]!
>配列に項目を挿入しようとしました

デバッグ文
![スクリーンショット 2024-07-04 234605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/273b7f2b-a9c3-a456-d2bf-134625f4c93a.png)
# 2.解説
UKismetArrayLibrary 204行目
長さより大きいIndexを入力するとこの処理がスキップされます

```cpp
void UKismetArrayLibrary::GenericArray_Insert(void* TargetArray, const FArrayProperty* ArrayProp, const void* NewItem, int32 Index)
{
	if( TargetArray )
	{
		FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray);
		FProperty* InnerProp = ArrayProp->Inner;

		if (ArrayHelper.IsValidIndex(Index)||(Index >= 0 && Index <= ArrayHelper.Num()) )
		{
			ArrayHelper.InsertValues(Index, 1);
			InnerProp->CopySingleValueToScriptVM(ArrayHelper.GetRawPtr(Index), NewItem);
		}
		else
		{
			FFrame::KismetExecutionMessage(*FString::Printf(TEXT("Attempted to insert an item into array %s out of bounds [%d/%d]!"), *ArrayProp->GetName(), Index, GetLastIndex(ArrayHelper)), ELogVerbosity::Warning, InsertOutOfBoundsWarning);
		}
	}
}
```

# 3.結論
結論としては「ノードスキップ」でした
勝手にResizeされるだろうと思っていましたが
ミスした場合多くのメモリを消費されるのでよく考えればそんなこと無いなと思いましたね

# 4.参考資料
https://zenn.dev/posita33/books/ue5_starter_cpp_and_bp_001/viewer/chap_90_bp_array_control#insert:~:text=%E8%BF%BD%E5%8A%A0%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,Insert,-%5BInsert%5D%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AF
【VSCode】エラーメッセージを行間に表示させる方法

以降の設定を行うと画像のようにエラーメッセージなどが行間に表示されるようになります。

![スクリーンショット 2024-07-04 23.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fe51b457-8c59-ffce-750f-0da64bb3adbe.png)

## 拡張機能をインストールする

Error Lensという拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens

## 設定を追記する

`settings.json`に以下を追記します。

```json:settings.json
{
  "editor.codeLens": true,
  "errorLens.codeLensEnabled": true,
}
```

以上でエラーメッセージなどが行間に表示されるようになります。

また、以下の設定を追記すると表示されたエラーメッセージをクリックすると検索ができるようになります。

```json:settings.json
{
  "errorLens.codeLensOnClick": "searchForProblem",
}
```
Oracle Linux 8 に Terraform をインストールする

# パッケージマネージャ

```bash
$sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

$sudo dnf install terraform -y

$terraform -y

Terraform v1.9.1
on linux_amd64
```

# バイナリ

```bash
$sudo  wget https://releases.hashicorp.com/terraform/1.9.1/terraform_1.9.1_linux_amd64.zip

$sudo unzip terraform_1.9.1_linux_amd64.zip
$sudo mv terraform /usr/bin

Terraform v1.9.1
on linux_amd64
```
github issueのtemplateでいろいろできる

個人的「質はともかく継続する」25日目です

# github issueのtemplateでいろいろできる

github issueにはtemplateを作る機能があります。
通常のtemplateと、実験的な機能のtemplateが用意されています。
実験的な機能のほうを簡単に作ってみます。

公式を参考にします。

https://docs.github.com/ja/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository

## ソースファイルを用意する

 .github/ISSUE_TEMPLATEの配下に、yaml形式のファイルを作成します。
 ISSUE_TEMPLATEフォルダがなければ、作成してください。

 今回はdropdownとinput,textareaを追加してみます。

 ```yaml
name: issueテンプレート
 description: issueテンプレート
 title: "内容："
 labels: ToDo
 body:
   - type: markdown
     attributes:
       value: |
         issueテンプレ
   - type: dropdown
     id: kudamono
     attributes:
       label: くだもの
       description: 
       options:
         - もも
         - りんご
         - ばなな
         - みかん
       default: 0
   - type: input
     id: yasai
     attributes:
       label: 好きな野菜を入れてください
       placeholder: "ほうれんそう"
   - type: textarea
     id: receipe
     attributes:
       label: レシピ
       description: 例：もものタルト
```

issueから、今回つくったテンプレートを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/1d6147a9-ba1a-159e-5d6f-cffb9fe4a18e.png)

いい感じにできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/4056a934-6c89-5594-2bd9-caecad300659.png)


まだベータ版ですが、色々と使えて便利そうです。