OmniAICreator/Qiita-1.07M huggingface dataset:
UI:アコーディオンカーテン(バニラJS+HTML/CSS)


```html
<div class="accordion">
  <div class="accordion-item">
    <button class="accordion-header">見出し1</button>
    <div class="accordion-content">
      <label><input type="checkbox"> チェックボックス1</label>
      <label><input type="checkbox"> チェックボックス2</label>
      <label><input type="checkbox"> チェックボックス3</label>
    </div>
  </div>

  <div class="accordion-item">
    <button class="accordion-header">見出し2</button>
    <div class="accordion-content">
      <label><input type="checkbox"> チェックボックス4</label>
      <label><input type="checkbox"> チェックボックス5</label>
    </div>
  </div>
</div>
```
```javascript
document.querySelectorAll('.accordion-header').forEach(button => {
  button.addEventListener('click', function () {
    const content = this.nextElementSibling;
    const isOpen = content.style.maxHeight;

    // 他のアコーディオンを閉じる場合
    document.querySelectorAll('.accordion-content').forEach(item => {
      if (item !== content) {
        item.style.maxHeight = null;
      }
    });

    // 開閉の切り替え
    content.style.maxHeight = isOpen ? null : content.scrollHeight + 'px';
  });
});
```
```css
.accordion-header {
  width: 100%;
  background-color: #007bff;
  color: white;
  padding: 10px;
  border: none;
  text-align: left;
  cursor: pointer;
  font-size: 16px;
}

.accordion-content {
  overflow: hidden;
  max-height: 0;
  transition: max-height 0.3s ease-out;
  padding-left: 10px;
}

.accordion-item {
  border-bottom: 1px solid #ccc;
}

label {
  display: block;
  margin: 5px 0;
}
```
[Mac] sendkeys に『英数』『かな』キーを追加

# `sendkeys`とは、

https://github.com/socsieng/sendkeys

任意のキーコードを送出できる、macOS向けのユーティリティコマンドです。
（最新はマウスコマンドの送出も可能）

しかし、日本語キーボードにある『英数』『かな』がありません。そこで、この2つのキーを追加します。



# 手順

上記GitHubからリポジトリをダウンロードして、数行追加します。

## 1. ソースコード改修

_ダウンロードしたリポジトリのディレクトリを`./sendkeys-main`と仮定。
環境により適宜読み替えてください。_

```diff_swift:sendkeys-main/Sources/SendKeysLib/KeyCodes.swift
//124行目付近
    static let keypad7: UInt16 = 0x59
    static let keypad8: UInt16 = 0x5B
    static let keypad9: UInt16 = 0x5C

+    // JP-Keyboard
+    static let eisuu: UInt16 = 0x66 //英数
+    static let kana: UInt16 = 0x68 //かな


//267行目付近
        "keypad7": KeyCodeWithFlags(keypad7),
        "keypad8": KeyCodeWithFlags(keypad8),
        "keypad9": KeyCodeWithFlags(keypad9),

+        // JP-Keyboard
+        "eisuu": KeyCodeWithFlags(eisuu), //英数
+        "kana": KeyCodeWithFlags(kana), //かな
        
    ]   
```


## 2. ビルド

ビルド＆インストールします。

```terminal
cd sendkeys-main
make build
sudo make install
```

## 3. 権限設定

初めて`sendkeys`を実行すると 次のダイアログが表示されるので、_システム設定_ を開いて _ターミナル_ に権限を付与します。

<img width="400" alt="scr1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/1bc90c19-c23c-47ac-b76f-d0e4e0cf5004.png" />

<img width="500" alt="scr2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/09c1e467-78f1-464a-8c9b-b06fa1358f82.png" />



# 使用例

```shell
sendkeys --application-name "Finder" --characters "<c:eisuu>"
```

Sleep から復帰後に初めてタイプするときに、『日本語』モードのままとなっていて、「あれれ」となることが多々ありました。

そこで、[`SleepWatcher`](https://qiita.com/search?q=sleepwatcher)を使用して、Sleep から復帰時に上記コマンドにて英数モードに戻すことで、このイライラを解消しました。

USキーボード使用時も問題なく機能します。

<br><br>

**以上**
TryHackMeをつかってハッキング入門してみた

# 興味を持った理由

セキュリティに関する学習を進める中で、[「7日間でハッキングをはじめる本 TryHackMeを使って身体で覚える攻撃手法と脆弱性」](https://amzn.asia/d/dlfdQew)という本をみつけ、実際にどういった脆弱性があるのか、どのように攻撃をするのか手を動かして体感することで、よりセキュアなソフトウェア開発に貢献できると思いました。
本書では7日間で一周できる内容になっているので、とっかかりやすそうだと思い選びました。

# やってみた感想

- TryHackMeは日本語がないので取り掛かるハードルが少し高く、不安もありましたが、本書はわかりやす説明をしてくれているので、比較的ストレスなく進めることができました
- 1日目の課題から達成感があり、初めての人でも手応えを感じることができました

※某喫茶店のwifi環境だと環境構築時にエラーがあり若干つまづきましたが、帰宅してやると問題なく進めることができました。

# 今回学んだ攻撃について

### nmapを使ったポートスキャン
```
nmap -sV -Pn -oN nmap.txt -v ＜ターゲットのIPアドレス＞
```

nmapコマンドを使用することで下記のようにポートスキャンを行うことができます。
このようにポートの状態を調べることで使用中のポートの調査を行います。

- developmentとい名前のディレクトリが存在すること
- ディレクトリリスティングが有効になっていること

を確認できました。

![スクリーンショット 2025-03-24 21.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/1160785b-002c-48bd-a5a7-3622e85c363e.png)

### 辞書攻撃
Kali Linuxではdirbコマンドを使って辞書ファイルを使って、ファイル内のテキストと一致するディレクトリがないか調べることができました。

記載されているワードが多いほど時間がかかります。
今回は使用したsmall.txtは900ワードくらいでした。自分の環境だと大体15分くらいでした。

![スクリーンショット 2025-03-24 21.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/34d3a849-993d-4cee-b5d7-5281baa5a4d2.png)

さらにhydraというツールを使うと、ユーザーID、パスワードまで割り当てることに成功しました。

![スクリーンショット 2025-03-24 21.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/d2fb92ad-2432-4ceb-abb2-98252e08deaf.png)


### BurpSuiteを使った通信の改ざん
BurmSuiteはWebアプリケーションセキュリティテストツールのひとつです。
リクエストパラメータに辞書ファイルをつっこんでパスワードを解析できました。
よく使われる簡易的なパスワードに設定しているとたやすく解読されてしまうことがわかりました。


![スクリーンショット 2025-03-30 11.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/53333c46-e9a1-4ac3-9e2a-a966b196abad.png)

![スクリーンショット 2025-03-30 11.48.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/67b2bf96-0a8b-4712-8b5d-d58c6bea723e.png)

ターゲットのパスワードである"admin123"の時のみステータスが200となっています。
管理者アカウントでログインすることに成功しました。


### SQLインジェクション
今回使用したやられサイトではログインフォームにSQLインジェクションの脆弱性があったため、パスワードがなんであっても、とりあえず入力さえしていれば簡単にログインできました。
![スクリーンショット 2025-03-30 11.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/615acb89-1c43-49b2-8702-04bd44421fd8.png)

![スクリーンショット 2025-03-30 12.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888660/cbd6fef4-c96d-42cf-b63c-9e7d5c059516.png)
管理者権限でないとできない
- レビューの評価変更や削除
- 会員情報の取得
などを行うことができました。

# 感想
このほかにも、OSINTとよばれる公開されている情報からIDやパスワードを推測するものや、ターゲットマシンから接続を試みるリバースシェルなど色々な攻撃手法を体験できました。
紹介したものは本書の内容全てではないですが、色々な攻撃手法を学ぶことができ、私自身もTryHackMeでの学習を継続したいなと思いました。
ゲーム感覚で楽しく遊ぶようにハッキング体験ができるので、興味のある方は是非どうぞ。
【Oracle Linux】EC2インスタンスで Oracle Linux を起動する

# 背景
クライアントのテスト環境として Oracle Linux の 8 と 9 が必要となり、それぞれ AWS の ECインスタンス に構築しました。
今回、構築のために実施した内容をまとめます。


# 目次
* [はじめに](#はじめに)
* [1. Oracle Linux 9](#1-oracle-linux-9)
* [2. Oracle Linux 8](#2-oracle-linux-8)
* [補足. カーネルの切り替え](#補足-カーネルの切り替え)
* [参考資料](#参考資料)


# はじめに
Oracle Linuxは、AWS公式のAMIからは提供されていません。
そのため、マーケットプレイス（AWS Marketplace AMI）で提供されているAMIから選択する必要があります。


# 1. Oracle Linux 9
Oracle Linux 9 の構築には、以下のAMIを利用しました。
デフォルトのカーネルは、「`Unbreakable Enterprise Kernel`」となります。
コストは起動時間あたりの利用料金の他に、ライセンス利用料も含まれるので注意が必要です。

##### AMI
* Oracle Linux 9 | Support by SupportedImages

##### カーネル
* Unbreakable Enterprise Kernel

##### コスト
* Region：Asia Pacific (Tokyo)

| Instance type | Product cost/hour | EC2 cost/hour | Total/hour |
|      ---      |        ---        |      ---      |     ---    |
|   t3.medium   |       $0.14       |     $0.054    |   $0.194   |

:::note warn
警告
コストは「2025年03月」時点の内容です。
:::


# 2. Oracle Linux 8
Oracle Linux 8 の構築には、以下のAMIを利用しました。
デフォルトのカーネルは、「`Unbreakable Enterprise Kernel`」となります。
コストは Oracle Linux 9 と同様に、起動時間あたりの利用料金の他に、ライセンス利用料も含まれるので注意が必要です。

##### AMI
* Oracle Linux 8 | Support by SupportedImages

##### カーネル
* Unbreakable Enterprise Kernel

##### コスト
* Region：Asia Pacific (Tokyo)
       
| Instance type | Product cost/hour | EC2 cost/hour | Total/hour |
|      ---      |        ---        |      ---      |     ---    |
|   t3.medium   |       $0.14       |     $0.054    |   $0.194   |

:::note warn
警告
コストは「2025年03月」時点の内容です。
:::


# 補足. カーネルの切り替え
Oracle Linux のカーネルは「`Unbreakable Enterprise Kernel`（UEK）」の他に、「`Red Hat Compatible Kernel`（RHCK）」も存在します。
もし、テスト環境として「RHCK」を利用したい場合は、設定によって切り替えることが可能です。
設定方法については、以下の記事が参考になります。

https://qiita.com/yamada-hakase/items/bf3a8cfb054b3a8cbd0a


# 参考資料
https://aws.amazon.com/marketplace/pp/prodview-n5x4eougzrol6

https://aws.amazon.com/marketplace/pp/prodview-uddeiwhf2l26w
WordPress.comからGitHub Pagesに引っ越して、GA4でアクセス解析つけてみた

もともとWordPress.comでサイトを作ったけど、  
動的コンテンツも特にないし、コストもかかるので、GitHub Pagesにお引っ越しすることに。

https://refootaskacyba.com/

ページも少ないのでスムーズに移行完了してほっとしたが、Jetpackが使えなくなってアクセス解析がされないのでさみしい気分に。 
ググると↓の記事を見つけた。

[GitHub PagesでGA4（Google Analytics 4）を使う方法](https://qiita.com/chikurin66/items/b776c9a2e5a8ebf0dd68)

ありがたく参考にしつつ、自分のときはちょっとUIが変わっててウィザード形式だったので、  
そのへん含めてやったことをメモ。

---

### 全体イメージ

```mermaid
graph TD
  A["GitHub Pages"] --> B["埋め込んだGA4タグ"]
  B --> C["Google Analyticsにアクセスデータ送信"]
  C --> D["リアルタイム／ユーザレポートで確認"]
```

## GitHub PagesにGA4を設定した手順

1. **Google Analyticsにログイン**  
私の場合はFirebase使うときにアカウント作成していたのでそれを利用。 
　- 左下の「管理」をクリック。<br><br>

2. **プロパティ作成**  
　- 左上の「＋作成」からプロパティを新規作成  
　- プロパティ名（自由なのでgithub-skacybaにした）とか用途とかを入力<br><br>

3. **データストリーム作成**  
　- プラットフォーム選択で「ウェブ」を選ぶ  
　- 自分のGitHub PagesのURLを入力  
　- ストリーム名は識別用らしいので、なんでもOKっぽい（URLとかでいいかと）<br><br>

4. **タグ取得 & 設置**  
　- 「手動でインストールする」を選ぶと、HTMLタグ（gtag.js）が出てくる  
　- それを自サイトの`<head>`直後に貼り付ける（解析したい全ページに入れる）<br><br>

5. **GitHubにコミット**  
　- 編集後、GitHubにコミット  
　- 数十秒〜1分くらいで反映された（自分だけ？結構ラグあるように感じる）<br><br>

6. **テストと確認**  
　- GAの「インストールをテスト」で反応があるか確認  
　- うまくいってれば、リアルタイムレポートにデータが出てくる。すご！


---

## 感想

WordPress.comではJetpack任せだったから、あれが無いとかこれから出るかもだけけど、  
GitHub Pages＋GA4でここまでできるの、ちょっと感動した。  
完全無料でアクセス解析までいけるのはありがたい。

ということで、WordPressから静的サイトに移行した勢にはかなりおすすめ。  
この記事が誰かの助けになればうれしい！
【コピペでOK】動画プレイヤーをリッチに見せる枠線

少し凝った枠線をつけたいときに使えるコード


## 前提条件

YouTube 埋め込みプレーヤーの装飾の際には下記ガイドラインを満たす必要がある

https://developers.google.com/youtube/terms/required-minimum-functionality?hl=ja#youtube-embedded-player-and-video-playback

禁止事項の要約
- 埋め込みプレーヤーが備えている機能を利用できない状態にすること
- 埋め込みプレーヤーのUIを削除したり覆い隠すこと

## グラデーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/c3c85ed7-1784-4b1b-b55d-5850678f7817.png)


### Tailwind CSS

```html:HTML
<div class='rounded-[16px] bg-gradient-to-r from-emerald-300 to-green-800 p-[5px] drop-shadow-[0_0_2px_#000]'>
  <figure class='aspect-video overflow-hidden rounded-[11px] bg-black [&>iframe]:h-full [&>iframe]:w-full'>
    <!-- ここにiframe(埋め込みプレイヤー)を設置 -->
  </figure>
</div>
```

:::note
サンプル
https://playcode.io/2316361
:::


### バニラCSS

```html:HTML
<div class='video-container'>
  <figure class='video-container__iframe-wrapper'>
    <!-- ここにiframe(埋め込みプレイヤー)を設置 -->
  </figure>
</div>
```

```css:CSS
.video-container {
  border-radius: 16px;
  background: linear-gradient(to bottom, #ec84c4, #8558ff);
  padding: 5px;
  filter: drop-shadow(0 0 2px #000);
}

.video-container__iframe-wrapper {
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background-color: black;
  border-radius: 11px;
}

.video-container__iframe-wrapper > iframe {
  width: 100%;
  height: 100%;
}
```

### 解説

縁取り表現のために親要素とその背景色を利用する
（iframeにborderを生やすアプローチではアスペクト比が変化してしまう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/fce39a87-ef79-41ee-ac37-4565ab9fb8c6.png)


iframeコードを極力編集しないような設計がなされている
ただしiframeタグの`width`と`height`属性は削除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/11d0579d-7d24-4a33-90e6-b32839c49f37.png)


背景要素とiframe要素それぞれに角丸を設定している
iframe自体を角丸にするには `overflow: hidden;` が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/5a58be7f-d591-4c93-b28d-96464746d212.png)


角丸の大きさの設定については下記ポストが参考になる

https://x.com/jeiri_design16/status/1856079501442404434


## グラスモーフィズム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/0903f7ee-ef21-4b5a-b908-9ce6243f2265.png)



### Tailwind CSS

```html:HTML
<div class='rounded-[16px] bg-white/20 backdrop-blur-lg border border-white/20 p-[5px] drop-shadow-[0_0_2px_#000]'>
  <figure class='aspect-video overflow-hidden rounded-[11px] bg-black [&>iframe]:h-full [&>iframe]:w-full'>
    <!-- ここにiframe(埋め込みプレイヤー)を設置 -->
  </figure>
</div>
```


### バニラCSS

```html:HTML
<div class='video-container'>
  <figure class='video-container__iframe-wrapper'>
    <!-- ここにiframe(埋め込みプレイヤー)を設置 -->
  </figure>
</div>
```

```css:CSS
.video-container {
  border-radius: 16px;
  background: rgba(255, 255, 255, 0.2);
  backdrop-filter: blur(10px);
  border: 1px solid rgba(255, 255, 255, 0.2);
  padding: 5px;
  filter: drop-shadow(0 0 2px #000);
}

.video-container__iframe-wrapper {
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background-color: black;
  border-radius: 11px;
}

.video-container__iframe-wrapper > iframe {
  width: 100%;
  height: 100%;
}
```

### 解説

ページ背景画像が暗い場合や動画プレイヤーに控えめな強調をさせたい場合に有用
コードはグラデーションとさほど変わらない
LaravelにOPcache導入したらめちゃくちゃ速くなった話

## はじめに -課題
インターン先で、とあるアプリケーションを開発していました。
バックエンドはPHP(Laravel)で作成し、ECSにデプロイを行いました。
しかし、APIのリスポンスが全体的にとても遅く、数秒程度かかっていたという問題がありました。これでは大きな問題なので、チューニングを行う必要がありました。初期調査では、AWSのCloudWatchでECSやRDSのメトリクスを確認しましたが、CPU等は余裕があったのでサーバーリソースの問題ではないと判断しました。
また、データベースから多くのデータを取得しないような処理でも時間がかかっており、すぐには原因が分かりませんでした。例えばCloudFront→ECSやECS→RDS間の通信に遅延がかかっている可能性もありますし、PHP自体のパフォーマンスの問題の可能性もあるのでこのままだと原因の切り分けができないという課題がありました。
## New Relicの導入
表面的な観測ではパフォーマンスが悪い原因がわからなかったため、New Relicを導入してより具体的な調査を行うことにしました。具体的には、APM機能を利用しLaravel自体のパフォーマンスを見たり、遅いAPIやデータベースクエリを見つけるために使用しました。
## APMの確認とopcacheの導入
APMを確認したところ、特段遅いAPIやSQLクエリがある訳ではなかったということがわかりました。しかし、Web transactions timeを確認すると、支配的になっていたPHPの処理時間が1000~2000msかかっていたことがわかりました。
そのため、PHP(Laravel)の性能がボトルネックであると判断し、チューニング方法を探したところ、[OPcache](https://www.php.net/manual/en/intro.opcache.php)をPHPに導入することで高速化が期待できるということだったので、導入したところ実際に速くなりました。
OPcacheを有効にすると、PHPのスクリプトをコンパイルした後のバイトコードをキャッシュされます。そのため、2回目以降のリクエストで再コンパイルを省略し、高速化を実現できます。
具体的には、DockerfileとPHPの設定ファイルに以下を追加しました。
```Dockerfile
RUN docker-php-ext-install opcache
```
```php.ini
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.validate_timestamps=0
```
以下の画像を見るとその効果がわかるかと思います。7:50amから8:05amまでの時間で山ができており、PHPのWeb transactions timeが支配的となっており処理に2000ms近く要していることが確認できます。
この時間帯は、**OPcacheを外しており、他の時間帯はOPcacheの設定を追加しています。** OPcacheの導入により、PHPの処理時間を1/10近くに減らすことができたということが確認できます。
![スクリーンショット 2025-03-16 午後5.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839850/daf424d9-22ca-4bba-a617-37907cf752cd.png)
## まとめ
Laravelでアプリケーションを開発する際に、OPcacheの有無ではパフォーマンスに大きな違いが生じることがわかりました。この記事がLaravelのチューニングを図っている方にとって参考になると幸いです。
【KQL】ago(7d) と bin(TimeGenerated, 7d) の違いを具体例で理解する

Microsoft Sentinel や Azure Monitor で使われる Kusto Query Language (KQL) では、時系列データの分析に便利な関数として `ago()` と `bin()` がよく登場します。

この記事では、`ago(7d)` と `bin(TimeGenerated, 7d)` の違いを、実際のクエリ例と出力結果を使って解説します。

---

## 1. `ago(7d)` とは？

`ago(7d)` は、「今からちょうど7日前の時刻」を表す関数です。  
通常は `where` 句と組み合わせて、**過去7日間のデータを抽出する** ために使われます。

### 使用例

```kql
SecurityEvent
| where TimeGenerated > ago(7d)
| summarize count() by TimeGenerated
```

### 出力例（イメージ）

| TimeGenerated         | count |
|----------------------|-------|
| 2025-03-30 11:42:00  | 15    |
| 2025-03-30 12:10:00  | 8     |
| 2025-03-31 08:00:00  | 20    |

このように、`TimeGenerated` はそのままの時刻で表示され、生ログに近い形でデータが出力されます。

参考（Microsoft公式）：  
[ago() - KQL 関数リファレンス](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/agofunction)

---

## 2. `bin(TimeGenerated, 7d)` とは？

`bin()` 関数は、時刻を一定の単位で丸めてグルーピングするために使います。  
`bin(TimeGenerated, 7d)` は、時刻を7日単位でまとめることを意味します。

### 使用例

```kql
SecurityEvent
| summarize count() by bin(TimeGenerated, 7d)
```

### 出力例（イメージ）

| TimeGenerated         | count |
|----------------------|-------|
| 2025-03-01 00:00:00  | 320   |
| 2025-03-08 00:00:00  | 405   |
| 2025-03-15 00:00:00  | 390   |

このように、`TimeGenerated` が週の開始時刻（00:00）に丸められて集計されます。

参考（Microsoft公式）：  
[bin() - KQL 関数リファレンス](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/binfunction)

---

## 違いのまとめ

| 項目 | ago(7d) | bin(TimeGenerated, 7d) |
|------|---------|--------------------------|
| 目的 | データの期間を制限する | データを時間単位で集約する |
| 使い方 | `where TimeGenerated > ago(7d)` | `summarize by bin(TimeGenerated, 7d)` |
| 出力 | 生の時刻データがそのまま出る | 時間が7日単位で丸められて出る |
| 主な用途 | 過去◯日間のデータ取得 | 週単位などでトレンドを見る |

---


## 注意点

`bin(TimeGenerated, ...)` を使って時間単位で集計する場合でも、**対象期間の制限は自動では行われません**。  
明示的にデータの範囲を絞るには、以下のいずれかを必ず設定しましょう。

- クエリ内で `where TimeGenerated > ago(◯d)` を記述する  
- ポータルの「時間の範囲」を適切に設定する（例：過去30日間 など）

時間の範囲を指定しないと、クエリの結果が返らない可能性があります。

1.結果が見つからない例 (TimeGeneratedは7dだが、実際に参照しているデータは24H分)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310464/56fbf124-a882-4a3e-9aeb-1f5842b9f012.png)


2.こちらは結果が返る例 (時間の範囲：クエリで指定と表示が変わった。ｓ範囲の7d分の結果が返る)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310464/b57f36e3-92b8-4c6b-b8a8-a3d41ce2783e.png)
Nuxt3 ✖️ Firebase 認証のリダイレクトができない

## 前書き
Firebase Authenticationを使って認証を作成しましたが、リダイレクト方法の最適解がわからないためここに記します。リダイレクトに焦点を当てていますので細かい実装方は各自お願いします。

## やりたいこと ~ リダイレクト処理 ~
- 認証がないのに認証必須ページにアクセスした場合、ログインページに遷移
- 認証があるのにログインページにアクセスした場合、認証必須ページに遷移

## 全体の流れ
1. Firebase AuthをNuxt3で初期化
1. Nuxt3でリダイレクトを実装

### 1. Firebase AuthをNuxt3で初期化
- Firebaseではアプリ立ち上げ時に一度だけ、Firebase認証（初期化）をする必要がある
- middlewareディレクトリに初期化処理を実装
※実際に使う場合は環境変数を直書きせずruntimeConfigなどを使用して下さい。


Nuxt3ではpluginsフォルダがアプリ立ち上げ時に一度だけ実行されるのでここに初期化処理を記述するのが主流ですが、後に説明する理由でmiddlewareに初期化処理を記述します。

```typescript:middleware/firebaseinit.global.ts
// 拡張子にglobalを記述することで全ファイルに適応
import { initializeApp } from "firebase/app"; 

export default defineNuxtRouteMiddleware(() => {
    const firebaseConfig = {
        apiKey: "***************",
        authDomain: "**************",
        databaseURL: "**************",
        projectId: "**************",
        storageBucket: "**************",
        databaseURL: "**************",
    };

    // 初期化
    initializeApp(firebaseConfig)
})
```

### 2. リダイレクトをmiddlewareに実装
middlewareディレクトリはコンポーネントの読み込み前に実行されるディレクトリであり、一般的にはページに認証が必要かどうかなどに利用されます。
```typescript:middleware/auth.ts
import { defineNuxtRouteMiddleware, navigateTo } from "nuxt/app";
import { getAuth, onAuthStateChanged } from "firebase/auth";

export default defineNuxtRouteMiddleware(async (to) => {
  const auth = getAuth();
  const user = await new Promise((resolve) => {
    const unsubscribe = onAuthStateChanged(auth, (user) => {
      unsubscribe();
      resolve(user);
    });
  });

  // 認証がありログイン画面に遷移しようとした場合、ユーザー画面へ
  if (user && to.path === "/") {
    return navigateTo(`/member/${auth.currentUser?.uid}`);
  }
  
  // 認証がなくユーザー画面に遷移しようとした場合、ログイン画面へ
  if (!user && to.path !== "/") {
    return navigateTo("/");
  }
});

```
以下のようにpagesディレクトリで記述するとmiddlewareが反映されます。
```vue:pages/member/index.vue
<script setup lang="ts">
    definePageMeta(middleware: "auth");
</script>

<template>
    <p>メンバーページ</p>
</template>
```

## なぜpluginsに初期化を記述しないのか
middleware.globalで記述するとページごとに初期化されパフォーマンスは良くありません。
しかし、pluginsで初期化するとおそらくリロード時ライフサイクルの都合上初期化が間に合わず、認証があるのにも関わらずログイン画面に遷移orエラーになります。
### ライフサイクル (多分)
1. plugins (非同期)
1. middleware.global 
1. middleware (plugins初期化途中)

よってNuxt3, Firebase Authを用いた認証のリダイレクトを実装する際には現在この記述を採用しています。自分の技量不足であまりいい記述とは言えませんがとりあえずこれで正常に動きます。何か詳しい方いたら教えていただけると幸いです。
AutoCAD VBA 選択フィルタ (1) - 概要 -

# はじめに

AutoCAD VBAで[コードによる図形オブジェクトの選択](https://qiita.com/sewege11/items/dfb3373d796201c0e59b)には、選択フィルタを指定することが可能です。
例えば、画面上で図形オブジェクトをクリックやドラッグで選択する`SelectionSet.SelectOnScreen`メソッドでは、画面上で非表示やフリーズにしていなくても選択フィルタにしたがった図形オブジェクトだけを選択できますし、`SelectionSet.Select`メソッドでは、選択フィルタを指定することでクイック選択のような処理を行うことも可能です。

https://qiita.com/sewege11/items/dfb3373d796201c0e59b

ここでは、3回に分けて選択フィルタを作成するFunctionプロシージャを紹介します。第1回は前段として公式リファレンスのサンプルコードを見ていきます。

# 公式リファレンスのサンプルコード(改)

[公式リファレンス](https://help.autodesk.com/view/OARX/2025/JPN/?guid=GUID-E5B81EA6-308F-4F9E-9318-4A4B238092F0)に掲載されている選択フィルタの作り方は、コード内がすべて英語ということもあり、少しわかりづらいものです。
以下は`SelectionSet.Select`メソッドに掲載されているサンプルコードを最低限翻訳・改変して注記を入れたものです。

```vb:AutoCAD - SelectionSet.Selectメソッド
Sub Example_Select()
  ' 円でフィルタリングして選択セットにメンバーを追加するサンプルコード

  ' 'SSET'という名前の選択セットを作成 (※この時点では中身は空です)
  Dim ssetObj As AcadSelectionSet
  Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
    
  ' 選択する範囲を表す矩形の対角線の2点を指定 (※3次元座標値 X,Y,Z を表す1次元配列) 
  Dim corner1(0 To 2) As Double
  Dim corner2(0 To 2) As Double
  corner1(0) = 28: corner1(1) = 17: corner1(2) = 0
  corner2(0) = -3.3: corner2(1) = -3.6: corner2(2) = 0
    
  ' 選択モードとして交差(矩形内部および枠線にかかっている図形を選択するモード)を指定
  Dim mode As Integer
  mode = acSelectionSetCrossing

  ' 選択フィルタの中身となる配列を作る
  Dim gpCode(0)    As Integer  ' 筆者注 : FilterTypeの中身 (常に As Integer)
  Dim dataValue(0) As Variant  ' 筆者注 : FilterDataの中身 (様々な値があるためVariant)
  gpCode(0) = 0                ' 筆者注 : 図形タイプをテキストで指定するときのDXFグループコード
  dataValue(0) = "Circle"      ' 筆者注 : 図形タイプを表すテキスト

  ' Selectメソッドの引数となる配列を作る (こちらは常にVariant)
  Dim groupCode As Variant
  DIm dataCode  As Variant
  groupCode = gpCode
  dataCode = dataValue

  ' SelectionSet.Selectメソッドを実行
  ssetObj.Select mode, corner1, corner2, groupCode, dataCode
    
End Sub
```
## コードの解説

### (1) 選択セットの作成
特にありませんが、指定した名前の選択セットが既にある場合はエラーになりますので、その対処をしておくべきかもしれません(このコードはあくまでサンプルなので……)。

```vb:AutoCAD - 指定の選択セットを最初に削除しておくサンプルコード
  On Error Resume Next
  ThisDrawing.SelectionSets("SSET").Delete
  On Error GoTo 0
```

### (2) 矩形の対角線を表す2点の指定
特にありません。点を表す変数は3要素の1次元配列です。つまり、X, Y, Z座標の値です。

### (3) 選択モードの指定
選択モードの指定は、AcSelect 列挙型で指定します。
AcSelect 列挙型には8つの定数があり、その内、Selectメソッドで5つ、SelectByPolygonメソッドで3つ使います。

### (4) 選択フィルタの中身となる配列を作る
まず、フィルタをいくつ指定するかが必要なため、要素数を指定して配列を定義しています。１つ目の`gpCode(0)`は内容が常にDXFグループコードとなるため、Integer型となります。２つ目の`dataCode(0)`は、１つ目の`gpCode(0)`に対応する値で、様々な型(Integer, Long, Single, Double, String, など)が入ってくるため、Variant型となります。

### (5) Selectメソッドの引数となる配列を作る
こちらはSelectメソッドの引数となるもので、常にVariant型である必要があります。

### (6) SelectionSet.Selectメソッドを実行
指定した条件で選択が実行されます。注意点としては、画面上で選択されているわけではなく、あくまで'SSET'という名前の選択セットに対象のオブジェクトが格納されたということです。

```vb:AutoCAD VBA
  ssetObj.Select Mode:=mode _
               , Point1:=corner1 _
               , Point2:=corner2 _
               , FilterType:=groupCode _
               , FilterData:=dataCode
```

# おわりに

(4)では、フィルタの中身を作る際にフィルタ数を決め打ちしています。汎用のフィルタ作成ファンクションを作るにあたっては、これを可変にした方が良さそうです。

次回は、Selectメソッドで指定するフィルタ(配列)を作成するファンクションプロシージャについて解説していきます。

https://qiita.com/sewege11/items/a1865544f79e220374e5

https://qiita.com/sewege11/items/78b529f118ff28c478a7
【メモ】後で削除　ソート処理

```javascript
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>重複カウント＆割合表示</title>
</head>
<body>
  <h2>テキスト入力</h2>
  <textarea id="inputText" rows="10" cols="30"></textarea><br>
  <button onclick="processText()">実行</button>

  <h2>結果</h2>
  <div id="result"></div>

  <script>
    function processText() {
      const text = document.getElementById('inputText').value;
      const lines = text.split('\n').map(line => line.trim()).filter(line => line !== '');

      const countMap = new Map();

      lines.forEach(line => {
        countMap.set(line, (countMap.get(line) || 0) + 1);
      });

      const total = lines.length;

      // 件数順にソート
      const sorted = Array.from(countMap.entries()).sort((a, b) => b[1] - a[1]);

      // 結果表示
      const resultDiv = document.getElementById('result');
      resultDiv.innerHTML = '';
      sorted.forEach(([text, count]) => {
        const percent = Math.round((count / total) * 100);
        resultDiv.innerHTML += `<div>${text}　${count}件（${percent}%）</div>`;
      });
    }
  </script>
</body>
</html>

```
GitHub の新しいリポジトリをローカル（VScode）に追加

GitHub の新しいリポジトリをローカルに追加する方法を書いておく（よく忘れるので）


![うう.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/f97af0be-c118-45cd-a651-d6ed58e20b08.png)


まずvscodeに追加するgithubのリポジトリのHTTPSを画像のところで取得しておく。
そしてターミナル上で

```bash
git init
git remote add origin https://github.com/your-username/your-new-repo.git
```

を実行する。「https://github.com/your-username/your-new-repo.git」 のところは各自変える。そして

```bash
git add .
git commit -m "Initial commit"
```

これはいつも通り

```bash
git branch -M main  # メインブランチを "main" に設定
git push -u origin main
```
で終了です。
springでのクエリビルド

### 概要
今回はjava, springboot環境にてクエリビルダーを実装したので、
ほとんどそのまま共有します。

## 開発環境想定や、Entityについて
※DBとの連携はJPAを使用しています。

Entityとしては、MainTabaleとSubTableの2つを用意します。
SubTableのフィールドには、MainTable_idを持っています。

その後、DTOに取得した情報を格納してreturnするという流れになります。

## では、早速
```service.java
@Service
public class Service {
    // クエリビルダーの準備
    @PersistenceContext
    private EntityManager entityManager;

    public List<SampleDto> queryBuilder() {
        // ビルド準備
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<SampleDto> cq = cb.createQuery(SampleDto.class);
        Root<MainTable> mainTable = cq.from(MainTable.class);

        // ここからクエリビルド
        // LEFT JOIN
        Join<MainTable, SubTable> subTable = mainTable.join("subTable", JoinType.LEFT);
        
        // WHERE
        List<Predicate> conditions = new ArrayList<>();
        conditions.add(cb.isNull(mainTable.get("enabled")));
        conditions.add(cb.equal(subTable.get("point"), 1));
        
        // COUNT
        Expression<Long> originalDate= cb.count(mainTable.get("id"));

        // ORDER BY, GROUP BY, SELECT
        // DTOクラスを作成して、MainTableとoriginalDateを紐づけてデータを扱う
        cq.select(cb.construct(SampleDto.class, MainTable, originalDate))
        .where(conditions.toArray(new Predicate[0]))
        .groupBy(mainTable.get("id"))
        .orderBy(cb.desc(originalDate));

        // SQL実行
        return entityManager.createQuery(cq).getResultList();
    }
}
```

```SampleDto.java
public class SampleDto {
    private MainTable mainTable;
    private Long originalDate;

    public SampleDto(MainTable mainTable, Long originalDate) {
        this.mainTable = mainTable;
        this.originalDate = originalDate;
    }

    // 省略
    // getter,setter
```

## 補足
今回はDTOを作成していますが、必要ない場合は作成せずにEntityの取得だけで問題ありません。

1件のデータだけを取得したい場合は、SQL実行の部分を下記のように変更してください。
``` SQL実行.java
return entityManager.createQuery(cq).getResultList();
return entityManager.createQuery(cq).getSingleResult();
```

他に質問あればコメントお願いします！
クローン時の権限継承を理解しよう！

# はじめに
こんにちは、森田と申します。
このたび、SnowPro Core認定資格に合格しました！！
そのなかで少し引っかかったクローン時の権限継承について記事にしました！

資格の詳細は、↓を見てもらえればです！
https://learn.snowflake.com/en/certifications/snowpro-core-jpn%20/

この資格は多くの人が取っているので勉強の仕方とか、
教材の話は今回しません！先人が多くいらっしゃるのでその方々を参考にしてください！！

# クローンと権限継承のルール

まず、クローンする際に従うルールは２つです。
1\. ほとんどのオブジェクトの CREATE <オブジェクト> ... CLONE ステートメントは、ソースオブジェクトの付与をオブジェクトクローンにコピー しません。ただし、 COPY GRANTS 句をサポートする CREATE <オブジェクト> コマンド（例: CREATE TABLE、CREATE VIEW）を使用すると、オプションでオブジェクトのクローンに付与をコピーできます。
2\. ソースオブジェクトがデータベースまたはスキーマである場合、クローンは、ソースオブジェクト含まれている子オブジェクトのクローンに対して付与された すべて の権限を継承
 
参照元（https://docs.snowflake.com/ja/user-guide/object-clone#access-control-privileges-for-cloned-objects）

# 噛み砕いて理解！①　

`` `ほとんどのオブジェクトの CREATE <オブジェクト> ... CLONE ステートメントは、ソースオブジェクトの付与をオブジェクトクローンにコピー しません。ただし、 COPY GRANTS 句をサポートする CREATE <オブジェクト> コマンド（例: CREATE TABLE、CREATE VIEW）を使用すると、オプションでオブジェクトのクローンに付与をコピーできます。` `` 
ちょっと難しめのですので、噛み砕いて説明します。

まず、上記文章は、基本的にはオブジェクトをクローンした場合、権限は継承されませんと言ってます。
明示的に継承を行いたい場合はCOPY GRANTS 句をサポートするオブジェクトであれば、権限を継承できます。

例えば、テーブルAがあり、ロール①がselect権限を持っていたとして、accountadminでクローンを実施した場合は、COPY GRANTS 句ありなしで権限継承が変わります。

 * COPY GRANTS 句なしでクローンした場合は、クローンテーブルAには、accountadminの所有権しか存在しません。
 * COPY GRANTS 句ありでクローンした場合は、クローンテーブルAには、accountadminの所有権とロール①のselect権限も一緒に継承されます。

# 噛み砕いて理解！②
`` `ソースオブジェクトがデータベースまたはスキーマである場合、クローンは、ソースオブジェクト含まれている子オブジェクトのクローンに対して付与された すべて の権限を継承` `` 

次に、上記文章は、データベースまたはスキーマをクローンした場合は、子オブジェクトのクローンに対して付与された すべて の権限を継承すると記載されてます。

例えば、前回の条件と同じで、テーブルAを含むスキーマtemp をクローンしたとします。

この場合、スキーマtempにあった権限はクローンスキーマtempに継承されず、accountadminの所有権しか存在しません。
しかし、子オブジェクトであるテーブルAはaccountadminの所有権に加えて、ロール①のselect権限も一緒に継承されます。

# まとめると
クローンを実行した際の権限継承は２つのルールによって実施されます。おぼえるなら、
基本的にはオブジェクトをクローンした場合、権限は継承されず、明示的なCOPY GRANTS 句が必要で。
データベース、スキーマをコピーする時の子オブジェクトは権限継承されると覚えておけば完璧です！

# 終わりに
snowflakeのクローン機能は、検証をする際や、バックアップの作成の際に強力な機能です。
しかし、オブジェクト自体のクローンは明示的におこなっているので認識できますが、裏で権限の継承も行われていることもお忘れないように！
クローンしたオブジェクトを別ロールで見たいのに、元オブジェクトは見れて、クローンは見れないで困ったり、
逆にDBクローンをした際に、別ロールに見せたくないのに、権限継承がされてみれるようになっていたりと明示的な操作の裏で実行されるのでお気をつけください！！
Amazon Q Appsでドキュメントレビューアプリを作成してみた

# 1. はじめに

**[Amazon Q Apps](https://aws.amazon.com/jp/blogs/news/amazon-q-apps-now-generally-available-enables-users-to-build-their-own-generative-ai-apps/)** は、生成AIを活用して独自のアプリケーションを構築できるプラットフォームです。エンタープライズ向けAIアシスタントである **[Amazon Q Business](https://aws.amazon.com/jp/q/business/)** の一部として提供される機能で、2024年7月10日に一般公開されました。主な特徴として、[ノーコードのビジュアルエディタを使って、自然言語の指示だけでアプリの設計、開発、デプロイが可能](https://aws.amazon.com/jp/builders-flash/202406/amazon-q-nocode-app/)なことが挙げられます。

そこで、**Amazon Q Appsを利用して実際にアプリを作成**してみました。

# 2. 作成したアプリについて
作成したアプリ (以降、ドキュメントレビューアプリ)の仕様は以下の通りです。

- Markdown記法等で記載されたドキュメントをレビューします
- レビューの基準として、社内で利用しているドキュメント品質基準を利用します
- レビューの品質向上のため、社内で利用する用語集を利用します
- レビュー結果(修正箇所、修正案、根拠)を番号付きリストで出力します

また、ドキュメントレビューアプリを利用して出力されたレビュー結果の例を以下に示します。レビュー対象のドキュメントはAWSのとある技術についての調査レポートです。

```
1. 用語・名称の統一性 (基準5)

 修正箇所：
  - 「AWS Lambda」と「Lambda」が混在
  - 「Express.js」と「Express」が混在
 修正案：
  - 文書全体で「AWS Lambda」に統一
  - 文書全体で「Express.js」に統一
 理由：同一の対象は同一の名称で表現する必要があります。

2. **文章の論理性** (基準4)

・・・(以下略)
```


# 3. 作成手順

1. ドキュメント品質基準、用語集を用意します。また、アプリ作成時に利用するPromptを作成します。作成したPromptを以下に示します。<br>
```
You are a professional editor tasked with reviewing and correcting a document for grammatical errors, spelling mistakes, and inconsistencies in style and tone. Given a file your goal is to recommend changes to ensure that the document adheres to the highest standards of writing while preserving the author's original intent and meaning. You should provide a numbered list for all suggested revisions and the supporting reason.
(訳：あなたはプロの編集者で、文法上の誤り、スペルミス、スタイルや語調の不一致などについて文書をレビューして修正する役割を担っています。与えられたファイルに対して、著者の本来の意図と意味を維持しながら、文書が最高の文章基準に準拠するように変更を提案することがあなたの目標です。提案されたすべての修正と、その根拠となる理由を番号付きリストにして提供する必要があります。)
```

2. 「Amazon Q Apps Creator」画面でPromptを入力し、「Generate」ボタンを押下します。この時点でアプリが作成されます。<br>
![apps_creator01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630028/8e15e7e6-9daa-4084-879f-9780d3cb34f2.png)

3. 作成したアプリを編集し、ドキュメント品質基準と用語集を設定します。その後、アプリを再公開します。<br>
![apps_creator02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630028/3de61579-b0aa-4edd-85dd-96e65f408c3b.png)


# 4. 考察
Amazon Q Appsについて、以下の観点での考察を示します。

#### ・アプリ作成にかかる時間や作成の難易度について
今回作成を担当したのはAWS初心者だった(AWS経験者のサポートあり)のですが、ドキュメントレビューアプリの作成にかかった時間は4時間程度でした。アプリ作成の難易度も比較的容易であったと考えられます。
これは、[1. はじめに](#1-はじめに)で示した特徴のように、生成AIを活用してノーコードでアプリを作成できる点が大きいです。
どちらかというと、Amazon Q Appsを使う前に必要となるAmazon Q Businessの設定（権限設定等）に時間を要しました。

#### ・作成したアプリの品質について
ドキュメントレビューアプリによるレビュー結果を評価したところ、適切な修正案は70%程度でした。ある程度は実用的な精度であると考えられます。これは、単にPromptだけによるアプリ生成をしただけではなく、品質基準と用語集を設定したことも1つの要因です。
一方、レビュー結果は同じドキュメントを対象としていても必ずしも一致しません。漏れのないレビューの実施は難しいです。


#### ・コストについて
Amazon Q Appsを利用するためには、Amazon Q Business Proサブスクリプションが必要で[そのコストは20USD/ユーザー/月](https://aws.amazon.com/jp/q/business/pricing/)です(本稿執筆時点)。
一方、アプリ作成の難易度も比較的容易なことで開発コストや学習コストは生成AIを利用しないアプリ開発に比べ削減できると考えられます。


# 5. おわりに
本稿では、Amazon Q Appsでドキュメントレビューアプリの作成とAmazon Web Appsについての考察を示しました。Amazon Q Appsで作成したアプリは一定の品質があり、さらに開発にかかる時間やコストは抑えられます。
開発するアプリの要件によりますが、Amazon Q Appsはアプリ作成の1つの選択肢になると思います。
生成AIを理解するための厳選Qiita記事10選

## はじめに

本記事では、生成AIに関連する注目記事を10本ご紹介します。それぞれの記事の概要をまとめていますので、ぜひ興味のあるものから読んでみてください。

---

- **➀ 生成AI(LLM)の基本原理とビジネス利用に関するご紹介**

生成AI(LLM)がどうテキストを生成し、なぜ高い応用力を持つのかを解説した入門的な記事です。ビジネス活用の事例やメリット・注意点などもカバーしており、初めてLLMを導入する企業やチームにとって参考になる内容が充実しています。まずは全体像をつかみたい方におすすめです。

https://qiita.com/nttd-furukawak/items/6cd87c5d203721026160

- **② LLMのプロンプト技術まとめ**

LLMを使いこなす上で重要となる「プロンプト（入力文）設計」に焦点を当てた記事です。複数指示の組み合わせ方や、曖昧な表現を避けるコツなど、実践的なテクニックが豊富に紹介されています。具体的な例も多く、すぐに業務や学習に取り入れられるため、プロンプトの書き方に悩んでいる方には必読の内容です。

https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80

- **③ LLMはどっちがお好き？ Markdown vs YAML 解釈しやすさ徹底比較！**

同じ情報でも提示フォーマットによってLLMの解釈がどう変わるかを、MarkdownとYAMLで比較検証しています。フォーマット選択が与える影響は意外と大きいもの。どちらを使えばプロンプト設計や整形がしやすいのかなど、具体例を通じて学ぶことができます。フォーマット設計で試行錯誤している方にとって有益な視点が得られるはずです。

https://qiita.com/yoskmr/items/d51d0018b50105f07799

- **④ OpenAI o1やo3モデルなどは、GPT4-o 以前のプロンプトテクニックと違いそう**

新しいLLMモデル（o1やo3）の特徴や、GPT4-o以前のモデルとの相違点が考察されています。特にプロンプトの設計や応答の生成で従来の手法が通用しないケースを取り上げているため、新旧モデルを横断的に使う際の注意点を学べる記事です。最新動向を追いたい人やモデル間の違いを理解したい人に最適です。

https://qiita.com/RepKuririn/items/915d726691580629f68a

- **⑤【ChatGPT】ファインチューニングをわかりやすく解説**

ChatGPTをはじめとしたLLMをファインチューニングする手順が初心者向けに整理されています。データ収集からモデルへの適用、学習後の評価といったプロセスをひととおり把握できるので、実務での活用やスキル習得に大いに役立ちます。ファインチューニングを始める前に一読しておくとスムーズに学習を進められるでしょう。

https://qiita.com/ksonoda/items/b9fd3e709aeae79629ff

- **⑥ RAG入門: 精度改善のための手法28選**

Retrieval-Augmented Generation（RAG）の基本コンセプトに加え、精度向上に寄与する28もの手法が丁寧にまとめられています。生成と検索を組み合わせるRAGは、ビジネス上の課題にも応用できる幅が広いアーキテクチャです。具体的な実装や最適化手法を探している方は一読の価値があります。

https://qiita.com/FukuharaYohei/items/0949aaac17f7b0a4c807

- **⑦ 無料で学ぶ！生成AIとバズった技術まとめ（LLM、LangChain、Dify、SAM2、Stable Diffusion、RVCなど）**

注目を集めている生成AI関連ツールやライブラリを、無料で利用可能なものを中心に網羅しています。LLM、LangChain、Stable Diffusionといったテキスト・画像生成系まで幅広く扱い、その導入手順と活用ポイントを紹介。トレンドの技術を一気に試してみたい方にぴったりの情報源です。

https://qiita.com/birdwatcher/items/b5cc66ce59095dee5625

- **⑧【入門】生成AI関連を学べる資料まとめ**

初心者が生成AI全般を学ぶのに役立つ情報を集めた便利なリンク集です。短時間で概要を把握できるドキュメントからハンズオン形式のワークショップまで、レベル別に幅広い学習資料が紹介されています。「まずは全体像をざっと知りたい」という段階の方におすすめできる、充実した入門ガイドです。

https://qiita.com/KNR109/items/57b680e1eaab4d744d68

- **⑨【教材まとめ】これ全部やったら流石に誰でもつよつよAIエンジニアになれる**

AIエンジニアに求められる数学・アルゴリズム・機械学習理論といった基礎から、深層学習フレームワークの実装まで幅広い教材がまとめられています。学習のステップが段階的に整理されているので、「何から手を付ければいいのか分からない」という方でもスムーズに学習計画を立てられる内容です。

https://qiita.com/eureka-ai/items/6c55e3b6d9617ae58afa

- **⑩ AIエンジニアって名乗れるとカッコいいので、この記事を読んでください【機械学習を解説】**


AIエンジニアの役割や、機械学習の基礎をやさしく解説している記事です。難解な数式を避けながら、どうやって実務に落とし込むのかというイメージをつかみやすく紹介しているため、これからAI分野に足を踏み入れたい方に最適な記事といえるでしょう。やるべき学習項目の全体像がつかめる点も魅力です。

https://qiita.com/nako_GEEKOFFER/items/7aaf6d2fd16ddcfee711

## まとめ
以上、生成AI関連のおすすめQiita記事10選でした。
最後までお読みいただきありがとうございます。
【Elasticsearch】KibanaをDockerで作った時に気をつけること1選

みなさんこんにちは。本日はKibanaをDockerで構築するときに気をつけたことがいいこと1選を紹介します。

唐突ですが、以下のようなエラーを見たことはありませんか？

```
[ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. getaddrinfo ENOTFOUND elasticsearch
```

もしこのエラーに困っている方はぜひ読んでみてください。お力になれるかもしれません。

## エラーの原因

compose系のファイルの設定不備である可能性があります。
以下のように設定していませんか？

```
kibana:
    image: docker.elastic.co/kibana/kibana:${VERSION}
    container_name: kibana
    environment:
      - elasticsearch.hosts=https://es01:9200
```

かくいう私もこのように設定してしまっていて、かなり時間を取られました。

## 解決策

DockerでKibanaを構築する際には設定を上書きするために、**大文字**を使う必要があります。

https://www.elastic.co/guide/en/kibana/current/docker.html#environment-variable-config

上記の失敗例を添付リンク下を参考に修正すると、以下のようになります。
```
kibana:
    image: docker.elastic.co/kibana/kibana:${VERSION}
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=https://es01:9200
```

今後は必要なドキュメントを確実にピックできるようにしていきたいです。（完全にこのページだけ漏れてしまっていました...）

ありがとうございました。

### 仲間を募集中
株式会社ホープでは、福岡で働くエンジニアを募集中です。
ぜひ、求人を見てみてください！
▼ Wantedly求人
https://www.wantedly.com/projects/1684027
▼ コーポレートサイト
https://www.zaigenkakuho.com/recruit/
「自治体を通じて人々に新たな価値を提供し、会社及び従業員の成長を追求する」
この理念の実現に向けて、今後も自治体の課題解決に取り組んでいきます。
ご応募お待ちしております！
[Linux][command] プロセス管理_ジョブ管理_jobs, &, fg, bg

# jobs  
~~~terminal
$ jobs [オプション]
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | job control | - 現在のシェルで管理されているバックグラウンドジョブと停止中ジョブの一覧を表示 |
| `-l` | list with PID | - 各ジョブのジョブ番号に加え、プロセスID（PID）も表示 |
| `-p` | print PID only | - 各ジョブのプロセスIDのみを表示 |


~~~terminal
$ jobs
[1]-  Running                 ./backup.sh &
[2]+  Stopped                 ./longtask.sh
~~~

| 表記 | 意味 |
|:--|:--|
| `-` | 直前のジョブ |
| `+` | 現在のジョブ |
| `Stopped` | 一時停止中 |
| `Running` | 実行中 |


# &
~~~terminal
# updatedb &
~~~

| コマンド例 | 説明  |
|:---|:-----|
| `updatedb &`  | `updatedb` コマンドをバックグラウンドで実行します。シェルは即座に次の入力を受け付けます。  |



# fgコマンド
~~~terminal
# fg
# fg [ジョブ番号]
~~~

| コマンド例   | 説明 |
|:--|:------|
| `fg` | カレントジョブ（最後に停止またはバックグラウンドになったジョブ）をフォアグラウンドで再開します。 |
| `fg 1` | ジョブ番号1のジョブをフォアグラウンドで再開します。 |



# bgコマンド
~~~terminal
# bg
# bg [ジョブ番号]
~~~

| コマンド例   | 説明 |
|:--|:------|
| `bg` | カレントジョブ（最後に停止したジョブ）をバックグラウンドで再開します。 |
| `bg 1` | ジョブ番号1のジョブをバックグラウンドで再開します。 |

# Ping-t
jobs
- [3199_jobs](https://mondai.ping-t.com/question_subjects/31/question_sessions/32527688/progressing_questions/498427187)


fg
- [3485_fg](https://mondai.ping-t.com/question_subjects/31/question_sessions/30521989/progressing_questions/467602308)
- [3486_fg, fg ジョブID](https://mondai.ping-t.com/question_subjects/31/question_sessions/31943721/progressing_questions/489464091)
Arcブラウザの便利機能で起きた小さなトラブル

## はじめに
以前、Flutterの公式サイトの手順に沿って環境構築を進めていた際、Arcブラウザの（自分が認識していなかった）機能に戸惑ったので、備忘録として残しておきます。

## 何が起きたか
Flutterのインストール用zipファイルをダウンロードし、公式サイトに記載されている通りに以下のコマンドを実行しました。
```bash
$ unzip ~/Downloads/flutter_macos_arm64_3.29.2-stable.zip \
       -d ~/development/
```

しかし、実行してみると以下のようなエラーが表示されました。
```terminal
unzip:  cannot find or open ~/Downloads/flutter_macos_arm64_3.29.2-stable.zip
```

「あれ？ファイルがない？」と思い、ダウンロードフォルダを確認すると、
```
Flutter macOS 3.29.2.zip
```
という全く違うファイル名で保存されていました...。

## 原因
調べてみたところ、Arcブラウザの「Tidy Downloads」という機能が原因でした。この機能は、ダウンロードするファイル名を自動的に整理し、わかりやすく変更するというもの。
この機能(Preferences>Max>Tidy Downloads)をオフにしたところ、ファイル名が元のままダウンロードされるようになりました。

## おわりに
初期設定の際に特に深く考えず設定していた機能でした。便利な機能ですが全く知らず、恥ずかしながら少し混乱してしまいました。

この記事が私と同じように「あれ？」となった方の助けになれば嬉しいです！
CursorのCPU使用率が高い原因が拡張機能でした

Cursorを使っているとCPU使用率が高くなり、PCが不安定になるほどではありませんでしたがPC寿命や電気代が心配になったので調査したところ、Import CostというVSCodeの拡張機能が原因でした。

https://forum.cursor.com/t/cursor-helper-plugin-is-killing-my-m1-cpu/2305/10

https://marketplace.visualstudio.com/items?itemName=wix.vscode-import-cost&ssr=false#review-details

Import CostはノーコードWebサイト制作サービスで有名なWixが公開している、インポートしたライブラリのサイズを表示してくれる拡張機能です。
絶賛更新停止中ですが、Wix社内でも使われていそうな拡張機能なので不思議です。

## Import Costの代替（実験使用中）
hyriousさんが作ったImport Costを使う

https://marketplace.visualstudio.com/items?itemName=hyrious.import-cost

esbuildをグローバルインストールする必要があります。
```powershell:コマンドプロンプトで実行
npm i -g esbuild
```
## 所感
VSCodeではなぜかCPU使用率が上がらず、Cursorでのみ起きていた問題だったため、AI機能が問題だと思い込んでおりCursorを使う上では仕方ないことなのだと思っていました。

Import Costについては私は比較的サイズの大きいライブラリを使うことが多く、できれば消したくありませんでした。
hyrious/vscode-import-costが問題のwix/import-costを改善するために作られたのかは分かりませんが、代替があってよかったです。
ただこちらも最後の更新が2年前なため今後心配ではあるところ。。。

wix/import-costはたしかおすすめ拡張機能として紹介されていたことでインストールしたはずですが、レビュー欄でさんざんCPU使用率の問題について指摘されていたため、自分がよく調べもせず適当にインストールしていたことに気づかされました。

拡張機能にウイルスが仕込まれる事件もあったそうなので気をつけたいところです。
* [VSCodeの一部拡張機能にファイルを暗号化して身代金を要求する悪意のある機能が仕込まれていたことが明らかに](https://gigazine.net/news/20250326-vscode-ransomware/)
* [VSCodeの偽拡張機能を作ったらダウンロードされまくり＆悪意あるコードを簡単に仕込めるVSCode拡張機能システムの欠陥も明らかになったという報告](https://gigazine.net/news/20240611-visual-studio-code-extension-risk/)
NotebookLMで社内向け製品ボットを作成しよう！

# ☕️ はじめに
こんにちは！
サッカー選手から転身してSEをしている[@よしき](https://x.com/YoshikiSasajima/)です！

最近話題のGoogleのAIツール「NotebookLM」。一言で言えば、特定のドキュメントをもとに、 **AIと対話できる“自分専用のAIアシスタント”** です。

今回はこのNotebookLMを使って、自社製品のマニュアルやFAQを読み込ませた「社内向けボット」を作成してみたので、その流れや使ってみた感想をまとめてみます。

「営業やサポートメンバーが、技術チームに毎回質問しなくても済むようにしたい」「社内ナレッジを有効活用したい」という方には、参考になるかもしれません！

https://notebooklm.google/


# ✅ 準備したもの
今回使用したものは以下の通りです：

* 自社製品の公開ページのURL（一般公開されているWebサイト）
* Googleアカウント
* NotebookLM

製品の仕様書も読み込ませようと考えていたのですが、仕様書はスプレッドシートで管理されており、NotebookLMの対応フォーマット外のため、今回は読み込みを見送りました。
なお、仕様書をGoogleドキュメントで作成・管理しておけばNotebookLMに直接読み込ませることができるため、社内ナレッジを活用したい場面ではDocs形式での整備もアリですね！



# 🔄 NotebookLMにドキュメントを読み込ませる

実際の流れはとてもシンプルです。

1. NotebookLMにログイン
1. 新しい「ノートブック」を作成
1. ノートブックにドキュメントをアップロード or Googleドキュメントと連携 or WebページのURLを追加
1. アップロードされたドキュメントを確認（自動で要約・目次が生成される）

今回は公開されている製品ページのURLを貼り付けて読み込ませましたが、NotebookLMが自動でコンテンツを解析し、構造化してくれるため、非常にスムーズでした。



# 🧵 質問してみた：どこまで実用的？
今回は、自社製品である[Chobiit for kintone](https://www.novelworks.jp/chobiit/
)の製品ページを読み込ませてみて、実際に質問をしてみました。

![スクリーンショット 2025-03-31 8.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/87e6a55f-271b-46e8-8a31-765889f5d9f8.png)

### 試しに質問してみた

「料金形態について簡単に教えて？」

![スクリーンショット 2025-03-31 8.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/2386c130-de17-47eb-8c19-710db0e01f89.png)


「IPアドレス制限をしていても利用可能？」
![スクリーンショット 2025-03-31 8.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/0de6cc9a-60a7-433f-ad55-e4ece5d7e35f.png)


「どんな場面で活用できる？」
![スクリーンショット 2025-03-31 8.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256101/c871408b-1cf4-40e1-a208-57c45b6c8e4d.png)

### 使用感・感想

回答の正確性はかなり高く、構造化されたWebページに対しても理解度が高い印象でした。
また、製品ページに載っていない質問に対しては、「提供された情報源とこれまでの会話履歴に基づくと、XXXX に関する直接的な詳細な記述は見当たりません。」というように、無理にそれっぽい回答をしてくることはありませんでした（よくありがちな“もっともらしい嘘”を言わないのは大きな安心ポイントです）。



# 📊 まとめ
NotebookLMは、ノーコードで手軽に「ナレッジ活用ボット」を作れる優秀なツールでした。
手軽に始められて、意外と高機能。

* ナレッジ共有の効率化
* 新人教育
* 営業・CS部門の一次対応強化

など、幅広い活用が期待できるので、社内のドキュメントがすでに揃っているなら、試してみる価値はあると思います。

今後もAIを活用して業務効率を高める方法をいろいろと試しながら、また記事にしていきたいと思います。
ぜひ今後もご期待ください！
windows11で、sketchup6 その33

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
sketchupで円弧を閉じてpushpullで立体にするrubyスクリプトは

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/350a3c00-ad0b-4c5f-96c5-8f3065dc9150.png)

# 

```
def testent4
	model = Sketchup.active_model
	entities = model.active_entities
	center = [0, 0, 0]
	normal = [0, 0, 1]
	radius = 5
	start_angle = 0.degrees
	end_angle = 120.degrees
	arc = entities.add_arc(center, [1, 0, 0], normal, radius, start_angle, end_angle)
	curve = arc[0].curve
	vertices = curve.vertices
	points = vertices.map!{|vertex| 
		vertex.position
	}
	points << center
	face = entities.add_face(points)
	if face
		face.pushpull(-10)
	end
end
```
脱IT初心者～コマンドプロンプトが壊れた！編～

## 本記事の読者ターゲット層
・コマンドプロンプト（Windows）が遡れなくなって困っている方
・コマンドプロンプトが壊れたけど対処法をどう調べるべきかがわからない方
・初心者エンジニア


## コマンドプロンプトが壊れたかと思った
これは僕の経験談なのですが、コマンドプロンプトが壊れました
どう壊れたか以下に再現します（画面は10のものですが、11でもServerでも大体一緒だったと思います）

「dism /online /Get-Features」を入力・実行し、表示させて確認する作業がありました。

### ～通常～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/063bb613-502c-4278-b5e2-79f6961396eb.png)

実行結果の行数が多かった場合でも、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/491c3e92-2393-4fc0-be8e-547acde5bd24.png)

上にスクロールすれば、最初まで戻って確認することができますよね？


### ～壊れた時～
同じようにコマンドを実行したのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/3fb18f8e-6e2b-4edf-8f81-c75286989103.png)

いくら遡ろうとしてもスクロールできず、
9件分の確認しかできない状況になってしまいました！！！


## 初心者にとっては大ピンチ！
経験豊富なエンジニアの方なら鼻で笑うレベルなのかもしれませんが、これは私にとっては大ピンチでした。

『コマンドプロンプト　壊れた』なんてGoogleで検索しようものなら

> AI による概要
詳細
コマンドプロンプトが壊れた場合は、システムファイルの整合性をチェックして修復したり、ディスクチェックを実行したりすることで対処できます。﻿
【システムファイルの整合性をチェックして修復する】﻿
 管理者権限でコマンドプロンプトを開きます。﻿
「sfc /scannow」と入力してEnterキーを押します。﻿
スキャンが完了するまで待ちます。﻿
破損が見つかった場合、自動的に修復が試みられます。﻿
プロセスが完了したら、PCを再起動します。﻿
【ディスクチェックを実行する】
コマンドプロンプトに「chkdsk C: /f /r」と入力し、Enterキーを押します。﻿
ディスクチェックが開始されます。﻿
エラーが見つかった場合、自動的に修復されます。﻿
チェックが完了したら、PCを再起動し、起動できるか確認します。﻿
なお、ウイルス感染が原因だった場合は、別途ウイルス駆除も必要です。﻿

こんなこと言われます。

## 解決編
よくよく壊れた後のコマンドプロンプトを見ると、スクロールバーが無いことに気付きました。
それで、コマンドプロンプトの表示とか履歴とかそういうところが怪しいと目星を付けることができて、解決に至りました。
解決方法としては、コマンドプロンプトの左上で右クリック（もしくはAlt + Space）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/817a4c92-3807-4694-8d45-fab11f613dac.png)

プロパティを選択（もしくはpを押下）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/55a09422-26f2-46a2-94ad-46e59bf29b96.png)


[レイアウト]タブにて「画面バッファーのサイズ > 高さ」を大きくするだけ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/678f9057-d08f-4e4a-b87d-a7effeed1f07.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/f23473cc-4688-43ff-8b0f-06aed2c9cdc1.png)

30だと30行しかスクロールできませんでしたが、900にしたので、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835749/954605dc-9b04-42b5-8c5c-dd671af98221.png)

無事にスクロールして遡って確認できるようになりました（コマンドは再実行が必要）


## あとがき
エンジニアに必要な問題解決能力って「なんかこれスクロールバーが無くなってね…？」みたいな気付きにあるのでは…？と思った瞬間でした。
また、AIに問題解決を任せる時代が到来していますが、問題を正しく認識し、説明する能力も必要かと思います。これはAIに関わらず人間に教えを願う場面でも同様ですね。
「コマンドプロンプト壊れた！」ではお粗末ですよ…？

とはいえIT初心者の中には同じ悩みを抱えてしまう人がいるかもしれないので、コマンドプロンプト壊れた！と検索するだけでもこの解決方法に辿りついて安心できるようになれば…と意図してのタイトルです。僕は優しいですね。

#### あとがきのあとがき
ちなみにこれなんで現場の検証用PCで画面バッファーのサイズが小さく変更されていたかは謎です。誰かの悪戯だったのでしょうか？ここを小さくするメリットや状況ってあります…？
え、僕への嫌がらせでした…？？？（完）
Salesforceでフローを作成しよう～主従関係で親レコード削除時に子レコードがある場合削除を防ぐフロー

本橋孝昭です

今回はSalesforceで主従関係で親レコード削除時に子レコードがある場合削除を防ぐフローの作成方法について解説します

今回は例として
・カスタムオブジェクト「子オブジェクト」と標準オブジェクト「取引先」は主従関係である
・標準オブジェクト「取引先」削除の際にカスタムオブジェクト「子オブジェクト」レコードが１つでもある場合削除不可の設定にする

という設定を行おうと思います


カスタムオブジェクト「子オブジェクト」はこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0b3b89fb-2294-4ceb-8a33-3d8f3af6102f.png)


フローの全体像はこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/29ec52cb-9118-41d1-acbb-ce80f7f42450.png)

レコード取得はこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c43de44c-c2bf-45fc-9c20-a39597c69395.png)

決定はこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5bda7a77-533d-455a-9a8b-892d1f185c23.png)

カスタムエラーはこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b12b451e-19a8-40f9-9963-922eeb5bf348.png)


この設定によりもしも取引先レコード削除時にカスタムオブジェクト「子オブジェクト」がある場合はエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/89f6ae21-8f31-4cba-9113-16aff141d181.png)
Huggingfaceデータ処理

# はじめに
Huggingfaceにいる機械学習のマルチモーダルデータセット（画像、動画、オーディオ）は大体サイズが大きいし、数も多い。全部ダウンロードするとしんどいし、時間かかります。そこで、自分のノートのため、Huggingfaceからデータセットをダウンロードするや処理をまとめます。


今回の記事で、例としてオーディオデータセットを保存します。オーディオデータを保存するためには```soundfile```ライブラリーが必要となります。まず必要ライブラリーをインストールします。

```pip
pip install datasets soundfile
```

```datasets```はHuggingfaceのデータセットをアクセスできるようになるため必要なライブラリーです。

# データセットのロード

今回の記事では以下の「原神インパクト」キャラ音声データセットをサンプルとして使います。
https://huggingface.co/datasets/simon3000/genshin-voice


```python:load_ds.py
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
```

これでデータセットのロードを完了しました。
このデータセットは約228GBの大きさで、すべてをダウンロードするとしんどいです。
そこで、部分的だけをダウウンロードするかにします。


# フィルター

まずはフィルターを使用します。
フィルターのフォーマットが以下とないります。

```python
# filter(lambda x: x[キー]の条件)
dataset.filter(lambda x: x["language"] == "English")
dataset.filter(lambda x: x["speaker"] == "Klee")
```

「キー」の条件アイテムはデータセットのページのData Studioで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156398/a092fe5d-717c-44e5-a4d1-c8b402c22981.png)


今回の例でオーディオの言語を英語と日本語をせっていし、テキストやトランスクリプトありオーディオだけをフィルターします。


```python:load_ds.py
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
voiceDS = dataset.filter(lambda voice: voice["language"] in ["English(US)", "Japanese"] 
                        and voice['speaker_type'] == 'TALK_ROLE_NPC'
                        and voice['transcription'] != '')

```


# サブサンプル

またすべてのデータをありのままでいくつかのサンプルを取ることも可能です。以下のスクリプトで1000 Rowのデータを回収します。

```python:load_ds.py
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)
voiceDS = dataset.take(1000) # dataset.take(データの数)

```

# まとめてデータ保存

上のスクリプトをまとめて、回収データをローカルで保存します。


```python:load_ds.py

######################################## (1) データセットロード
from datasets import load_dataset
dataset = load_dataset('simon3000/genshin-voice', split='train', streaming=True)

# データセットをフィルターする
voiceDS = dataset.filter(lambda voice: voice["language"] in ["English(US)", "Japanese"] 
                        and voice['speaker_type'] == 'TALK_ROLE_NPC'
                        and voice['transcription'] != '')

# フィルターされたデータセットをサンプルする
voiceDS = voiceDS.take(1000)

######################################## (2) ローカルフォルダー準備
import os
ds_folder = 'dataset/simon3000_genshin-voice'
audio_folder = 'audiods'
os.makedirs(f"{ds_folder}/{audio_folder}", exist_ok=True)


######################################## (3) オーディオデータ保存
import soundfile as sf
for i, voice in enumerate(voiceDS):
    sf.write(audio_path, voice['audio']['array'], voice['audio']['sampling_rate'])
```
【Outsystems】DataActionとAggregateの違い

# 初めに
画面に情報を表示するために、基本的にはAggregateとDataActionを使っている。
自分のメモのために使い分けの基準をメモしておこうと思う。

# 環境
Service Studio Version 11.54.37
Reactive Web

# DataActionとAggregateの違い
## Aggregateはテーブルの機能の実装がしやすい
AggregateやDataActionをそのままScreenに配置すればTableが簡単に実装できるのは両方同じであるが、
Aggregateはそのままページネーションやソート機能が実装される。

## DataActionはEntity以外のリソースにアクセスできる
AggregateはEntityからのみ情報を取得する。DataActionはServerActionから情報するためその他のリソースから情報を取得することができる。

### SitePropertyの値を取得する
SitePropertyで設定されている値を取得するのに使うことができる。画面に表示する環境名を取得するのによく使っている。

### 外部APIの値を取得する
他システムから画面表示のために都度情報を取得する必要がある場合は、DataActionにて外部API経由で値を取得する。

## DataActionは処理を実装することができる
AggregateやServerActionで取得した値を編集することができる。独自の集計処理や、データの整形処理を実行することができる。

## DataActionは情報を隠匿できる
DataActionはAggregateで取得した値であっても、画面で利用しない値に関しては返却しない。
- 隠匿したい情報が露出しにくい
- データの通信料が削減できる

といったメリットがある。
Aggregateについても公式ドキュメントに利用しない値は返却しない旨があったと思ったのですが、Chromeの開発者ツールで確認したところDataActionは隠匿され、Aggregateでは隠匿されない結果となった。

# さいごに
データの隠匿については双方変わりのないものと思っていたので意外だった。
またAggregateでTableを作成したときに自動でページネーションやソートが実装されるのはよいが、それが必要かどうかはきちんと考えて機能を削除するか残すかは考えないといけない認識をあらたにした。
ハートマークサウンドランプを正ピークトリガーにして遊ぶ(1)企画編


問題点
----

- 表示が遅いわりには、いろいろ、おかしい。

要求点
----

- 音声に正しく、反応してほしい。

技術的な解決方法
----

- 常に環境音を拾っている
- ある、一定のピークを越える波形が来たら光らせる
- 平均化して、周波数が低い音に反応する

![o_coq852.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d1a297b7-7e4f-4ecf-8605-b50ef88aa9c1.jpeg)



目標
----

- 絶滅メディア博物館でやる「スタックチャンフェス」(20250405)まで

いろいろ、おまけ
----

雑でも実際に作って、みないと、わからん
単に光るガジェットは、大量生産を考えると安いチップ使う必要があり、アルゴリズムが限られる(だから、なんだ)

続き
----

https://qiita.com/caa45040/items/67528900b7a0b387de8e