OmniAICreator/Qiita-1.07M huggingface dataset:
MacにDocker、MySQL、Pythonローカル構築する

### 最初に

Docker、MySQL、Pythonを使用するので構築していきます。

## 1. Dockerのインストール

#### Dockerとは？
Dockerはコンテナ化技術で、アプリケーションとその依存関係をまとめてパッケージ化し、どの環境でも一貫して動作させることができます。これにより、開発環境と本番環境の違いによる動作不良を防ぐことができます。

#### インストール手順
1. [Dockerの公式サイト](https://www.docker.com/products/docker-desktop)にアクセスし、Mac用のDocker Desktopをダウンロードします。
2. ダウンロードした`Docker.dmg`ファイルを開き、Dockerアイコンをアプリケーションフォルダにドラッグ＆ドロップします。
3. インストールが完了したら、アプリケーションフォルダからDockerを起動し、利用規約に同意します。

インストール後、ターミナルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333535/ca6bec3f-0479-47ed-a496-6c617edd312c.png)
以下のコマンドを実行してDockerが正しくインストールされたか確認します。
```sh
docker --version
```

## 2. MySQLの設定

#### DockerにMySQLをインストール
ターミナルで以下のコマンドを実行してMySQLのDockerイメージを取得します。

```sh
docker pull mysql
```

バージョンがされればインストールされています。

#### MySQLコンテナの起動
以下のコマンドを実行してMySQLコンテナを起動します。

```sh
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -d mysql:latest
```

`your_password`は任意のパスワードに置き換えてください。

コンテナが起動しているか確認するには、以下のコマンドを実行します。

```sh
docker ps
```

起動中のコンテナリストに`mysql-container`が表示されるはずです。

## 3. Pythonのインストール

#### Pythonのインストール手順
1. [Pythonの公式サイト](https://www.python.org/downloads/)にアクセスし、最新のPython 3.xバージョンをダウンロードします。
2. ダウンロードしたインストーラを開き、指示に従ってインストールを完了します。

インストール後、ターミナルで以下のコマンドを実行してPythonが正しくインストールされたか確認します。

```sh
python3 --version
```

#### 仮想環境の作成（任意）
Pythonの開発を効率的に行うために、仮想環境を作成することをお勧めします。仮想環境の作成方法については、[【Python環境構築】VSCodeとvenvを使った環境構築](https://qiita.com/Code-999waltz/items/900ec14a7eb9be98465c)をご参照ください。

### 4. Docker上のMySQLとPythonを連携する

#### 必要なパッケージのインストール
PythonからMySQLにアクセスするためには、`mysql-connector-python`パッケージをインストールする必要があります。

```sh
pip3 install mysql-connector-python
```

#### MySQLへの接続を行うPythonスクリプト
以下のPythonスクリプトを作成し、MySQLに接続してデータベースを表示します。

```python
import mysql.connector

# MySQLコンテナへの接続設定
config = {
    'user': 'root',
    'password': 'your_password',
    'host': '127.0.0.1',
    'port': '3306',
    'database': 'mysql'
}

# MySQLに接続
connection = mysql.connector.connect(**config)

cursor = connection.cursor()

# クエリの実行
cursor.execute("SHOW DATABASES;")

# 結果の表示
for db in cursor:
    print(db)

# 接続のクローズ
cursor.close()
connection.close()
```

`your_password`は先ほど設定したパスワードに置き換えてください。

## まとめ
これで、Mac上にDocker、MySQL、Pythonの環境が整いました。これを基にしてWeb APIを構築するための準備ができました。次のステップとして、FlaskやDjangoなどのフレームワークを使用してWeb APIを実装することを検討すると良いでしょう。

また、追加の便利なツールや、MySQLの管理ツールとして人気のある「phpMyAdmin」や「MySQL Workbench」の導入も検討すると良いと思います。

社内でなどの商用利用する場合はDockerはコマンドラインで使用する仕様を使用していく必要があります。
【Vue.js】 Vuex　クイックスタートガイド(1)

## はじめに
グローバル状態管理であるVuexのクイックスタートアップガイドです。
このガイドでは、Vuexを使用してシンプルなグローバルストアを設定し、コンポーネント間で状態を共有する方法を説明します。

### 1. Vue プロジェクトのセットアップ
まず、Vueプロジェクトを作成し、必要な依存関係をインストールします。

```
npm install vuex
```

2. プロジェクトのディレクトリ構造
以下のようなディレクトリ構造を作成します。

```
/js
  ├── /components
  │   ├── VuexComponentA.vue
  │   └── VuexComponentB.vue
  ├── /pages
  │   └── Index.vue
  ├── /store
  │   └── index.js
  ├── app.css
  ├── bootstrap.js
  ├── app.js
  ```
  
### 3. グローバルストアの設定
/src/store/index.js に以下のコードを追加します。

```javascript
import { createStore } from 'vuex';

const store = createStore({
  state: {
    count: 0,
  },
  mutations: {
    increment(state) {
      state.count++;
    },
  },
  actions: {
    increment(context) {
      context.commit('increment');
    },
  },
  getters: {
    count: (state) => state.count,
  },
});

export default store;
```

### 4. アプリケーションの初期化
/src/app.js に以下のコードを追加します。

```javascript
import './bootstrap';
import '../css/app.css';

import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3';
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
import { ZiggyVue } from '../../vendor/tightenco/ziggy';
import store from "@/store/index.js";
const appName = import.meta.env.VITE_APP_NAME || 'Laravel';

createInertiaApp({
    title: (title) => `${title} - ${appName}`,
    resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')),
    setup({ el, App, props, plugin }) {
        return createApp({ render: () => h(App, props) })
            .use(plugin)
            .use(ZiggyVue)
            .use(store)
            .mount(el);
    },
    progress: {
        color: '#4B5563',
    },
});
```

### 5. Vue コンポーネントの作成
以下のように、Vueコンポーネントを作成します。

/src/components/VuexComponentA.vue

```javascript
<template>
    <div>component A</div>
    <div>countの値は{{ count }}</div>
</template>

<script setup>
import { useStore } from 'vuex';
import { computed } from 'vue';

const store = useStore();
const count = computed(() => store.state.count);
</script>
```

/src/components/VuexComponentB.vue

```javascript
<template>
    <div>component B</div>
    <button @click="inc">インクリメント</button>
</template>

<script setup>
import { useStore } from 'vuex';

const store = useStore();
const inc = () => {
  store.dispatch('increment');
  console.log(store.state.count);
};
</script>

```
/src/pages/Index.vue

```javascript

<script setup>
import VuexComponentA from '@/components/VuexComponentA.vue';
import VuexComponentB from '@/components/VuexComponentB.vue';
</script>

<template>
    <div>Vuex test</div>
    <VuexComponentA />
    <VuexComponentB />
</template>

```
6. アプリケーションのビルドと実行
```
npm run dev
```

### ポイント
着目ポイントは、並列関係にあるコンポーネント<VuexComponentA> , <VuexComponentB>の間で値をprops, emitなどの受け渡しを行っていないにも関わらず、変数の値を共有しているということです。
グローバルなデータストアとして、利用することでpropsのバケツリレー問題を回避できます。


### まとめ
このガイドでは、Vuexを使用してシンプルなグローバルストアを設定し、コンポーネント間で状態を共有する方法を説明しました。基本的なストアの設定から、コンポーネントでの状態の取得および変更方法を示しました。これを基に、より複雑なアプリケーションに対応するためにはさらなる拡張が必要になるでしょう。
GUI（エクスプローラ）でwindows↔WSLでファイルを移動させる方法

お疲れ様です。秋並です。

WSLでは基本的にCUIでコマンドを使ってファイルを操作することになりますが、たまにエクスプローラを使ったGUIによる操作をしたい時があります。

<br>

例えば、下動画のようにwindows上にあるファイルをWSLに移動するような場合がこれに当たるかなと思うので、今回はこれを例に説明します。
(もちろん、`mv` や `cp` コマンドで移動やコピーはできますが、パスを確認するのがめんどくさかったりするので）

![wsl_explore.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/04cccb08-4f7a-fdfd-851f-a7e6fa4798c2.gif)


# 手順
１. WSLでファイルを移動したいディレクトリに移動します
    
```shell
cd <操作したいファイルがあるディレクトリ>
```

<br>

２. windowsのエクスプローラを起動するコマンドを、「カレントディレクトリ `.`」を指定して起動します。

```shell
explorer.exe .
```

<br>

３.マウスを使って、ファイルを移動します。
Amazon Sagemaker Studio インスタンスサイズの目安表

# はじめに
日頃、仕事でAWSのAmazon Sagemaker Studioを使っています。
使用目的は
・データの集計やリスト作成
・機械学習モデルの作成
の２つがあり、９：１くらいで集計作業が多いです。

⇒意思決定支援のためのデータ分析が主目的のため

こちらの記事では、コスパよく使うためのコツを記事にしました。

https://qiita.com/LekcentM/items/b2b12bbaa77274dbf763

今回は、「結局どのくらいのメモリサイズを選べばいいの？」を整理してみます。


ご注意※私の日頃の感覚に基づく選定なので、あまり根拠はありません。

# インスタンスサイズ表

### メモリ最適化インスタンス
| インスタンス   | vCPU | メモリ | データ量目安                |
|----------------|------|--------|-----------------------------|
| ml.r5.large    | 2    | 16 GiB | ～2GBのファイル　数個       |
| ml.r5.xlarge   | 4    | 32 GiB | ～2GBのファイル　5～10個    |
| ml.r5.2xlarge  | 8    | 64 GiB | ～5GBのファイル　数個       |
| ml.r5.4xlarge  | 16   | 128 GiB| ～5GBのファイル　5～10個    |
| ml.r5.8xlarge  | 32   | 256 GiB| ～10GBのファイル　数個      |
| ml.r5.12xlarge | 48   | 384 GiB| ～10GBのファイル　5～10個   |
| ml.r5.16xlarge | 64   | 512 GiB| ～20GBのファイル　数個      |
| ml.r5.24xlarge | 96   | 768 GiB| ～20GBのファイル　5～10個   |



### データ量のレコード数と列数のイメージ
| データ量目安       | レコード数×列数     |
|--------------------|----------------------|
| ～2GBのファイル    | 150万×200           |
| ～5GBのファイル    | 250万×250           |
| ～10GBのファイル   | 500万×300           |
| ～20GBのファイル   | 1500万×200          |

# インスタンスのGiBとデータ量目安の差について

勘がいい方は、だいぶ余裕あるな～という印象かもしれません。

例えば下記であれば、2GBのファイルを4個読み込んでも
**2GB*4=8GB**しか消費しませんね。
###
| インスタンス   | vCPU | メモリ | データ量目安                |
|----------------|------|--------|-----------------------------|
| ml.r5.large    | 2    | 16 GiB | ～2GBのファイル　数個       |

実際には、各種計算に使うメモリ分も必要なので、読み込んだデータだけで半分近く消費してしまうとインスタンスが**ぶっ飛ぶ**可能性が高くなります👹

※ぶっ飛んでも、インスタンス上で読み込んでいた作業中のデータがすべてリセットされるだけなのでご安心ください。
※※　切りのいいところで、pklファイル等に保存しておくと安心ですね✨

# 最後に
今回は、使用するインスタンスサイズの目安表をご紹介しました💡
「とりあえず、大きいインスタンス使っとけばいいか」という方は、ぜひ見直してみて下さいね！
AWS SageMaker JumpStartを触ってみた

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です！
今回はAWS SageMaker JumpStartについて記事を書いてみました！
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです！！

# 概要
先日AWS Summitに現地参加してみて、生成AIやAWSの生成AI系サービスに興味を持ったので実際に触って見ることにしました。今回は数クリックでファインチューニングができるというSageMaker JumpStartを触ってみました。

# 生成AI活用で感じる課題
実際に生成AIをプロダクトに組み込んでいくとなると下記のような心配が上がると思います
- 新しいモデルが次々と出てきてキャッチアップが大変
- AIに関する知見がなくて、ファインチューニングって難しそう
- データが外に流出してしまうのではないかとセキュリティやプライバシー面で心配

# SageMaker JumpStart
SageMaker JumpStartを利用すれば、前項であげたような課題の大半を解決できるように感じました
## 課題と解決
### 新しいモデルについていく大変さ、ファインチューニングって難しそう
- SageMaker JumpStartコンソールから利用でき、ぽちぽちと設定するだけ
- データをAWS内部に閉じて保管することができるので、外にでてしまう心配が減る
- 脆弱性診断のセキュリティスキャンを受けている
- 最新のモデル36種類ほどに対応しているし、数クリックでデプロイできる
- 日本語モデルもある
### セキュリティとプライバシー
- HIPAA（ひっぱ）に準拠している
- 金融やEUのような堅めなところでも使われている

## 使い方
### SageMaker Studio
- 使ってみたいモデルを選択する
- クリックするとモデルの詳細ページが開きます
### モデルの詳細ページ
- 下記のような内容がかいてあります
    - モデルのサイズと説明
    - ライセンス
    - ユースケースと使用方法
### 自分のデータでモデルをカスタマイズ
- 自分たちのデータを使ってカスタマイズができます
### SDKを利用して自動化
- MLOpsパイプライン
### ファインチューニング
- モデルを学習させるための用意したデータセットのパスを指定するだけ
- S3に保存したら、S3パスを設定するだけ
- モデルの学習をクリックする
- コストやスループット、レイテンシの設定もできるようです
### ワンクリックでSageMakerにデプロイ
- 学習が終わったらモデルのデプロイをクリック
- オートスケーリングの設定などもできます
- ネットワークや暗号化などの設定もできます

# 参考
- [Amazon SageMaker JumpStart](https://aws.amazon.com/jp/sagemaker/jumpstart/)
- [HIPAA](https://www.hhs.gov/hipaa/index.html)
requiredで複数チェックボックスを、１つ以上のチェックを必須にする　備忘録＃４

### シンプルな使い方

``` diff_html
HTML
<table border="1">
    <tr>
      <th>商品</th>
      <th>値段</th>
    </tr>
    <tr>
      <td>
+        <input type="text" name="name" required>
      </td>
      <td>
+        <input type="text" name="price" required>
      </td>
    </tr>
  </table>
```

このように、inputタグないに`required`とすることによって、
テキストエリアに入力されず、登録ボタンを押された場合、以下のような表示になります。

![スクリーンショット 2024-06-22 14.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807467/13dfde3e-1cf5-e1f9-17f2-0f5e61a178ac.png)

### セレクトボックスの場合



```diff_html
  <h3 style="margin-bottom: 0;">カテゴリー</h3>
+  //チェックボックスにクラス属性をつける
 <input type="checkbox" name="genre" class="genre-selection">本
 <input type="checkbox" name="genre"  class="genre-selection">DVD
 <input type="checkbox" name="genre"  class="genre-selection">ゲーム
 <input type="checkbox" name="genre"  class="genre-selection">楽器
    
 
  <table border="1" style="margin-top: 30px;">
     <tr>
       <th>商品</th>
       <th>値段</th>
     </tr>
     <tr>
       <td>
         <input type="text" name="name" required>
       </td>
       <td>
         <input type="text" name="price"required>
       </td>
     </tr>
   </table>
  <button>登録</button>
  </form>
  
  <!-- 判定のため、JavaScriptを追加 -->
  <script>
      (() => {
          // チェックボックスのinputタグを取得
          const checkBoxElements = Array.from(document.getElementsByClassName("genre-selection"));
  
          const errorMessage = "1つ以上の選択肢を選択してください。";
          checkBoxElements
              .forEach(m => {
                  // エラーメッセージを、カスタムなものに変更
                  m.setCustomValidity(errorMessage);
  
                  // 各チェックボックスのチェックのオン・オフ時に、以下の処理が実行されるようにする
                  m.addEventListener("change", () => {
                      // 1つ以上チェックがされているかどうかを判定
                      const isCheckedAtLeastOne = document.querySelector(".genre-selection:checked") !== null;
  
                      // 1つもチェックがされていなかったら、すべてのチェックボックスを required にする
                      // 加えて、エラーメッセージも変更する
                      checkBoxElements.forEach(n => {
                          n.required = !isCheckedAtLeastOne
                          n.setCustomValidity(isCheckedAtLeastOne ? "" : errorMessage);
                      });
                  });
              });
      })();
  </script>
```

これでできる。

参考サイト

https://tech.excite.co.jp/entry/2023/12/18/153923#1つ以上のチェックを必須にする方法正しい方法
[Dify]現状Difyができないこと

## 前提
Difyのバージョンは ~~`Dify：0.6.11`~~ `Dify：0.6.13`です。
今の最新バージョンで現状できないことをまとめてみました。
いろんな人がXでDifyでできることをあげていってくれていますが、あまりできないことをまとめている人はいなかったのでまとめた次第です。
「探索に時間を費やしたけど結局できなかった...」となる人が少なくなること祈って書いています。

## ループ処理の制限
現在のDifyでは、特定の条件を満たすまでループを回す処理の実装が困難です。例えば、Self-RAGのような自己反復型のRAGの実装ができません。
### 一時的解決策
現状見つかっていないです。実装方法あったら教えてください。

## ~~モニタリングツール（LangSmith、Langfuse）との連携~~ (0.6.12からできるようになりました)
できるようになったので、混乱を与えないため内容は削除しました。

## AIモデルの精度評価
Dify上での直接的なAIモデルの精度評価機能が不足しています。ログに対して、「いいね！」とか「よくないね！」とかはつけることができますが、数値的な精度評価はできないと思ってもいいでしょう。

### 一時的な解決策
- 「いいね！」とか「よくないね！」をつけた後、直接postgreSQLに入って集計とかはできるのでそれをするのが直近はいいかもしれないです。
- 例えば、Google Colabなどで専用のスクリプトを用意し、DifyのAPIを呼び出してRagasなどの評価ツールを実行することで、ある程度の評価は可能です。以下でブログ書いてます。
https://qiita.com/hudebakononaka/items/1d3665223b0715e54890

## コードノードのPythonライブラリに制限

Difyのコードノードで使用できるライブラリが非常に限られています。本当はコードノードの中でnumpyやpandasが使いたいのです...
しかし、サンドボックス環境にインストールできるライブラリが少なく、他のライブラリをインストールしようとすると権限エラーが発生します。

### 一時的な解決策
現時点では、この問題に対する明確な解決策はありません。　~~しかもサンドボックスはOSSになっていないのでコードを書き換えることすらできません。~~ 
最近OSSになったっぽい？？

https://github.com/langgenius/dify-sandbox

一応こんな方法もあるみたいです。

https://qiita.com/teijyou/items/516c9b7b48afb7286279

## バージョン管理
バージョン管理できない。更新中は変更時の内容を保持しているが、セッションが変わると消えてしまう。
これはまあまあ辛い。

### 一時的な解決策
一応DSLのインポート・エクスポートでバージョン管理はできます。例えば、GitHubに手動でアップロードして、タグを売っておくようなことですね。(タグは打たなくてもいいですが)
結構面倒ですよねこれ。もっといい方法があれば知りたい。

## ナレッジグラフの実装
現在のDifyではナレッジグラフの直接的な実装が困難です。ここまでナレッジの機能が付いてたらDifyはなんでもできる最高ツールになってしまいますね。
### 一時的な解決策
外部APIとしてなんか用意したらできそうですが、Difyでやるの範囲を超えていますね。

## PDFの直接入力
ワークフローやChatFlowでPDFファイルを直接入力として使用することができません。これめちゃくちゃほしい機能ですね。
### 一時的な解決策
現在のところ、PDFをナレッジベースに追加する方法しかありません。
この機能の追加は計画されているようですが、実装時期は未定です。
https://discord.com/channels/1082486657678311454/1247812435105026048/1247829544400846858

## (できるけど不満)人間の介在を要する処理
人間の介入を必要とする処理のほとんどは実装可能です。
ChatFlowなどで、チャットの内容に基づいてフェーズを変更することは可能ですが、理想的にはボタンベースでの切り替えなどができるとGUIベースで作られている意味を感じますね。

## 最後に

上記で記載したものはどうにかできないか探ったところなのですが、いまいち実現できませんでした。
今後実装される予定のものもあるので今後に期待ですね。
Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto
生成AI活用における一般的課題とAWSの生成AI系サービスの活用

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です！
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです

2024年6月20日と21日に幕張メッセにて開催されたAWS Summit Tokyoに参加してきました。今年は生成AI活用とBedrock、Claude3.5一色だったなと言っても過言ではないくらい、生成AIが多くのセッションや事例紹介ブースで触れられていました。そこで、AWS Summitにて学んだことをアウトプットしたく、記事を書くことにしました。

# 生成AI活用における一般的な課題や懸念点
## 柔軟性と発見性
- 新しいモデルがどんどん出てくるからエコシステムについていくのが大変
## セキュリティとコンプライアンス
- インプットデータを他社に使われてしまわないか
- インプットしたデータを再学習に利用されてしまわないのか
- 海外リージョンにデータが保管されるのか、されないのか
## カスタマイズと評価
- ドメインに特化したモデルもあったりするからどれを選ぶのか
## 可溶性
- １分当たりのトークン数の上限
- １分当たりの利用回数制限
## コスト
- リクエストあたりの金額
- トークンあたりの金額
    

# AWSの生成AI系のサービス
## Amazon Bedrock
- 用途
    - 基盤モデルを利用して生成AIアプリケーションを構築およびスケーリングすることができる
- 利点
    - ログは強制保存されないし、問題が起きた際もAWS社員がログを確認することはない
        - 機密データやログが外部に見られてしまうこともない
    - 固定コストなしの従量課金、モデルが３つあるので使い分けで節約が可能
    - バージニア北部とオレゴン州から最新版がりりーすされるが、Tokyoリージョンも対応
## SageMaker JumpStart
- 用途
    - モデルの限界を引き出す
    - ファインチューニングをする
- 利点
    - SageMaker JumpStartコンソールから利用できる
    - データをAWS内部に閉じて保管することができる
    - 脆弱性診断のセキュリティスキャンを受けている
    - 最新のモデル36種類ほどに対応しているし、数クリックでデプロイできる
    - 日本語モデルもある
    - HIPAA（ひっぱ）に準拠
    - 金融やEUとかでも使われている

# 参考
- [Amazon Bedrock](https://aws.amazon.com/jp/bedrock/?refid=38cc0cc4-7da9-4785-9231-aba910a719d1)
- [Amazon SageMaker JumpStart](https://aws.amazon.com/jp/sagemaker/jumpstart/)
robloxでassistant その109

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、ボタンを作れ。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。

```

local Players = game:GetService("Players")
local Player = Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
local Gui = Instance.new("ScreenGui")
Gui.Parent = PlayerGui
local button = Instance.new("TextButton")
button.Name = "button"
button.BorderSizePixel = 0
button.TextSize = 20
button.TextColor3 = Color3.new(1, 0.2, 0.4)
button.AnchorPoint = Vector2.new(0.5, 0.5)
button.Size = UDim2.new(0.4, 0, 0.1, 0)
button.Position = UDim2.new(0.5, 0, 0.5, 0)
button.SizeConstraint = Enum.SizeConstraint.RelativeYY
button.Text = "Click Me"
button.Parent = Gui
button.Active = true
button.MouseButton1Click:Connect(function()
	print("ok1")	
end)
button.MouseButton2Click:Connect(function()
	print("ok2")	
end)





```

# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ee0667d7-9fba-87b4-db95-7926e47b7654.png)


以上。
EloquentのorWhereメソッドの使い方とSQLの論理評価について

:::note
<details><summary >AI要約</summary>

- orWhereメソッドは、複数の条件のいずれかを満たすレコードを取得します
- 基本的な使い方では、statusがactiveまたはroleがadminのユーザーを取得します
- 複数のorWhereを連続して使用して、さらに多くの条件を追加できます
- クロージャを使うと、複雑な条件をグループ化してネストできます
- SQLのOR条件は、左辺がTRUEの場合、右辺の評価をスキップする短絡評価を行います
</details>
:::

## はじめに
`orWhere`を使ってると何やら評価されていない条件があると感じたので調べたら条件分岐のORと同じ評価基準なんですね
せっかくですので`orWhere`の使い方と評価基準についてまとめてみましたのでぜひご覧ください！

## orWhereメソッドの基本的な使い方
`orWhere`メソッドを使用すると、複数の条件のうちどれか一つでも満たすレコードが取得できます

### 基本的な`orWhere`の使用
```php
$users = User::where('status', 'active')
             ->orWhere('role', 'admin')
             ->get();
```

このクエリは、`status`が`active`であるか、`role`が`admin`であるユーザーを取得します
SQLに変換すると次のようになります
```sql
SELECT * FROM users WHERE status = 'active' OR role = 'admin';
```

##  複数の条件を組み合わせる
`orWhere`を使用して複数の条件を組み合わせることもできます
また、クロージャを使ってネストされた`orWhere`条件を追加することも可能です

### 複数の`orWhere`を連続して使用
```php
$users = User::where('status', 'active')
             ->orWhere('role', 'admin')
             ->orWhere('created_at', '>', now()->subDays(30))
             ->get();
```
このクエリは、次のいずれかの条件を満たすユーザーを取得します
1. `status`が`active`である
1. または`role`が`admin`である
1. または`created_at`が過去30日以内である

SQLに変換すると次のようになります
```sql
SELECT * FROM users WHERE
    status = 'active' 
    OR role = 'admin' 
    OR created_at > NOW() - INTERVAL 30 DAY;
```

### クロージャを使ったネストされた条件
```php
$users = User::where('status', 'active')
             ->orWhere(function ($query) {
                 $query->where('role', 'admin')
                       ->Where('created_at', '>', now()->subDays(30));
            })
            ->get();
```

このクエリは、次のいずれかの条件を満たすユーザーを取得します
1. `status`が`active`である
1. `rorle`が`admin`であり、かつ`created_at`が過去30日以内である

SQLに変換すると次のようになります
```sql
SELECT * FROM users WHERE
    status = 'active' 
    OR (role = 'admin' AND created_at > NOW() - INTERVAL 30 DAY);
```

## SQLの評価論理におけるORの挙動
SQLにおける`WHERE`句の`OR`条件は、通常の論理評価に準拠しています
これは、左辺が`TRUE`の場合、右辺の評価がスキップされることになります（短絡評価）

さきほどのクエリを見てみます
```sql
SELECT * FROM users WHERE status = 'active' OR role = 'admin';
```
このクエリは、`status`が`active`の場合、その行は即座に`TRUE`と評価されるため、`role = 'admin'`の評価は行われません
同様に`status`が`active`出ない場合のみ、`role = 'admin'`の評価が行われます

## まとめ
Eloquentの`orWhere`メソッドを使用すると、複数の条件のいずれかを満たすレコードを取得できます
複雑な条件を扱う場合、クロージャを使って条件をグループ化できます
また、SQLの`OR`条件は左辺が`TRUE`の場合、右辺の評価がスキップされるようになりますのでクエリを組み立てる際は注意が必要になってきます
【Vue】Computedに関するメモ

## はじめに

こんにちは、Mottyです。
今回はリアクティブな処理に関するComputedについての簡易メモとなります。

### Computedプロパティについて
computedプロパティはリアクティブな値の変更のみを感知します。computedプロパティは依存しているリアクティブな値が変更されたときに自動的に再計算されます。例えば、以下のようなコードを考えてみます↓

```vue
<script setup>
import { ref, computed } from 'vue';

const count = ref(0);

const doubleCount = computed(() => {
  return count.value * 2;
});

// count.valueを変更するとdoubleCountも自動的に更新される
</script>
```


この例では、countがリアクティブな値として定義されており、doubleCountはcountに依存しているため、count.valueが変更されると自動的にdoubleCountも再計算されて更新されます。

リアクティブではない値を使用している場合、その値の変更は感知されません。例えば、次のような場合↓

```vue
<script setup>
import { ref, computed } from 'vue';

let nonReactiveValue = 0;

const count = ref(0);

const doubleCount = computed(() => {
  return count.value * 2 + nonReactiveValue;
});

// nonReactiveValueの変更はdoubleCountに影響を与えない
</script>
```


この場合、nonReactiveValueはリアクティブではないため、nonReactiveValueの値を変更してもdoubleCountは再計算されません。computedプロパティは依存しているリアクティブな値が変更されたときのみ再計算されるという性質を持っています。
IntellijIDEAでpython+Docker+poetryの開発環境でライブラリが参照できるようにする

## TL;DR

poetryの `virtualenvs.createをfalse` に設定するように変更して、poetryで管理されているライブラリが増えるたびにDockerfileのイメージを作成するようにすれば良い。

## 想定読書

* DockerにPythonの実行環境を構築してIntelliJ IDEAで開発をしたい人
* poetryでライブラリを管理したい人

## IntelliJでのDocker上のライブラリが読み込まれる条件

DockerイメージのグローバルなpipライブラリにインストールされているライブラリはIntelliJで読み込まれる。
そのためイメージを作成した後でattachしてpipでインストールされているライブラリを追加しても反映されることがない点に注意。

## IntelliJでの環境構築方法

IntelliJでの環境構築方法は[公式のドキュメント](https://www.jetbrains.com/help/idea/configuring-python-sdk.html#yklulg_458)を参考にしてほしい。

### Dockerfileの用意

以下のようなDockerfileを用意する。
重要なのは最後の2行目の `poetry config virtualenvs.create false` である。
これを設定することでpoetryでinstallしたライブラリがグローバルのpipライブラリにインストールされるようになる。
もしも設定しないとpoetryはvirtualenv環境を実行ユーザのフォルダ（設定によっては実行したフォルダ）に作成するので、IntelliJはそこのライブラリを見に行かないためIntelliJ上で補完などが効かない状態になってしまう。

```Dockerfile
FROM python:3.12-slim

ENV PYTHONUNBUFFERED=1

RUN apt-get update && apt-get install -y \
    build-essential \
    bash-completion \
    && rm -rf /var/lib/apt/lists/* \

# ホスト環境のリポジトリルートをコンテナの/appにマウントする想定
RUN mkdir /app
WORKDIR /app

RUN pip install poetry \
COPY pyproject.toml ./
COPY poetry.lock ./
# これをやらないとdockerの開発環境のライブラリがIntelliJに反映されない
# デフォルトではvirtualenv環境が/root/*に作成されてしまいIntellijはグローバルのpipの環境を見に行くのでpoetryでinstallしたライブラリ群がないように見えてしまう
RUN poetry config virtualenvs.create false
RUN poetry install --no-root
```

このDockerfileの記述だとpyproject.tomlやpoetry.lockがある前提だが、当然だがプロジェクトの一番はじめにはこれらのファイルは存在しない。
そのため初回はDockerfileなどを利用せずにpythonのコンテナイメージからpoetryをインストールして、poetry initなどを行ってpyproject.tomlやpoetry.lockを作成する必要がある。

あとはpoetryでライブラリを追加するたびにDockerfileをビルドし直せばIntelliJでライブラリが読み込まれるようになる。
SQLでCAST関数を使って文字列型を日付型に変換する方法

## はじめに

データベース操作では、文字列型の日付データを適切な日付型（DATEやDATETIME）に変換することがよく求められます。これにより、日付データに対するクエリや計算が容易になります。本記事では、SQLでCAST関数を使用して文字列型を日付型に変換する方法について解説し、サンプルデータを用いて具体例を示します。

## 基本的な概念とCAST関数

### CAST関数とは

CAST関数は、あるデータ型を別のデータ型に変換するために使用されます。例えば、文字列型を数値型や日付型に変換することができます。

### 構文

```sql
CAST(expression AS target_data_type)
```

- `expression`: 変換したい値や列を指定します。
- `target_data_type`: 変換後のデータ型を指定します。

## サンプルデータを用いた例

ここでは、MySQLを使用して具体例を示します。

### 1. テーブルの作成とサンプルデータの挿入

まず、サンプルデータを用意するためのテーブルを作成し、データを挿入します。

```sql
-- テーブルの作成
CREATE TABLE sample_data (
    id INT,
    date_str VARCHAR(20)
);

-- サンプルデータの挿入
INSERT INTO sample_data (id, date_str) VALUES
(1, '2024-06-22 10:20:30'),
(2, '2024-07-01 15:45:00'),
(3, '2023-12-31 23:59:59');
```

### 2. 文字列型をDATETIME型に変換するクエリ

標準的な日付フォーマット（`YYYY-MM-DD HH:MI:SS`）の場合、CAST関数を使用して文字列型の日付をDATETIME型に変換します。

```sql
-- 文字列型の日付をDATETIME型に変換するクエリ
SELECT
    id,
    date_str,
    CAST(date_str AS DATETIME) AS datetime_value
FROM
    sample_data;
```

### 結果

このクエリを実行すると、以下のような結果が得られます。

| id | date_str           | datetime_value       |
|----|--------------------|----------------------|
| 1  | 2024-06-22 10:20:30| 2024-06-22 10:20:30  |
| 2  | 2024-07-01 15:45:00| 2024-07-01 15:45:00  |
| 3  | 2023-12-31 23:59:59| 2023-12-31 23:59:59  |

### 3. 異なるフォーマットの日付文字列の変換

日付のフォーマットが異なる場合、CAST関数だけではなく、`STR_TO_DATE`関数などを併用してフォーマットを指定する必要があります。例えば、日付が「2024/06/22 10:20:30」の形式で保存されている場合、以下のように変換します。

#### テーブルの作成とデータ挿入（異なるフォーマット）

```sql
-- テーブルの作成
CREATE TABLE sample_data_format (
    id INT,
    date_str VARCHAR(20)
);

-- サンプルデータの挿入
INSERT INTO sample_data_format (id, date_str) VALUES
(1, '2024/06/22 10:20:30'),
(2, '2024/07/01 15:45:00'),
(3, '2023/12/31 23:59:59');
```

#### 文字列型をDATETIME型に変換するクエリ（異なるフォーマット）

```sql
-- 文字列型の日付をDATETIME型に変換するクエリ（異なるフォーマット）
SELECT
    id,
    date_str,
    STR_TO_DATE(date_str, '%Y/%m/%d %H:%i:%s') AS datetime_value
FROM
    sample_data_format;
```

### 結果

このクエリを実行すると、以下のような結果が得られます。

| id | date_str           | datetime_value       |
|----|--------------------|----------------------|
| 1  | 2024/06/22 10:20:30| 2024-06-22 10:20:30  |
| 2  | 2024/07/01 15:45:00| 2024-07-01 15:45:00  |
| 3  | 2023/12/31 23:59:59| 2023-12-31 23:59:59  |

## まとめ

CAST関数を使用することで、文字列型のデータをDATETIME型に変換し、日付と時刻として扱うことができます。異なるフォーマットの日付文字列を変換する場合は、`STR_TO_DATE`関数などを併用して適切なフォーマットを指定する必要があります。これにより、日付データに対するクエリや計算が容易になり、データの分析や処理が効率的に行えます。
Miroで実現する効果的な投票手法：ドットシールの活用術

## はじめに

デジタルコラボレーションツールの進化により、リモートワーク環境でも効果的なチーム作業が可能になってきました。その中でも、Miroは直感的なインターフェースと豊富な機能で多くの企業に利用されています。今回は、Miroの「ドットシール」機能を使った投票手法について、そのメリットと具体的な活用例を紹介します。

## ドットシール投票とは

ドットシール投票は、参加者が自分の意見や優先順位を視覚的に表現する手法です。Miroでは、デジタルの「ドット」を使ってこの手法を簡単に実現できます。各参加者は、与えられた数のドットを、支持するアイデアや重要だと考える項目に配置します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/GEJla38C-pw?si=O4ZahpDDewb6bkyU&amp;start=1729" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

miro 日本の公式チャンネルで上記の時間から解説があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/d6c1afa9-d9e5-7493-45cf-42fe78e8f9dd.png)

ここではハートマークのシール(ドットシール相当)をメンバでいいと思う、付箋の近くに投票して、メンバ同士で意思疎通を共有しようとしてます。

## メリット

1. 視覚的で直感的：意見の分布や優先順位が一目で分かります。
2. 参加者の平等性：全員が同じ数のドットを持つため、公平な投票が可能です。
3. リアルタイムの結果：投票状況をリアルタイムで確認できます。
4. データの分析が容易：結果を自動的に集計し、分析できます。
5. リモート環境での実施が容易：場所を問わず参加できます。

## 具体的な活用例

### 1. プロジェクトのアイデア選定

新規プロジェクトや改善案の選定に活用できます。

実施方法：
1. Miroボード上に提案されたアイデアを並べる
2. 参加者にドットを配布（例：1人5個）
3. 各自が支持するアイデアにドットを配置
4. ドットの数が多いアイデアから優先的に検討

### 2. リスク評価ワークショップ

プロジェクトや事業のリスク評価に効果的です。

実施方法：
1. 識別されたリスクをMiroボード上にマッピング
2. 参加者にドットを配布（例：1人10個）
3. リスクの重要度や緊急度に応じてドットを配置
4. ドットの集中したリスクから優先的に対策を検討

### 3. 顧客フィードバックの分析

製品やサービスの改善点を特定するのに役立ちます。

実施方法：
1. 顧客フィードバックをカテゴリー別にMiroボードに整理
2. チームメンバーにドットを配布（例：1人7個）
3. 重要だと考える項目にドットを付ける
4. ドットの多い項目から優先的に改善策を検討

### 4. チーム内の意見集約

組織の課題や改善点の特定に活用できます。

実施方法：
1. チーム内でブレインストーミングを行い、意見をMiroボードに配置
2. メンバーにドットを配布（例：1人8個）
3. 共感する意見にドットを貼る
4. ドットの集中した意見をもとに、優先的に取り組む課題を決定

## 実施のコツ

1. 目的の明確化：投票の目的を参加者全員で共有します。
2. ドット数の調整：項目数や参加者数に応じて、適切なドット数を設定します。
3. 時間管理：十分な検討時間と、適度な制限時間を設けます。
4. 結果の解釈：単純な多数決ではなく、少数意見も尊重して議論します。
5. フォローアップ：投票結果をもとに、具体的なアクションプランを立てます。

## まとめ

Miroのドットシール機能を活用した投票手法は、リモートワーク環境下でのチーム協働を効果的に支援します。視覚的で直感的なこの手法は、意思決定の迅速化と透明性の向上に貢献し、様々なビジネスシーンで活用できます。ぜひ、あなたのチームでも試してみてください。
オンプレミスのHadoopシステムをCloud Dataprocに移行する方法

## はじめに 
この記事では、オンプレミスのHadoopシステムをGoogle CloudのCloud Dataprocに移行する手順について解説します。特に、Hiveを主要なツールとして使用し、Optimized Row Columnar（ORC）形式のデータをCloud Storageに保存し、パフォーマンスを最大化するための方法を紹介します。

## 背景

オンプレミスのHadoopシステムをクラウドに移行することで、スケーラビリティの向上、コスト削減、運用管理の簡素化が期待できます。Cloud DataprocはGoogle CloudのフルマネージドApache HadoopおよびApache Sparkサービスであり、簡単にクラウド上で大規模データ処理を実行できます。

## 基本的な概念とツール

### Cloud Dataproc
Google CloudのフルマネージドなHadoopおよびSparkサービス。クラスターのセットアップ、管理、スケーリングが簡単です。

### HDFS（Hadoop Distributed File System）
分散ファイルシステムで、大量のデータを効率的に保存し、処理できます。

### Hive
Hadoopエコシステム内のデータウェアハウスツールで、SQLライクなクエリ言語を提供し、大量のデータを簡単にクエリできます。

### ORC（Optimized Row Columnar）
Hadoop用の効率的な列指向フォーマットで、パフォーマンスを向上させるために最適化されています。

### gsutil
Google Cloud Storageとやり取りするためのコマンドラインツール。データのアップロード、ダウンロード、コピーが可能です。

### Cloud Storage Connector for Hadoop
Google Cloud StorageとHadoopの間でデータ転送を容易にするツール。HadoopエコシステムをCloud Storageとシームレスに統合します。

### 外部Hiveテーブル
外部データソース上のデータを参照するHiveテーブル。データはテーブルが削除されても保持されます。

## データ移行とHiveの使用方法

### 1. ORCファイルのCloud Storageへのコピー

まず、オンプレミスのHadoopシステムからすべてのORCファイルをGoogle Cloud Storageにコピーします。これは既に完了しているものとします。

### 2. データをHDFSに複製

Cloud DataprocクラスターのローカルHDFSに一部のデータを複製することで、パフォーマンスを最大化できます。

#### 方法1: gsutilを使用してデータを転送

1. gsutilを使用して、Cloud StorageバケットからDataprocクラスターのHDFSにORCファイルを転送します。

```bash
# Dataprocクラスターの任意のノードに転送
gsutil cp gs://my-bucket/*.orc /path/to/local/directory

# HDFSにコピー
hadoop fs -put /path/to/local/directory/*.orc /path/to/hdfs/directory
```

2. HiveテーブルをローカルHDFSにマウントします。

```sql
CREATE EXTERNAL TABLE my_table (
    column1 STRING,
    column2 INT,
    ...
)
STORED AS ORC
LOCATION '/path/to/hdfs/directory';
```

#### 方法2: Cloud Storage Connector for Hadoopを使用

1. Cloud Storage Connector for Hadoopを使用して、ORCファイルを外部Hiveテーブルとしてマウントします。

```sql
CREATE EXTERNAL TABLE my_external_table (
    column1 STRING,
    column2 INT,
    ...
)
STORED AS ORC
LOCATION 'gs://my-bucket/';
```

2. 外部Hiveテーブルをネイティブテーブルに複製します。

```sql
CREATE TABLE my_native_table AS
SELECT * FROM my_external_table;
```

## 結論

オンプレミスのHadoopシステムをCloud Dataprocに移行する際、以下の2つの方法でHiveを使用することが可能です：

1. **gsutilを使用してデータを転送し、ローカルHDFSにマウント**：
   - gsutilを使ってCloud StorageからDataprocクラスターにORCファイルを転送し、HDFSにコピー。
   - HiveテーブルをローカルHDFSにマウント。

2. **Cloud Storage Connector for Hadoopを使用**：
   - Cloud Storage Connector for Hadoopを使ってORCファイルを外部Hiveテーブルとしてマウント。
   - 外部Hiveテーブルをネイティブテーブルに複製。

これらの方法を活用することで、Cloud Dataproc上でのHiveの使用を効率化し、パフォーマンスを最大化できます。プロジェクトの要件に合わせて最適な方法を選択してください。
Miroのウェブ埋め込み機能：活用ガイド

## 1. はじめに

Miroは、オンラインのコラボレーティブホワイトボードプラットフォームです。チームでのブレインストーミング、プロジェクト管理、ワークフローの可視化など、さまざまな用途で利用されています。

Miroの特徴的な機能の一つが、ウェブ埋め込み機能です。この機能を使用することで、Miroで作成したボードを他のウェブサイトやブログに簡単に組み込むことができます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/-NKCqKbgTKM?si=JDly-SNI25Qp8ACH" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 2. Miroの埋め込み機能の利点

### コラボレーションの促進
- ウェブサイト上で直接Miroボードを表示し、編集できるため、チーム間のコラボレーションが容易になります。

### ウェブサイトやブログの視覚的な強化
- 動的で対話的なコンテンツを追加することで、ウェブサイトの魅力が向上します。

### 情報の共有しやすさ
- 複雑な情報や図表を、簡単にウェブ上で共有できます。

## 3. 埋め込み機能の使い方

1. Miroにログインし、埋め込みたいボードを開きます。
2. 右上の「共有」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a12ee07a-39e0-5d70-d801-b2adb47e0cec.png)

3. 「埋め込み」タブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/63841938-bdc3-a22a-9382-2864f531d136.png)

4. 埋め込みオプションを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/145072cf-13bb-0338-6a03-14f384ed1255.png)

5. 生成されたHTMLコードをコピーします。
6. このコードを、ウェブサイトやブログの desired locationに貼り付けます。

注意点：
- 埋め込むボードの共有設定が適切に行われていることを確認してください。
- レスポンシブデザインのサイトでは、埋め込みサイズの調整が必要な場合があります。

## 4. 埋め込みの具体的な例

### ブログでの使用例
- プロジェクトの進捗状況を視覚的に示すMiroボードを記事に埋め込む。
- 複雑な概念を説明するためのマインドマップを共有する。

### 企業のウェブサイトでの活用例
- 製品開発のロードマップを公開する。
- 組織図や業務フローを動的に表示する。

## 5. カスタマイズオプション

Miroの埋め込みコードは、以下のようなカスタマイズが可能です：

- `width` と `height` : ピクセル単位でサイズを指定
- `frameborder` : ボーダーの有無を設定
- `scrolling` : スクロールバーの表示を制御

例：
```html
<iframe width="768" height="432" src="https://miro.com/app/embed/..." frameborder="0" scrolling="no" allowfullscreen></iframe>
```

## 6. セキュリティと権限設定

### 閲覧権限の設定方法
1. ボードの「Share」設定を開く
2. 「ビューアを制限」オプションを選択
3. 特定のドメインやメールアドレスに制限を設定

### セキュリティに関する注意点
- 機密情報を含むボードの場合、埋め込み前に権限設定を必ず確認しましょう。
- 公開サイトに埋め込む場合、意図しない閲覧者にアクセスされる可能性があることを念頭に置いてください。

## 7. まとめ

Miroのウェブ埋め込み機能は、情報共有やコラボレーションの新しい可能性を開きます。適切に活用することで、以下のような利点が得られます：

- 動的でインタラクティブなコンテンツの提供
- チーム内外でのコラボレーションの促進
- 複雑な情報の視覚的な表現と共有

今後、さらなる機能の拡張や、他のツールとの連携が進むことで、Miroの埋め込み機能の活用範囲はさらに広がっていくでしょう。

ウェブサイトやブログの魅力を高め、効果的な情報共有を実現するために、ぜひMiroの埋め込み機能を試してみてください。

うめこまれたホワイトボードの事例については、以下のサイトを参照ください。

https://help.miro.com/hc/ja/articles/360016335640-Miro-%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E6%96%B9%E6%B3%95

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f10e568b-d861-2ed9-a579-76fe1d6b6e1f.png)
なでしこを実行した際に利用される関数一覧をJSから取得する

自分用メモ。なでしこに関する（公式以外の）ドキュメントって少なくて、ちょっと変わった使い方したい場合に、どうすればいいのか分からないのが難点だな、と思う今日この頃。

# 実現したいこと

[なでしこ公式で紹介されているエディター](https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%81%AE%E4%B8%80%E8%A6%A7)はカラフルだし、とても使いやすい。しかし、[完璧で究極](https://dic.pixiv.net/a/%E5%90%9B%E3%81%AF%E5%AE%8C%E7%92%A7%E3%81%A7%E7%A9%B6%E6%A5%B5%E3%81%AE%E3%82%B2%E3%83%83%E3%82%BF%E3%83%BC)という訳ではない。例えば、あるなでしこのコードを編集中に、そのコードの中で使用されている命令が一覧で表示され、押すだけで即座にその関数のリファレンスのページが開くと、とても便利であろう。
自作のエディターを製作する際に、そんな機能を実現したい場合、『任意のなでしこのコードが実行された時に呼び出されるであろう関数の一覧』を取得する必要がある。

# 方法

もっとも単純な考え方は、`navigator.nako3.__varslist[0].keys()`でそのwnakoに読み込まれている命令一覧を取得できるので、ユーザーが編集中のコードにこれらの命令が含まれていないか検索することである。ただし、単純に検索すると、例えば`《リスト》に空配列を代入`というコードについて、`空`と`空配列`と両方が引っかかってしまう。

そこで、なでしこに元々備わっている、構文解析の機能を（勝手に）利用させてもらう。以下のJavaScriptを実行することで、実際にコードを実行することなく、実行される可能性のある命令を取得できる。

```js
const nadeshiko_code="5回繰り返す\n「{回数に5を足す}」と言う\nここまで";
const func_list=navigator.nako3.lex(nadeshiko_code).tokens.reduce((old,now)=>now.type=="func"?[...old,now.value]:old,[]);
```

# おわりに

もっといい方法があれば、教えてください。

　

 以上
AWS Amplifyを使ってみたので少しノート

# 参考とした資料
https://qiita.com/t_okkan/items/38aca98993bf06598af6
https://dev.classmethod.jp/articles/reintroduction-aws-amplify/

# 操作手順

プロジェクトの初期化、対話型でセットアップ、初心者でも操作できて素晴らしい

```
amplify configure
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/8bc09d09-95a4-2d9c-c29f-018fe6897ee9.png)

途中でAWSのコンソールに切り替わって操作が必要、少し違和感がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/7127bd03-b796-c38c-a572-1fd432f8c5d3.png)

リポジトリの初期化、理由がわからないHappy hacking!

```
npx create-react-app amplify-todo
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/e8d3bfb6-70ce-4ac8-351c-07dc87d9d23f.png)

リポジトリの中でamplifyの初期化と設定、ほとんどデフォルトのまま

```
amplify init
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/5ab08cbb-dfa2-3794-c2ce-9c70b53ff7e4.png)

認証系の追加、昔はCognitoで一々手動で設定していたけど、今はほぼワンクリックでできた

```
amplify add auth
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/e5116c4b-8df4-aec5-e409-fe01da3df255.png)

ローカルからプッシュ、自動で同期すると思ったけど実は先までの操作は全部ローカル

```
amplify push
```

一応ローカルで起動してみて、問題がなかった

```
npm start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/a30d7035-1283-8ac0-c62d-9df2261b9919.png)

# 補足

+αで、APIの追加、馴染みのないGraphQL、せっかくなのでこの機にGraphQLも勉強していく

```
amplify add api
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/7f6e3221-57e3-3e5e-554a-1496e10e3c21.png)

Schemaの確認と修正はコンソールでできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/b4193c46-3e0c-845b-e1d2-2d62fec05977.png)

[また時間がある時に更新]
Google Cloudのフルマネージドデータベースサービスの比較：最適な選択肢を見つける

# はじめに
新しいプロジェクトでは、フルマネージド、自動スケールアップ、トランザクションの一貫性、6TBまで拡張可能、SQLでクエリ可能なデータベースが必要です。この記事では、Google Cloudの主要なデータベースサービス（Cloud Spanner、Cloud SQL、Cloud Bigtable、Cloud Datastore）について、各サービスの機能、得意分野、およびユースケースを解説します。

## データベースサービスの比較

以下の表に、各データベースの主な特徴と要件への適合度をまとめました。

| データベース | 最大容量 | 自動スケールアップ | トランザクション一貫性 | SQLクエリ可能 | 主なユースケース |
| --- | --- | --- | --- | --- | --- |
| **Cloud Bigtable** | **ペタバイト級** | ○ | × | × |IoTデータ、時系列データ、分析データ |
| **Cloud Spanner** | **無制限** | ○ | ○ | ○ | グローバル分散トランザクション、金融アプリ |
| **Cloud SQL** | **30.72TB** | △ (手動スケール) | ○ | ○ | ウェブアプリケーション、トランザクション処理 |
| **Cloud　Datastore** | **無制限** | ○ | ○ | × | POSおよびモバイルアプリのデータストア |

## Cloud Bigtable

- **最大容量**: ペタバイト級
- **機能**: フルマネージド、自動スケールアップ
- **トランザクション一貫性**: ×
- **SQLクエリ可能**: ×
- **得意分野**: 大規模なリード/ライトワークロード、時系列データ
- **主なユースケース**: IoTデータ、時系列データ、分析データ

Cloud Bigtableは、大量のデータを迅速に処理する必要があるアプリケーションに最適です。時系列データやIoTデータ、分析データの保存に適しており、リアルタイムなデータ処理が求められるシナリオで強力です。しかし、SQLクエリとトランザクションの一貫性が必要な場合には適していません。

## Cloud Spanner

- **最大容量**: 無制限
- **機能**: フルマネージド、自動スケールアップ、トランザクション一貫性、SQLクエリ可能
- **得意分野**: グローバルスケールのリレーショナルデータベース
- **主なユースケース**: グローバル分散トランザクション、金融アプリ

Cloud Spannerは、Google Cloudの強力なリレーショナルデータベースサービスです。フルマネージドで、自動スケーリングが可能であり、トランザクションの一貫性を提供します。さらに、SQLクエリをサポートしており、グローバルスケールのトランザクション処理に適しています。高い信頼性とスケーラビリティが必要な金融アプリケーションなどに最適です。

## Cloud SQL

- **最大容量**: 30.72TB
- **機能**: フルマネージド、トランザクション一貫性、SQLクエリ可能
- **得意分野**: 中小規模のリレーショナルデータベース
- **主なユースケース**: ウェブアプリケーション、トランザクション処理

Cloud SQLは、MySQLやPostgreSQLに対応したフルマネージドリレーショナルデータベースサービスです。トランザクションの一貫性とSQLクエリをサポートしていますが、自動スケーリングの機能は限定的です（手動スケール）。中小規模のウェブアプリケーションやトランザクション処理に適しています。

## Cloud Datastore

- **最大容量**: 無制限
- **機能**: フルマネージド、自動スケールアップ、トランザクション一貫性
- **得意分野**: スケーラブルなNoSQLドキュメントデータベース
- **主なユースケース**: ウェブおよびモバイルアプリのデータストア

Cloud Datastoreは、フルマネージドでスケーラブルなNoSQLデータベースサービスです。自動スケーリングとトランザクションの一貫性を提供しますが、SQLクエリはサポートしていません。ウェブやモバイルアプリのデータストアに適しており、柔軟なスキーマを持つデータの保存に最適です。
Raspberry Pi 5からst-spinライブラリを使ってステッピングモーターを駆動させる

[前回](https://qiita.com/horie-t/items/d4bed7094228538f771f)の記事では、spidevパッケージを使用してL6470モータードライバにコマンドを送信してステッピング・モーターを回転させました。この方法ではコマンドのバイナリ・コードのフォーマットやコード体系を意識してコードを読み書きする必要があり、開発効率が良くありません。今回はst-spinというパッケージを使用して、直感的にモーターを駆動させる方法を見ていきます。

## 必要なもの

* Raspberry Pi 5
* [L6470 ステッピングモーター・ドライバー](https://akizukidenshi.com/catalog/g/g107024/)
* [バイポーラ・ステッピングモータ](https://jp.misumi-ec.com/vona2/detail/221005433134/?HissuCode=SS2421-5041)
* [12V ACアダプター](https://amzn.to/3QObFSW)
* [DCジャック](https://akizukidenshi.com/catalog/g/g105148/)

## 準備

下図のようにステッピングモーター等を接続します。

![](https://raw.githubusercontent.com/horie-t/omni-mouse/main/docs/images/L6470StepperMotor.png)

## 実行

まず、st-spinパッケージをインストールします。(下記の方法はシステムのPythonにパッケージを追加します、仮想環境にインストールする場合は後述の方法でインストールします。)

```bash
sudo python -m pip install -U st-spin --break-system-packages
```

仮想環境にインストールする場合は以下のように仮想環境を作成してインストールします。

```bash
python -m venv ~/.spin_env
. ~/.spin_env/bin/activate
pip install st-spin
```

以下のプログラムを作成し実行します。

```python:st-spin_motor_drive.py
import time
from stspin import (
    SpinChain,
    Constant as StConstant,
    Register as StRegister,
)

# ディジー・チェイン(芋づる式)でモータードライバを接続できるが、1台だけ(total_devices=1)接続する
st_chain = SpinChain(total_devices=1, spi_select=(1, 0))
# 最初(と言っても1台だけだが…)のモータードライバのインスタンスを生成する
motor = st_chain.create(0)

# 200ステップ/秒で10秒間回転させる
motor.run(200)
time.sleep(10)
motor.stopSoft()
time.sleep(1)

# 逆方向に台形加速しながら500,000ステップ回転させる
motor.setRegister(StRegister.SpeedMax, 0x22)
motor.setRegister(StRegister.Acc, 0x5)
motor.setRegister(StRegister.Dec, 0x10)
motor.setDirection(StConstant.DirReverse)
motor.move(steps=500000)

# 回転しきるまで待つ
while motor.isBusy():
    print("Motor is rolling.")
    time.sleep(1)

# モーターの保持電流を止める
motor.hiZHard()
```
Claude 3.5 Sonnet for Visionの使い方備忘録

## はじめに
Claude 3.5 Sonnetは、視覚データの解析と解釈に優れたAIモデルです。この記事では、公式動画を見ながら学んだClaude 3.5 Sonnetの使い方を備忘録としてまとめます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/dhxrHvgXpSM?si=4MBNXMv3YaI3mTa7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## Claude 3.5 Sonnetの特徴
Claude 3.5 Sonnetは以下のタスクにおいて特に優れています。
- チャートやグラフの解釈
- 画像からのテキスト転写

## 視覚データの解析
公式動画では、Claude 3.5 Sonnetを用いて視覚データを解析する手順が示されています。具体的には、以下のようなステップで進められます。
1. 画像やグラフを入力として与える。
2. Claudeがデータを解析し、重要なポイントを抽出。
3. 抽出された情報をもとにさらに詳細な分析を実施。

## データの変換と活用
動画では、解析した視覚データをJSONなどの機械可読な形式に変換する方法も紹介されています。これにより、データを他のアプリケーションやプレゼンテーションに統合することが容易になります。
- データの構造化とフォーマット変換。
- 様々な形式のデータを統合して一元化。

## プレゼンテーションの作成
動画の最後では、視覚データを効果的に活用するためのプレゼンテーション作成の例が紹介されています。Claudeを用いることで、視覚的に魅力的なプレゼンテーションを迅速に作成できます。
- インタラクティブなチャートの生成。
- スライドへの組み込みと視覚効果の最適化。

## 操作性とシームレスな連携
公式動画では、Claude 3.5 Sonnetの操作性についても詳しく紹介されています。特に以下の点が効率的です。
- 左側にフロントエンドがあり、内側に結果がすぐに出力される設計。
- データの入力と解析結果の確認がシームレスに連携して行えるため、作業の効率が非常に高い。
- 直感的なインターフェースで、操作が簡単。

## まとめ
Claude 3.5 Sonnetは、視覚データの解析からプレゼンテーション作成まで幅広く活用できる強力なツールです。公式動画を通じて、その使い方や応用方法を学ぶことで、データの可視化と共有がより効果的になります。また、操作性とシームレスな連携が作業の効率を大幅に向上させます。今後もこの備忘録を参考にして、Claude 3.5 Sonnetの活用を進めていきます。
LED

```
from gpiozero import LED, Button
from signal import pause
import time

# LEDとスイッチのGPIO番号
LED_PIN = 17
SWITCH_PIN = 18
MAX_RELEASE_COUNT = 3

# LEDオブジェクトを作成
led = LED(LED_PIN)

# Buttonオブジェクトを作成
button = Button(SWITCH_PIN, pull_up=True, bounce_time=0.2)

stop_flg = False

# 点滅関数
def blink_led():
    # tennmetukaijoyou
    global stop_flg
    releaseCount = 0
    
    while True:
        for _ in range(2):
            led.on()
            time.sleep(0.6)
            led.off()
            time.sleep(0.4)
        if button.is_active:
            releaseCount += 1
        else:
            releaseCount = 0
        print('releaseCount:',releaseCount)
        if releaseCount >= MAX_RELEASE_COUNT:
            stop_flg = True
            break
    return releaseCount
    
# スイッチが押された時の処理
def switch_pressed():
    global stop_flg
    print('Button_pressed')
    
    if stop_flg == True:
        print('LED OFF')
        led.off()
        stop_flg = False
    else:
        print('Call blink')
        blink_led()

# スイッチが離れた時の処理
#def switch_released():
#    global pressed_time
#    pressed_duration = time.time() - pressed_time
#    print('pressed_duration:' + str(pressed_duration))
    
#    if pressed_duration >= 5:
#        print('LED OFF')
#        led.off()

# スイッチのイベントハンドラを設定
button.when_pressed = switch_pressed
#button.when_released = switch_released

try:
    pause()  # メインプログラムを一時停止してイベントを処理

except KeyboardInterrupt:
    pass

finally:
    led.close()  # LEDオブジェクトをクリーンアップして終了
    ```
Lチカ

RaspberryPiでLEDを点滅させる。

from gpiozero import LED, Button
from signal import pause
import time

# LEDとスイッチのGPIO番号
LED_PIN = 17
SWITCH_PIN = 18
MAX_RELEASE_COUNT = 3

# LEDオブジェクトを作成
led = LED(LED_PIN)

# Buttonオブジェクトを作成
button = Button(SWITCH_PIN, pull_up=True, bounce_time=0.2)

stop_flg = False

# 点滅関数
def blink_led():
    # tennmetukaijoyou
    global stop_flg
    releaseCount = 0
    
    while True:
        for _ in range(2):
            led.on()
            time.sleep(0.6)
            led.off()
            time.sleep(0.4)
        if button.is_active:
            releaseCount += 1
        else:
            releaseCount = 0
        print('releaseCount:',releaseCount)
        if releaseCount >= MAX_RELEASE_COUNT:
            stop_flg = True
            break
    return releaseCount
    
# スイッチが押された時の処理
def switch_pressed():
    global stop_flg
    print('Button_pressed')
    
    if stop_flg == True:
        print('LED OFF')
        led.off()
        stop_flg = False
    else:
        print('Call blink')
        blink_led()

# スイッチのイベントハンドラを設定
button.when_pressed = switch_pressed
#button.when_released = switch_released

try:
    pause()  # メインプログラムを一時停止してイベントを処理

except KeyboardInterrupt:
    pass

finally:
    led.close()  # LEDオブジェクトをクリーンアップして終了
golangci-lint（gci）を使ってGoコードをチェックしよう

### はじめに

Go言語の静的解析ツールであるgolangci-lint（gci）は、コードの品質を向上させるために役立ちます。この記事では、gciの基本的な使い方と、実際のコード例を通じてどのように役立つかを紹介します。

### gciのインストール

まずは、gciをインストールします。Windowsでのインストール方法は以下の通りです。

1. **Chocolateyを使用してインストールする方法**:
    
    管理者権限を持つ PowerShell で以下のコマンドを実行します。
    
    ```powershell
    powershellコードをコピーする
    choco install golangci-lint
    ```
    
    インストールが完了したら、次のステップに進みます。
    

### gciの基本的な使い方

1. **コードの静的解析**:
    
    gciを使ってコードの静的解析を行います。
    
    ```powershell
    powershellコードをコピーする
    golangci-lint run ./...
    ```
    
    - `./...` は現在のディレクトリ以下のすべてのパッケージを対象にします。
2. **自動修正の適用**:
    
    gciの `--fix` オプションを使って、一部の問題を自動的に修正することができます。
    
    ```powershell
    powershellコードをコピーする
    golangci-lint run --fix ./...
    ```
    
    ただし、すべての問題に対して自動修正が適用されるわけではないため、修正内容を確認することが重要です。
    

### gciが修正できる例

以下に、gciが自動修正できる可能性のある例を示します。

### 不要なインポートの削除

```go
go
package main

import (
	"fmt"      // gci: unnecessary import
	"math"
)

func main() {
	fmt.Println(math.Pi)
}
```

### 不要な変数の削除

```go
go
package main

import "fmt"

func main() {
	x := 5       // gci: x declared and not used
	fmt.Println("Hello, World!")
}
```

### 結論

golangci-lint（gci）は、Go言語プロジェクトでのコード品質の向上に役立つ強力なツールです。正しい設定と使い方を理解することで、コードのバグやスタイルガイド違反を見つけて修正することができます。

以上がgolangci-lintの基本的な使い方と、自動修正の例についての解説でした。ぜひこのツールを活用して、より品質の高いGoプロジェクトを作成しましょう！
【langgraph】ToolNodeの入出力を理解する

# 概要
langgraphの勉強をしていて、ToolNodeが何なのかよくわからなかったので、ソースコードを読んで理解を試みました。

# モチベーション

[langgraphのチュートリアル](https://langchain-ai.github.io/langgraph/#example)で以下のような記述があります。（要点だけ抜粋）。

```Python
from langgraph.prebuilt import ToolNode

# Define the tools for the agent to use
tools = [TavilySearchResults(max_results=1)]
tool_node = ToolNode(tools)

# Define a new graph
workflow = StateGraph(MessagesState)

# Define the two nodes we will cycle between
workflow.add_node("tools", tool_node)
```

workflow(StateGraph)にて、"tools"という名前のnodeにtool_nodeクラスを紐づけています。
ToolNodeはおそらくRunnableを継承しています。
nodeに紐づけられたRunnable継承クラスは実行時invokeが呼ばれるはずです。
tool単体のinvokeはtoolに紐づいた関数を実行するということでなんとなくわかるのですが、ToolNodesはtoolのリストのラッパーなので、toolのリストに対するinvokeがどういう挙動をしているのかわからないので、理解したいと思いました。

# わかりたいこと
ToolNodeクラスのinvokeの入力と出力が何かを理解したいです。
想像としては、想像としては、入力はagentクラスの出力（tool_callプラパティが存在するAIMessage？）だと思います。出力は、toolの実行結果なのだと思いますが、複数のtoolが呼び出されている場合は辞書かリストで渡されるのか？など、あまりイメージできていません。

# 調査
[ToolNode](https://github.com/langchain-ai/langgraph/blob/b4d815e32a032ecc8093e4def15486bf1a88eb3e/libs/langgraph/langgraph/prebuilt/tool_node.py#L24C1-L24C34)のソースコードを読んでみます。

クラス冒頭の説明コメントに以下のように書かれています。

```Python
    """A node that runs the tools requested in the last AIMessage. It can be used
    either in StateGraph with a "messages" key or in MessageGraph. If multiple
    tool calls are requested, they will be run in parallel. The output will be
    a list of ToolMessages, one for each tool call.

    The `ToolNode` is roughly analogous to:

    ```python
    tools_by_name = {tool.name: tool for tool in tools}
    def tool_node(state: dict):
        result = []
        for tool_call in state["messages"][-1].tool_calls:
            tool = tools_by_name[tool_call["name"]]
            observation = tool.invoke(tool_call["args"])
            result.append(ToolMessage(content=observation, tool_call_id=tool_call["id"]))
        return {"messages": result}
    ```

    Important:
        - The state MUST contain a list of messages.
        - The last message MUST be an `AIMessage`.
        - The `AIMessage` MUST have `tool_calls` populated.
    """
```

以下の内容が書かれています。
- 最後のAIMessageに含まれるtool_callをrunする
- "message"のkeyをもつStateGraphクラスか、MessageGraphクラスにて使われる
- 複数のtool_callがある場合は、pararellに実行する
- 出力は各tool_callに対応するToolMessageのリストである。

「ざっくりとはこういう処理だよ」というまえがきとともに、tool_node関数の例が書かれています。
関数の中身としては、辞書型のstateを受け取り、messagesバリューの最後のindexのtool_callsを取得し、各tool_callに対応するinvokeを実行し、resultリストにToolMessage型に変換したうえでappendする、みたいな処理です。文章で記述された要点の通りの処理になっています。

重要な点がコメントの最後に書かれています。
- stateはmessageのリストを含む必要がある。
- 最後のmessageはAIMessageである必要がある。
- AIMessageはtool_callsをもつ必要がある。

# 理解の整理
思いの外、クラスのコメントを読むだけで、スッキリしたので、ここで終わりにします。
ToolNodeの実際の処理やTooleNodeが継承しているRunnableCallableも見る必要性も想定していたのですが、今はそこまで深い理解はいらなさそうです。

もともとの想像に対して実態がどうだったか整理します。
入力については、tool_callsが存在するAIMessageを入力するという想像通りです。
出力はtoolの戻り値のリストかなと雑に想像していましたが、より正確にはToolMessageのリストが返されるようでした。

# おわりに
これで、ToolNodeを拒否感なく使えそうです。
登録セキスペ オンライン講習 2023 参考資料備忘録 #4

この記事は、#1, #2, #3に引き続き、登録セキスペ オンライン講習で取り上げられている資料の中で、後日時間を取って再度目を通したいと思う物のリンクを忘れないようにまとめておくことを目的としています。

https://qiita.com/y-vectorfield/items/92e22ee6a09c66c0c96d

https://qiita.com/y-vectorfield/items/5bb912fac06faa631a1c

https://qiita.com/y-vectorfield/items/9dbba6708aef77e00d93

# サイバーセキュリティ関係法令Q＆Aハンドブック
https://security-portal.nisc.go.jp/guidance/law_handbook.html

# 情報システム・モデル取引・契約書（第二版）
https://www.ipa.go.jp/digital/model/model20201222.html

# 安全なウェブサイトの作り方
https://www.ipa.go.jp/security/vuln/websecurity/about.html

# クラウドセキュリティガイドライン活用ガイドブック
https://warp.da.ndl.go.jp/info:ndljp/pid/11314940/www.meti.go.jp/policy/netsecurity/downloadfiles/cloudseckatsuyou2013fy.pdf

# テレワークセキュリティ
https://www.ipa.go.jp/security/anshin/measures/telework.html

https://www.soumu.go.jp/main_sosiki/cybersecurity/telework/

https://warp.da.ndl.go.jp/info:ndljp/pid/12187388/www.nisc.go.jp/active/general/pdf/telework20200414.pdf

# スマートフォンセキュリティ対策
https://www.jssec.org/smartphone-malware

https://www.jssec.org/dl/android_securecoding_20220829/index.html

# さいごに
2023年度オンライン講習の備忘録記事は以上です。2024年度のオンライン講習受講時にも、気になる資料、後から熟読したい資料などをまとめたいと思います。