OmniAICreator/Qiita-1.07M huggingface dataset:
アロー関数 [JavaScript]


アロー関数とは、関数式を簡潔にかける新しい書き方になります。

通常の関数式を簡潔に掛ける大替構文となり、functionのキーワードを使用せずに使うことができます。
また、アロー関数は、その名の通り、=>(矢)を使って関数リテラルを記述します。

例を参照しながらアロー関数についてまとめていきたいと思います。

## 目次：
- [関数と関数式とアロー関数](#1-関数と関数式とアロー関数)
- [アロー関数の例](#アロー関数の例)
- [アロー関数の暗黙的なreturn](#アロー関数の暗黙的なreturn)
- [まとめ](#まとめ)

## 　1. 関数と関数式とアロー関数

#### 1-1. 関数と関数式の違い

関数では、functionを使って関数宣言をして、returnで戻り値を設定して戻すことにより
*関数で算出された値を別の関数の計算に使うことができました。*

https://qiita.com/shisshi_engineer/items/da93acbbf8dcbb519f1b#return-function%E9%96%A2%E6%95%B0%E3%81%AE%E6%88%BB%E3%82%8A%E5%80%A4:~:text=%E3%81%AF%E7%A7%98%E5%AF%86%E3%81%A7%E3%81%99%E3%80%82-,return,-function(%E9%96%A2%E6%95%B0)%E3%81%AE

上記の書き方とは違った書き方をするのが、**関数式**と呼ばれるものです。

関数式では、関数と違う特徴が、２つあります。
1. 関数の名前を省略して書くことができる。
2. 変数に関数を定義することができる。 


#### 1-2. 例： 関数の場合
「add」という関数を作成します。

xとyの２つのパラメータを受け取り、入力した値の２つを合計した値をreturn（返す）します。

```js
function add(x,y) {
    return x + y;
}
```
addに1と2を渡す。
```js
add(1,2)
```
１と2の合計値3を返す。
```text:出力結果：
3
```
#### 1-3. 例： 関数式の場合

関数式の場合、左側に変数、右側に関数を定義します。
```js
const add = function(x,y) {
    return x + y;
}
```
関数同様、addに1と2を渡す。
```js
add(1,2)
```
１と2の合計値3を返す。
```text:出力結果：
3
```

#### 1-4. 例： アロー関数の場合

アロー関数は、**関数式**を簡潔に書くことのできる構文です。

アロー関数の特徴

1.fuctionを省略して書くことができる。
2.パラメータの後ろに、「=>」と記載する。

```js
const add = (x,y) => {
    return x + y;
}
```
関数式同様、addに1と2を渡す。
```js
add(1,2)
```
１と2の合計値3を返す。
```text:出力結果：
3
```

アロー関数は、関数式の完結版なので、下記と同じ結果になります。

[1-3. 例： 関数式の場合](https://qiita.com/shisshi_engineer/items/381f4c5193dcacb1bdfc#1-3-%E4%BE%8B-%E9%96%A2%E6%95%B0%E5%BC%8F%E3%81%AE%E5%A0%B4%E5%90%88)

## アロー関数の例

#### 2-1. アロー関数の例（パラメータなし）

アロー関数の例として、パラメータがない場合はどのように定義すればよいでしょうか？

例：ランダムな１から６までの値を出力するサイコロのような関数を作成します。

1.rollDie関数を定義。
2.アロー関数のパラメータがない場合は、()「丸括弧」と、空の（）「丸括弧」を書きます。
3. 参照：[サイコロの作り方](https://qiita.com/shisshi_engineer/items/da93acbbf8dcbb519f1b#%E3%82%B5%E3%82%A4%E3%82%B3%E3%83%AD%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9)

```js
const rollDie = () => {
    return Math.floor(Math.random() * 6) + 1;
    }

```

```js
rollDie()
```
```text:出力結果：
※ランダムな１から６までの数字が出力されます。
```

## アロー関数の暗黙的なreturn

アロー関数では、returnを省略して書くこともできます。

先ほどの2-1で作成した、ランダムな１から６までの値を出力するサイコロのような関数を例にしてreturnを省略した場合をみてみましょう。

例：ランダムな１から６までの値を出力するサイコロのような関数を作成します。

:::note info
暗黙的なreturn変更例：

1.rollDie関数のアロー関数の矢印の後ろの「 { 」「波括弧前部分」を、「 ( 」「丸括弧前部分」に変更する。
2.サイコロを構成する部分のreturnを削除する。
3.サイコロを構成する部分の後ろの ; 「セミコロン」を削除する。
（ ; セミコロンは、一番後ろにつける。）
4.関数の最後の「 } 」「波括弧、後ろ部分」を、「 ) 」「丸括弧後ろ部分」に変更する。
:::
```js
const rollDie = () => (
    Math.floor(Math.random() * 6) + 1
    );

```

```js
rollDie()
```
```text:出力結果：
※ランダムな１から６までの数字が出力されます。
```

注意※
アロー関数の暗黙的returnは、一つしか式がない、評価するものがない場合にしか使用できないので注意。


## まとめ：

:::note info
まとめ：
1. アロー関数は、関数式を省略して書くことができます。
2. functionを省略し、「 => 」で表現することができます。
3. {} 波括弧 を () 丸括弧に変更し、; (セミコロン)を最後に記載して、returnを省略することができます。
4. アロー関数を活用することにより、コードをスッキリとみやすく保つことができます。 
:::
Laravelのモデルについてのまとめ

## モデルとは
Laravelのモデルは、データベースのテーブルと対応するクラスです。
モデルを使うことで、テーブル内のデータをオブジェクトとして扱うことができ、データベース操作が簡単に行うことができます。

## モデルでできる機能

### スコープの設定
スコープを使用すると、特定のクエリ条件を定義し、それを複数の場所で再利用できます。
これにより、コードの再利用性が向上し、クエリの可読性が向上します。

例えば、あるモデルがアクティブなユーザーのみを取得するようにしたい場合、スコープを使用して次のように定義できます。
```
// モデルクラスの記述
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
    // アクティブなユーザーのみを取得するスコープ
    public function scopeActive($query)
    {
        return $query->where('active', true);
    }
}
```
この例では、active カラムが true のユーザーのみを取得する active という名前のスコープが定義されています。

スコープを使用してクエリを呼び出すには、次のようにします。
```
// コントローラーなどの場所での使用例
$activeUsers = User::active()->get();
```
このようにすることで、User::active() で定義した条件が適用されたクエリを実行し、アクティブなユーザーのみが取得されます。

### リレーションシップを貼れる
リレーションシップを設定することで、異なるテーブル間のデータを簡単に結びつけ、効率的に操作できるようになります。
下記でリレーションの貼り方の例を紹介します。

#### 一対一(One-to-One)
One to Oneリレーションは、一つのレコードが別のレコードと直接関連付けられる場合に使用します。
```
// モデルクラスの記述
class Post extends Model
{
    public function user()
    {
        return $this->hasOne(User::class);
    }
}
```

#### 一対多(One-to-Many)
One to Manyリレーションは、一つのレコードが複数のレコードと関連付けられる場合に使用します。
```
// モデルクラスの記述
class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
```

### アクセサ
データをデータベースから取得する時に実行する処理を設定できます。

### ミュータ
データをデータベースへ保存する時に実行する処理を設定できます。

### モデル自体が持っているメソッドを使える
Laravelのモデルは、データベースのテーブルにアクセスするための便利なメソッドを多く持っています。以下に、いくつかの一般的なモデルメソッドを挙げます。
```
// 指定されたIDに対応するレコードを取得します。
User::find($id)

// モデルに関連するすべてのレコードを取得します。
User::all()

// 新しいレコードをデータベースに作成します。引数には属性の配列を渡します。
User::create(array $attributes)

// クエリの条件として指定された条件に一致するレコードを取得します。
User::where($column, $operator, $value)

// Eager Loadingを使用して、関連するモデルのプリロードを行います。
User::with($relations)

// モデルの変更をデータベースに保存します。新しいモデルの場合は新しいレコードが作成され、既存のモデルの場合は更新されます。
User::save()
```

### 独自メソッドの定義
Laravelのモデルに独自のメソッドを定義し、それをコントローラーから呼び出すことができます。これにより、モデルのロジックをより効果的に組織化し、再利用可能なコードを作成できます。

## 「独自メソッド」と「アクセサ」との違いについて
個人的に「独自メソッド」と「アクセサ」の違いが分かりづらかったので、ここで比較してまとめます。
Laravelで独自のメソッドとアクセサの違いは、それらが異なる目的を持つ点にあります。
独自のメソッドはモデルに関連するロジックや操作を定義するためのものであり、アクセサはモデルの属性の値を取得する際に加工したり変換したりするためのものです。それらは異なる目的を持ち、異なるタイミングで使用されます。

### 独自のメソッド
・モデルに独自のメソッドを定義することで、特定の処理や操作を行うことができます。これは、通常のPHPメソッドと同様に、モデルクラス内に定義されます。
・独自のメソッドは、モデルの振る舞いをカスタマイズしたり、モデルに関連するビジネスロジックを実装したりするために使用されます。例えば、データの操作やビジネスルールの適用などが含まれます。

### アクセサ
・アクセサは、モデルの属性（データベースのカラム）にアクセスする際、値を変更したり加工したりするためのメソッドです。アクセサは、Eloquentモデル内に定義され、属性の取得時に自動的に呼び出されます。
・アクセサは、データベースから取得される値を必要に応じて変換したりフォーマットしたりするために使用されます。例えば、日付のフォーマット変更、文字列の変換、数値の単位変換などが含まれます。

## まとめ
Laravelのモデルは、Eloquent ORMを通じてデータベースと連携し、CRUD操作やリレーションシップ管理を簡単に行えます。
モデルを使うことで、データベースをオブジェクトとして扱い、直感的かつ効率的に行えるようになります。
Laravel Eloquent: 効率的なデータベース操作のためのORM

今回はLaravelを学習して特に大事だと考えたORMについてアウトプットしていきたいと思います。

LaravelはPHPのフレームワークであり、その中でもEloquent ORM（Object-Relational Mapping）はデータベース操作を簡単にするためのツールです。この記事では、Eloquentの基本操作について学んだことをアウトプットしようと思います。

## なぜEloquentを使うのか？

Eloquentを使う理由は多岐にわたりますが、以下の点が主なメリットです。

1:シンプルで直感的なAPI: EloquentのAPIは非常にシンプルで直感的です。クエリの構築やデータ操作が容易で、コードの可読性が向上します。

2:オブジェクト指向のデータベース操作: Eloquentはオブジェクト指向のアプローチを採用しており、データベーステーブルをクラスとして扱うことができます。これにより、データベース操作がオブジェクト指向プログラミングの概念と一致し、開発者にとって扱いやすくなります。

3:リレーションシップのサポート: Eloquentは、データベース間のリレーションシップ（1対多、多対多など）を簡単に定義し操作する機能を提供します。これにより、複雑なデータ構造でも直感的に扱えます。

4:自動タイムスタンプ: Eloquentはデフォルトでcreated_atとupdated_atというタイムスタンプを自動的に管理します。これにより、レコードの作成日時や更新日時を手動で管理する必要がありません。

## 1. モデルの作成


Eloquentを使うためには、まずモデルを作成する必要があります。モデルはデータベースのテーブルに対応し、データベース操作を簡単にします。

### モデルの作成
次のコマンドを使用してモデルを作成します。
```
php artisan make:model Article
```

これにより、app/ModelsディレクトリにArticleモデルが作成されます。


### モデルの定義
モデルは次のように定義されます。ここでは、テーブル名やタイムスタンプの設定を行います。

```
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use HasFactory;

    protected $table = 'articles';
    public $timestamps = true;

    protected $fillable = ['title', 'content'];
}
```

## 2. データの操作

### データの取得
全てのデータを取得するには、allメソッドを使用します。
```
$articles = Article::all();
```
特定のデータを取得するには、findメソッドを使用します。

```
$article = Article::find(1);
```

### データの作成

新しいデータを作成するには、createメソッドを使用します。事前にモデルで$fillableプロパティを設定しておく必要があります。
```
Article::create([
    'title' => '新しい記事',
    'content' => 'この記事の内容'
]);
```

### データの更新
既存のデータを更新するには、まずデータを取得し、その後にsaveメソッドを使用します
```
$article = Article::find(1);
$article->title = '更新された記事タイトル';
$article->save();
```

### データの削除
データを削除するには、deleteメソッドを使用します。
```
$article = Article::find(1);
$article->delete();
```

## まとめ
Eloquent ORMを使うことで、Laravelでのデータベース操作が非常に簡単になります。モデルの作成からデータの取得、作成、更新、削除まで、基本的な操作をマスターすることで、効率的にデータベースを扱うことができるようになりました。Eloquentのシンプルで直感的なオブジェクト指向のデータベース操作、リレーションシップのサポート、自動タイムスタンプ管理などの利点を活用して、より効果的なアプリケーション開発できると思いました。
PythonでOpenCVがpipインストールできない問題

pipによるOpenCV（現時点の最新バージョン4.9.0.80）インストールが失敗する（Windows10）。

```
pip install opencv-python（以下のエラーが出る）
```

Visual Studio 2022をインストールしろと言われる。
```
********************************************************************************
  scikit-build could not get a working generator for your system. Aborting build.

  Building windows wheels for Python 3.6 requires Microsoft Visual Studio 2022.
  Get it with "Visual Studio 2017":

    https://visualstudio.microsoft.com/vs/

  Or with "Visual Studio 2019":

      https://visualstudio.microsoft.com/vs/

  Or with "Visual Studio 2022":

      https://visualstudio.microsoft.com/vs/

  ********************************************************************************
  ```

現時点でVisual Studio 2022ダウンロードしても、うまいことビルドできなかったので、OpenCVのバージョンを指定してインストールしましょう。

```
pip install opencv-python==4.6.0.66
```

4.7.0.68以降はビルドされたバイナリがpipで提供されていない（自分でどうにかビルドしないといけない）のが問題の様子。
SIer勤めよわよわエンジニアがあがいてみる

## 自己紹介
はじめまして、fo07と申します。よろしくお願いいたします。
文系大学を卒業し、何となく向いているかなという薄い理由でエンジニアになりました。
当初は自分なりにがむしゃらに頑張っていたものの、日々の忙しさにかまけてだんだん低空飛行になり、紆余曲折あったものの今日までSIerで何とかやってきたタイプです。
自分に甘く、大きな目標もなく、漫然と続けてきたよわよわなエンジニアですが、30手前で誇れる技術がないことに常々焦りは感じていました...

## JISOUに参加してみました
そんな中たまたま目にしたJISOUのqiita記事をきっかけに、アウトプットセミナーに参加し、Jinさんをはじめとするコミュニティーの熱量に惹かれて2週間のお試しから始めさせていただくことになりました。
参加したばかりですが、皆さん積極的に活動されていて、Slackを眺めているだけで自分もやらなきゃな、という気持ちになってきます。
こちらの記事も、JISOUの最初の課題として執筆しています。モチベーションも低めだった私個人としては、これはすごく革命的なことです。感動しています。一人だとなんだかんだと理由を付けて動けなかったことでしょう。

## 将来について
JISOU参加にあたって、目標を設定しました。
果たして2週間乗り切れるかも分からないですが、楽しむことを忘れずに頑張ってみたいと思います。
・3ヶ月（短期）
今持っているの技術の棚卸
サービスリリースまでの基本を一通り身に着ける
アウトプットの習慣を身に着ける
文章力を上げる

・半年（中期）
短期の延長
簡単でもいいので個人製作アプリをリリースする

・1年（長期）
中期の延長
技術に自信を持ち、今より条件の良い現場/会社にいく

## 余談
JISOUでは今回の記事を15分で気軽に書いてみてください、とあったのですが、いきなり3倍くらいかかってしまいました...もっと分かりやすい文章を短時間で書き上げられるようになりたい...
もし私と同じように何となく停滞していて、それを少しでも良くしたいと思っている方がいらしたら、JISOUを検討してみてはいかがでしょうか？
お試し期間もあるので是非一緒に頑張ってみましょう！（停滞ぎみ仲間が欲しいです！）
Create a container from docker images 【Mysql】



# Create a Mysql Container

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e8ea98fd-15e6-3351-266a-2cc007fc941a.png)


https://hub.docker.com/_/mysql

## Pull an image from Docker Hub


```terminal:terminal
    docker pull mysql
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e7477ea9-424f-fbda-faf3-03e9575efe5c.png)



## Start a mysql server instance

The following command starts another mysql container instance and runs the mysql command line client against your original mysql container, allowing you to execute SQL statements against your database instance:

```terminal:terminal
    docker container run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=mydb mysql
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6abaa0f5-00d4-29ce-6a28-a4b53b47d706.png)

## Container shell access and viewing MySQL logs

The docker exec command allows you to run commands inside a Docker container. The following command line will give you a bash shell inside your mysql container:

```terminal:terminal
    docker exec -it mysql bash
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/307bd4fb-7543-2110-dde7-124d222fc8f3.png)


## Connecting to and Disconnecting from the Server

https://dev.mysql.com/doc/refman/8.4/en/connecting-disconnecting.html

```terminal:terminal
    mysql -u root -p
    Enter password:
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/251035de-1cd6-8684-e914-97cf748c9b29.png)


## User infomation in mysql

```terminal:terminal
    select user, host from mysql.user;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6548cf98-8502-c028-c60c-bdd700745da1.png)


## database infomation

```terminal:terminal
    show databases;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/ea5f35b8-c7bf-a737-a12f-f577438d4d91.png)

## stop mysql container

```terminal:terminal
    docker container stop mysql
```
AWS SAP対策#3 LambdaからAuroraへの接続をより効率よく行う

AWS SAP試験対策 #3

# 問題(ざっくり)
あるWebアプリケーションは、Lambda関数でAurora MySQLデータベースをクエリします。データベースは複数のリードレプリカで構成されています。アクセスが集中する期間では、アプリケーションのパフォーマンスが低下します。アプリケーションが多くのデータベース接続を行うために遅延が発生している模様です。パフォーマンスを向上させるにはどうすればいいですか？

① ゲートウェイロードバランサーを作成して、Auroraリードレプリカ間で接続を分散する。
② Auroraサーバーレスデータベースクラスターで自動スケーリングを使用する。
③ RDS Proxy接続プールをAuroraデータベースのクラスターエンドポイントに接続する。
④ データベース接続を開くためのLambda関数コードをイベントハンドラーの外に置く。

\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*
\*

# 回答
**④ データベース接続を開くためのLambda関数コードをイベントハンドラーの外に置く。**

# 要点解説
問題文中に、今回の事象発生要因が「アプリケーションが多くのデータベース接続を行うため」と書かれています。
要するに、**Lambda関数が何度もデータベースへアクセスしていることが原因**、ということです。

Lambda関数は、1つのイベントごとに個別の実行環境(コンテナ)が用意され、その中で実行されます。
イベントハンドラー関数内でデータベース接続をした場合、そのイベントが終了するとデータベース接続も終了します。
したがって、関数が実行されるたびに毎回新しい接続・破棄するオーバヘッドが発生し、パフォーマンスが低下します。

一方で、データベース接続を関数コードの外部(グローバルコンテキスト)に置くことで、以下の利点がある。
 - コネクションプーリングの実施：データベースへの接続を確保しておいて、それをアプリケーションで使いまわす仕組み。
 - コールドスタートの遅延改善：上記で接続が事前に確保されているので、時間短縮になる。
 - メモリ効率の改善：個別のイベントごとに接続を作成する必要がなくなるため。

したがって、Lambdaアプリケーションのボトルネックを解決し、データベースとのやり取りを最適化するための適切な対処方法として④が正解です。
(RDS Proxyと組み合わせて使用することがより良い構成のようです。以下参照)

https://dev.classmethod.jp/articles/using-relational-databases-with-aws-lambda-easy-connection-pooling/

以下に簡単なサンプルコードを記述しておきます。

```python:sample.py
import boto3
import pymysql

# グローバル コンテキストでデータベース接続を初期化。
# 認証情報は本来、Secrets Managerなどで管理するべきです。
rds_client = boto3.client('rds-data')
db_cluster_arn = 'arn:aws:rds:ap-northeast-1:123456789012:cluster:my-db-cluster'
db_credentials = rds_client.generate_db_auth_token(DBHostname="my-db-cluster.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com", Port=3306, DBUsername="my_user")
db_connection = pymysql.connect(host="my-db-cluster.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com", user=db_credentials['AuthToken'], password="", port=3306, database="my_db")

def lambda_handler(event, context):
    # グローバルで初期化された接続を使用
    with db_connection.cursor() as cur:
        # クエリを実行
        ...

    # 返す値を処理
    ...

    return response
```

# 他選択肢の不正解理由解説
**① ゲートウェイロードバランサーを作成して、Auroraリードレプリカ間で接続を分散する。**
→ゲートウェイロードバランサ―は管理対象仮想アプライアンス(ファイアウォールなど)をデプロイ・スケーリング・管理できます。データベースには使用しません。

**② Auroraサーバーレスデータベースクラスターで自動スケーリングを使用する。**
→Amazon Aurora用のオンデマンドのオートスケーリング設定で、ワークロードをモニタリングし、データベースの容量を調整するプロセスを自動化しやすくなります。ただし、接続管理には役立ちません。

**③ RDS Proxy接続プールをAuroraデータベースのクラスターエンドポイントに接続する。**
→RDS Proxyと共に使用するのは良いユースケースです。RDS Proxyを使用すると、アプリケーションでデータベース接続をプール(=蓄える)および共有して、アプリケーションのスケーリング能力を向上させることができます。
ただしここではAuroraデータベースの**リードエンドポイント**に接続する必要があります。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy-endpoints.html
SAによるアップロードファイルをユーザへ共有

# 概要
あるアプリを作成中に、サービスアカウントを利用して、google driveへファイルをアップロードし、そのファイルをユーザが閲覧可能な状態にするための実装を行っていました。

`python google drive`と検索すると、公式では以下の情報が表示されますが、この方法だとブラウザを介することでしか実現できないので、今回は採用していません。

https://developers.google.com/drive/api/quickstart/python?hl=ja

chatGPTに尋ねること数回で完成するので、メモに近いです。

## 準備
1. GoogleアカウントでSAを作成（ブラウザ上で何か権限を追加する必要なし）
1. 対象のプロジェクトにて、Google Drive API有効化
1. 必要なライブラリインストール
    ```
    pip install oauth2client google-api-python-client
    ```

## 実装
今回はPDFファイルをアップロードしたかったので、以下のように実装しました。
アップロード先は個人ドライブです。SA経由でアップロードするので、ユーザに権限不要後、共有アイテムから確認可能な形になります。
アップロード先を共有ドライブとする場合は、`service.files().create`に渡す値をもう少し複雑です。（[参考資料](https://zenn.dev/antyuntyun/articles/python_google_drive)）
```python
    from oauth2client.service_account import ServiceAccountCredentials
    from googleapiclient.discovery import build
    from googleapiclient.http import MediaFileUpload

    scope = ['https://www.googleapis.com/auth/drive']

    # Parsing JSON credentials for a service account:
    credentials = ServiceAccountCredentials.from_json_keyfile_name('sa.json', scope)
    service = build('drive', 'v3', credentials=credentials)

    # アップロードするファイルのパス
    file_path = 'XXX.pdf'

    # ファイルメタデータを定義
    file_metadata = {
        'name': os.path.basename(file_path),
    }

    # ファイルをアップロード
    media = MediaFileUpload(file_path, mimetype='application/pdf')
    file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
    fileId = file.get('id')
    
    file_url = f'https://drive.google.com/file/d/{fileId}/view'

    # 特定のメールアドレスにアクセス権を付与する関数
    permissions = {
        'type': 'user',
        'role': 'reader',
        'emailAddress': email
    }
    service.permissions().create(fileId=fileId, 
                                 body=permissions, 
                                 ).execute()
    try:
        permissions = service.permissions().list(fileId=fileId).execute()             
    except Exception as e:
        print('An error occurred:', e)
        permissions = service.permissions().list(fileId=fileId).execute()
```
PowerAutomate MyTips

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

https://learn.microsoft.com/ja-jp/training/modules/get-started-flows/9-troubleshoot-flows

## JSON -> CSV

https://learn.microsoft.com/ja-jp/power-automate/data-operations

## Excelに追加（時間の制御

https://www.teijitaisya.com/powerautomate-to-excel/#index_id4


### 以下フローで対応すれば、なんとかなる（ただし21日以上前に削除されたフローは復元できないそうです

https://learn.microsoft.com/ja-jp/power-automate/how-tos-restore-deleted-flow#restore-deleted-flows-with-the-power-automate-management-connector
最短努力と時間でPL-900一発合格記

PL-900に無事一回で合格できたので記録しておく…。。
あくまでも最低限の時間と努力で合格した方法なので、きちんとした理解を行うにはLearnなどで体系的に学ぶ方がよろしいかと思います。
PL-900は紙の参考書はなく、すべてオンラインでの学習となります。

## 前提

会社でPower Platformをはじめとしたローコードツールを活用中。

### 実務でのツール歴

Power BI→2年くらい
Power Automate Desktop→2年くらい
Power Automate クラウドフロー→1年くらい
Power Apps（キャンバスアプリ）→半年くらい
Copilot Studio→1ヶ月くらい
Dataverse関連、Power Pages→未経験

## 参考にした勉強法

https://qiita.com/kozue-sh/items/6f385e1122940bf4c2f1

こちらを参考にして、まずは最新の試験範囲を確認しました。Copilotは実テストでは出てきませんでした。

## 実際の勉強でやったこと

### ①Learnのラーニングパスを流し読み（1時間程度）

https://learn.microsoft.com/ja-jp/training/courses/pl-900t00

自分があまりやったことない分野（Dataverse関連、モデル駆動型アプリ、Power Pages、Copilot Studio）を中心に読みました。正直②がうまくまとまりすぎてたので読まなくても良かったかも。

### ②「PL-900 : Microsoft Power Platform Fundamentals 試験対策」を受講(2時間程度)

https://info.microsoft.com/JA-PowerApps-WBNR-FY21-05May-03-MKTOFY21PL900PrepSessionOndemandWebinar-SRDEM73329_LP02OnDemandRegistration-ForminBody.html

これは本当に受けたほうがいいです。フォームに個人情報を入れるとメールでコンテンツが飛んできます。

スライドがついていて、動画は3.5時間くらいあります。結局試験時間まで時間がなかったため動画は視聴しませんでした。スライドだけパラパラと確認。Learnよりも試験のポイントがまとまっています。講座の冒頭で補足がありますが、いくつか昔の呼び方が出てくる場合があるよー的な注意があります。(Power Virtual AgentsもCopilot Studioに変わってるしね)
途中で練習問題もあるので試験のイメージが湧きます。そのままの問題も数問実テストで出てきました。

### ③「試験対策 Microsoft認定資格 PL-900：Microsoft Power Platform Fundamentals 問題集170問」を流し読み（1時間程度）

https://amzn.asia/d/7wF39Pt

結局こちらは高いお金出しましたが、一周もできずでした。試験当日に半分くらいまで解きました。解説はほぼないので、答え合わせはLearnなどで自分で確認する必要があります。②の資料と見合わせて補完しました。紙の参考書がないため、買える方は買った方がいいと思います。

### 試験の感想
試験時間45分は意外とあっという間で、見直し一周が限界でした。
試験の中身は個人的な感覚ですがキャンバスアプリとモデル駆動型アプリの違い、Dataverseを使ったもろもろの機能は③の参考書同様、しつこいくらい試験の中で出てくるので理解必須だと思います。また、AI Builderの機能についても地味に何問か出てきます。

平日も休日も忙しく、試験当日も体調を崩してしまい実質4時間くらいしか勉強できませんでしたが無事合格。良い子はちゃんと計画的に勉強して、体調管理はちゃんとしよう！(？)
pythonでディレクトリ内のサブディレクトリ名やパスを取得する

# 概要
今回はディレクトリ内のサブディレクトリ名やパスを取得する方法について記載していきます。
勉強用に簡易的に記載していますので、ご了承ください。

## 実行環境
・windows：Windows11Pro 23H2
・Python 3.12.3


## スクリプト
```subfolder.py
import os
import itertools
import glob



folder_path = r"パス"

# 1)指定したディレクトリ内のファイルパスを全て表示する
def show_file_path():
    for current_dir, sub_dirs, files_list in os.walk(folder_path): 
        for file_name in files_list:
            print(os.path.join(current_dir,file_name))

# 2)指定したディレクトリ内のサブフォルダ名パスを全て表示する
def show_subfolder_path():
    for current_dir, sub_dirs, files_list in os.walk(folder_path): 
        for sub_dir_name in sub_dirs:
            print(os.path.join(current_dir,sub_dir_name))

# 3)指定したディレクトリ内のサブフォルダ名を全て取得する
def get_subfolder_name():
    subfolder_name = []
    for current_dir, sub_dirs, files_list in os.walk(folder_path):
        subfolder_name.append(sub_dirs)

    # 二次元配列を一次元配列にする
    subfolder_name =  list(itertools.chain.from_iterable(subfolder_name))

# 4)指定したディレクトリ内のディレクトリとサブディレクトリのパスを全て取得する
def folder_name():
    file_path_lists = glob.glob("{}/**".format(folder_path), recursive=True)
    folder_path_lists = []
    for file_path in file_path_lists:
        if (os.path.isdir(file_path)):
            folder_path_lists.append(file_path)

if __name__ == '__main__':
    show_file_path()
    show_subfolder_path()
    get_subfolder_name()
    folder_name()
```
【Game A Week：一週目】スライドパズルを作ってみた

## はじめに
普段はPHPなどを使ってwebアプリ開発を行っていますが他の技術も身に着けたいのでGame A Weekに挑戦しようと思います。

## Game A Weekとは
「Game A Week」とは一週間でゲームを1つ作って、ゲーム開発の経験値を上げる方法として、オランダのインディー系デベロッパー「Vlambeer」のRami Ismail氏が提唱したものです。詳細については以下の記事を読んでみてください。

https://note.com/syun77/n/n8063d509a864

## 振り返り
### Idea
スライドパズルを作成しました。
![スライドパズル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954837/43461242-6d15-49fa-ac12-9300923add55.png)

https://github.com/eyamagishi/slide_puzzle

### What I learned
- Pythonを使用しての開発
- Pygameを使用しての開発
- Gameの開発
- LICENSEの表記追加
- パリティ設定

### What went right
- Pythonの簡単さは理解できた
- Pygameを使って画面を表示することができた

### What went wrong
- パリティの精度
パリティ機能を作成したものの正常に機能していないように見える（3回に1回程度解けない問題が出てくる）。以下を参考にしたもののPythonになれていないこと、数式としての理解がまだ浅いため実装漏れをしたんだと思う...。次回パズルを作成する際には気を付けたい。

https://manabitimes.jp/math/979

## おわりに
初めてPythonを使用した開発でしたので調べながらの作業となりました。PHPと近い部分があるのでこれから慣れていき、仕事などでつかえたらと思います。
Composeで下部のみにShadowをつける

# はじめに
今回はViewの下部にのみshadowを付けるための拡張関数を紹介していきます
### 本文
基本的にはCardをで囲えば簡単にできますが、そうでないViewに対してなどに使う機会があったので下記をそのまま使ってもらって良しなに調整していただければ使えるものになっています
```kotlin
private fun Modifier.bottomShadow(
    blurRadius: Float,
    color: Color,
): Modifier {
    return this.then(
        drawBehind {
            drawIntoCanvas {
                val paint = Paint()
                val frameworkPaint = paint.asFrameworkPaint()
                frameworkPaint.maskFilter =
                    BlurMaskFilter(
                        blurRadius,
                        BlurMaskFilter.Blur.NORMAL,
                    )
                frameworkPaint.color = color.toArgb()
                it.drawLine(
                    Offset(0f, size.height),
                    Offset(size.width, size.height),
                    paint,
                )
            }
        },
    )
}
```
### さいごに
デフォルトのshadowだとどうしても全体になってしまったのでしょうがなくどうにかできないものかと思い実装してみました
どなたかのお役に立てれば幸いです
ChatGPT-3.5先生へ「binomial(10,0) と binomial(10,1) の違いを教えて下さい。」


**パイソニスタの方へ**
・chatgptの「リンク」の使い方の、おすすめページを教えて下さい。
・いつまで、保存されるものですか？

# ChatGPT-3.5先生へ

User
binomial(10,0) と binomial(10,1) の違いを教えて下さい。

ChatGPT
...3. 解釈...

# wolframalpha

https://www.wolframalpha.com/input?i=binomial%2810%2C0%29&lang=ja

https://www.wolframalpha.com/input?i=binomial%2810%2C1%29&lang=ja

# 参考

https://qiita.com/homelan/items/75aff70107e0049356ca
【初投稿】新卒5年目SE、アウトプット力向上のためブログ始めます。

## 1. 自己紹介
中堅（？）SIerに勤めている新卒5年目のSEです

## 2. ブログを始める目的
一番は、アウトプット力向上のためです。とにかく何かを伝えることに不慣れで仕事上のコミュニケーションにおいてもたどたどしくなってしまうことが多くあります。ここで、様々なことを発信してアウトプット力を育てたいです！

もう一つ、日々の勉強のモチベーション維持になればと思っています。自分も発信する側に回って勉強の動機付けになればいいですし、Qiitaがより身近になることで勉強が習慣化されるのではないかと思っています。
私も、新卒5年目の年で自分のスキルや経験に不安がないわけではないので、Qiitaを通じてより成長したいと思っています

## 3. 仕事内容
入社してからずっと同じ販売管理システムにかかわっています。
チームは何度か変わっているのですが、開発は未経験でどちらかというとインフラよりの仕事をしています。直近では、デプロイ作業をメインとする運用チームでリードをしています。

## 4. 資格等
基本情報技術者
応用情報技術者
Oracle DBA Bronze
Oracle DBA Silver
LinuC レベル1
簿記3級
Oracle Database 23c Free と Oracle Database 23ai Free の初期化パラメーターを比較する

　Oracle Database 23ai Free が公開されたため、Red Hat Enterprise Linux 8 にインストールしました。作成された環境で Oracle Database 23c Free と Oracle Database 23ai Free の初期化パラメーターを比較しました。ディレクトリのパスを指定する初期化パラメーターは除外しています（例：audit_file_dest）。

# 追加された初期化パラメーター
  Oracle Database 23ai Free で追加された初期化パラメーターです。


|パラメーター名|デフォルト値|説明|
|:---|:---|:---|
|db_recovery_auto_rekey|ON|Data Guardスタンバイで自動REKEYを行う|
|inmemory_optimized_date|DISABLE|In-Memory Optimized Date機能の有効化|
|lockfree_reservation|ON|マニュアルに記載無し|
|pdb_lockdown_error|RAISE|マニュアルに記載無し|
|priority_txns_high_wait_target|2147483647|優先度HIGHのトランザクション最大待ち秒数|
|priority_txns_medium_wait_target|2147483647|優先度MEDIUMのトランザクション最大待ち秒数|
|priority_txns_mode|ROLLBACK|プライオリティ・トランザクションのモード|
|shard_raft_logfile_size|1G|Raftログの最大サイズ|
|tablespace_encryption_default_cipher_mode|XTS|マニュアルに記載無し|
|transaction_recovery|ENABLED|PDBのトランザクションをリカバリするか|
|vector_index_neighbor_graph_reload|OFF|HNSW インデックスが自動ロードされるか|
|vector_memory_size|0|CDB の Vector Poolのサイズ|
|vector_query_capture|ON|Vector クエリのキャプチャを行うか|

上記以外に Oracle Database 23ai Free 環境では隠しパラメーター _instance_recovery_bloom_filter_size が設定されています（設定値は 1048576）。

# デフォルト値が変更された初期化パラメーター
自動構築された FREE データベースで、初期設定値が変更された初期化パラメーターです。

|パラメーター名|23c FREE|23ai FREE|備考|
|:---|:---|:---|:---|
|dml_locks|2208|1416|transactions から導出|
|optimizer_secure_view_merging|TRUE|NULL||
|processes|320|200||
|sessions|502|322|processes から導出|
|shard_enable_raft_follower_read|TRUE|FALSE||
|shared_pool_reserved_size|39929774|25836912||
|sql_error_mitigation|off|on||
|transactions|552|354|sessions から導出|

# 削除
初期化パラメーター mle_regexp_accelerator は削除されました。

# 名前変更
下記は初期化パラメーターの名前が変更されています。

|23cパラメーター名|23aiパラメーター名|備考|
|:---|:---|:---|
|json_behavior_flags|json_behavior||
|soda_behavior_flags|soda_behavior||

# 参考
以下の URL を参考にして記事を書いています。
- [Oracle Database Reference 23ai](https://docs.oracle.com/en/database/oracle//////oracle-database/23/refrn/index.html) F46697-05 May 2024
- [Oracle Database AI Vector Search User's Guide](https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/index.html) F87786-03 May 2024

Author: Noriyoshi Shinoda / Date: June 2, 2024
「Verification」と「Validation」の違い

## はじめに

◆この記事は何？
V&Vについて解説する記事です。

品質分野に出てくる「Verification」と「Validation」がややこしいと感じたので、わかりやすかった解説を紹介します。

## 先に結論
- 「V&V」は、「検証」と「妥当性確認」
- 「Verification（検証）」
    - 仕様通りに動作するか
- 「Validation」（妥当性確認）」
    - 期待に応え、動作し、役立つか

## Verification

決められたとおりに動くことが正しいと考えて、ソフトウェアがそれを満たしているかどうかを確認することを「Verification（検証）」といいます。

単体テストや結合テストは、「Verification（検証）」の性質が大きくなります。

## Validation

ユーザや顧客などのステークホルダが期待するものが正しいと考えて、ソフトウェアがそれを満たしているかどうかを確認することを「Validation」（妥当性確認）」といいます。

ユースケーステストやユーザビリティテストは、 「Validation」（妥当性確認）」の性質が大きくなります。

## おわりに

この記事では、VerificationとValidationの違いについて説明しました。

ソフトウェアテストは検証と妥当性のどちらについても実施されます。漠然とテストするのではなく、検証と妥当性確認の観点でテストを設計していく必要があります。

参考になれば幸いです。

## 参考

[「アジャイルプラクティス」](https://amzn.asia/d/cszeFVB)

[「ソフトウェアテストのセオリー」](https://amzn.asia/d/ejEohxp)
エンジニアの適切なAIとの付き合い方を考える

## 背景

今やAIを使うことが当たり前な時代になってきているのではないでしょうか。

日々新しい生成AIが出てきたり、知らない機能が増えていたりと最新情報をキャッチアップしていくだけでも大変です。

自分はエンジニアとしてのキャリアをスタートさせた時点から約1年ちょっとAIを使っていない時期を過ごし、その後日常的にAIを使い続けています。
（※執筆時点でエンジニア歴としては大体2年半ちょっと？もうすぐ3年目になりそうなところです。）

ちなみにこの辺りのAIを使ってきました。
* ChatGPT
* Claude
* Phind

しかし、**AIを使うことにどこかモヤっとした不安**が付き纏っている感覚があるのです。

そこで、これからエンジニアとしてさらに成長していく上で
今のAIとの付き合い方は適切なのか、どういったリスクがあるのかを改めて考えたいと思い記事にしました。

## AIを活用するリスク

まずは**AIを活用するリスク**についてどんなものがあるかを洗い出したいと思います。

今の自分の不安を言語化したものなので主観的ではありますが、
ざっと3点ほど思い浮かびました。

* ハルシネーションを見分けられず、誤ったアウトプットを出す可能性
* 誤った知識が身に付く可能性
* AIを使用しなかった場合に触れられていた知識に対する機会損失

では、それぞれ深堀っていきたいと思います。

### ハルシネーションを見分けられず、誤ったアウトプットを出す可能性

これはAIが生成したアウトプットをそのまま使うことで、
仮に誤った情報が生成された場合、それに気付かず丸々取り入れてしまうことで適切でないアウトプットを生み出す可能性です。

これはいろいろなケースが考えられますが、
例えばAIにコードを生成してもらいそれをそのまま実装した結果、
不具合があるのに気付かずシステムへ反映されてしまうというものです。

抽象的になりますが、対策としては基本的に**生成された結果は全て鵜呑みにしない**ということが大切でしょう。

根拠を探しに行き、自分で正しいと思えるまですり合わせをすることが対策になると思います。

プロなら当たり前ですが、**アウトプットに責任を持つ意識**が重要ですね。

### 誤った知識が身に付く可能性

これも上記と似ていますが、
AIが誤った回答をしてもそれに気付かず正しい情報として捉えてしまい
それが知識として定着してしまうということです。

**何かしらのアウトプットとして出て第三者に評価される**か、
**正しい情報に触れないと気付けない**ため危険だと感じています。

対策としては、**多方面から情報を仕入れること**がいいかなと思いました。

ただこれは正直AIに限った話ではありません。
世の中には誤った情報が出回ってしまっていることが多々あるので、
1つの情報源に頼らず複数の情報源を見ることがこのリスクへの対策になりそうです。

### AIを使用しなかった場合に触れられていた知識に対する機会損失

これはAIがある現在と、なかった頃を比べて感じたものです。

AIがない場合、何かしらの答えに辿り着くまで色々なソースを探しにいくと思います。

公式ドキュメント、技術記事、質問サイトなどから目的にあった情報を探すと思いますが
**その過程で知りたいことに対する周辺知識や、今まで全く知らなかった新情報に出会えていました。**

芋づる式に出てくる知らない単語を調べることで、**点となっている知識を線にしていく作業**があったというイメージです。

これについては機会損失的な話なので、具体的な影響に気付けないことがリスクだと感じました。

対策としては、**AIが生成した内容について知らない内容があれば深堀する**ことがいいでしょうか。

対話型のAIであれば、前提となる知識や知らない単語をその場で深堀することができます。

それに加えて上記で述べた対策を絡めると、
参考記事を漁って複数の情報源に触れる・または書籍などの信頼できるソースを確認するという作業を割り込ませると良さそうです。

また、基本的な内容であれば**資格取得の学習**も良いと感じています。
資格試験であればその分野に関する体系的な知識が身につきますし、基本的に間違いがないので。

## 最後に

AIとの付き合い方についてなんとなく抱えていた不安を言語化してみて、
ざっくりと対策を考えてみました。

皆さんはどういった不安を抱えていますでしょうか？
また、皆さんであればこの記事で挙げたリスクに対しどういった対策を取られるでしょうか？

ぜひお気軽にコメント頂けますと幸いです！
プログラミングのわからないの正体

![わからないの正体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/21a262e9-47f0-965d-61d8-137f89c036e1.png)

# はじめに

おはようございます。Watanabe Jin(@Sicut_study)です。
今回は「わからない」の種類についてお話していきます。

あなたは「質問をどのタイミングでしよう」と迷ったことありませんか？
「わからない」を理解することで仕事をうまくこなすことが可能になります。

# わからないを考えるきっかけ

私が運営しているプログラミングコーチングJISOUでは、日々駆け出しエンジニアの方々が自分の実力より1つ、２つ難しい課題に取り組んでもらっています。

そのような課題に取り組んでいると、メンバーから**わからないことが言語化できないのがものすごく辛い**と助けを求める場面に遭遇します。

コーチングは伴走型なので、完全理解するまでとにかく聞いてくださいと話していますがやはり「わからない」状態は辛いものです。

そこで、<font color="red">**わからないには種類がある**</font>と話したところ興味を持って聞いてもらえて、だいぶ本人の心が楽になったと思うので記事にしてみようと思いました。

# わからないの種類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/21e736eb-0dfb-f5e4-ebb6-8cebe862715f.png)

この図は**学習の5段階**という図で、NLP(神経言語プログラミング)で使われる考え方になります。

### １．無意識的無能（わからないことがわからない）
あなたはあることに関して何も知らず、知らないということさえも知らない状態

### ２．意識的無能（わからないことはわかるが、できない）
あなたはあることに関して知識を得ましたが、それを実践することはできない状態

### ３．意識的有能（考えるとできる）
あなたはあることに関してある程度できるようになってきましたが、
まだ習慣化されておらず、それを行うためにはある程度の集中力が必要な状態

### ４．無意識的有能（考えなくてもできる）
あなたは意識しなくても自動的にあることを実践することができている状態

### ５．無意識的有能に意識的有能（どこからでも教えることができる）
あなたが無意識的に行っていることを、意識して人に教えることができる状態

# わからないをうまく利用して質問する

新人の方は質問をするときに丁寧に質問を書くことも大切です

https://qiita.com/KNR109/items/550b52ff980c0c32bf2a

私はこれに加えて、
<font color="red">**私のわからないの状態はどの状態か？というのを伝えてほしいです**</font>

ここでプログラミングコーチングJISOUでは、「わからない」と感じたときにこの5段階でどこに位置しているのかを考えてもらうようにしています

**もし1の状態ならすぐに質問やリモートをつなげるなど手厚いサポートが必要だと考えています**

# なぜわからないを伝えるのか

**5段階は1に近ければ近いほど精神的につらい思いをするからです**

駆け出しエンジニアや新人、転職したばかりの状態ではとにかく多くのことからストレスやプレッシャーを受けます。わからないことがとにかく起きます。
そして人は焦りを覚えて自分を追い詰めていきます。

ここで、<font color="red">**わからないことで自分を追い詰めないようにするケアが必要です**

1(わからないことがわからない)ことがわかれば、サポートも手厚くなります。
3(考えればわかる)であれば、ヒントを与える程度にとどめることも可能です。

**わからないを把握することで本人の成長を最大限に考えることも可能なのです**

また、本人がわからないの種類を理解することで「いま誰かに聞くべきタイミングなのか」を判断することも可能になります

# 新しい環境へ飛び込むあなたへ

新しく入った環境で大変な思い、周りとのギャップ、「これからやっていけるか」という不安を感じるのは全員同じです。

そろそろ4月で変わり目のタイミングになりますが、**急ぐ必要はまったくないので自分を追い込みすぎずに気楽にチャレンジ**していただけるとよいです。

私は追い込みすぎて夢でまで勉強をしていた過去が有ります。しかし、あそこまで追い込む必要はまったくなく、**周りをうまく利用して効率的に成長する**ことが大切だと今になってい思います。

<font color="red">**「わからない」をうまく活用してあなたが活躍するのを楽しみにしております。**</font>

# おわりに

今回「わからない」には種類があること、そしてうまく活用することで教える側、教わる側どちらにもメリットがあることを話しました！

ぜひわからないの状態をうまく活用して質問をしてみてください！

ここまで読んでいただけた方はいいねとストックよろしくお願いします。
@Sicut_study をフォローいただけるととてもうれしく思います。

また明日の記事でお会いしましょう！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp
小ネタ　存在が耐えきれないほど軽い`date`（MySQL）

「分かりにくい命名はやめましょう」「分かりやすいSQLを書きましょう」ということの例示をしていたら、**MySQL**が謎の挙動をしたので少しビビったという話。

# なにが起きたか

|id|date|
|-|-|
|1|2001-01-01|
|2|2005-05-05|

↑のテーブルを念頭に↓を紹介していた。

```sql:ビビった部分抜粋
-- まず、お手本のSQLを用意した(WHERE句を抜粋。分かりやすさのために一部修正)
WHERE date BETWEEN '2000-01-01' AND '2003-03-03';

-- そこからちょっとだけ分かりにくい(諸説あり)文を用意したが、一番最初のdateを消し忘れていた。でも普通に動いた
WHERE date '2000-01-01' <= date AND date <= '2003-03-03';
-- もちろんこれも動く
WHERE '2000-01-01' <= date AND date <= '2003-03-03';
```

**あってもなくてもいい**根無草の`date`が出現してしまった。
「WHERE date という文がNULL判定しているんですか？」「キャストしてますか？」といった推測が入り乱れ、当の本人はめちゃくちゃ焦りながら「持ち帰って検討します」をした。

# なぜそんな動きをしたか

意図せず、日付リテラルの型の明示`date '2000-01-01'`の文になっており、`date`はあってもなくても変わらない動作をするので。

https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-literals.html

>標準 SQL では、型キーワードと文字列を使用して時間リテラルを指定する必要があります。 キーワードと文字列の間の空白はオプションです。(中略)
>MySQL は認識しますが、標準 SQL とは異なり、type キーワードは必要ありません。


```sql:全部ほぼ同じ意味のリテラル
-- よく見る普通の日付リテラル
'2000-01-01'
-- DATE型であることを明示。くっつけるパターン
date'2000-01-01'
-- DATE型であることを明示。空白を挟むパターン ←今回はこれ ←混乱する（※個人の感想）
date '2000-01-01'
```

# すべての原因
MySQLのキーワードである`date`をカラム名として使ったのが悪い。

「`date`という名前のカラムは[キーワードだが予約済みではない](https://dev.mysql.com/doc/refman/8.0/ja/keywords.html)ので、識別子として使えるが、使わない方がいい。」
という一般論を紹介しようとしたら、偶然にもはっきりとした理由を示すことができた。
（[識別子の大文字小文字を区別しない環境](https://dev.mysql.com/doc/refman/8.0/ja/identifier-case-sensitivity.html)においては[日付リテラルの型の明示 DATE 'str'](https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-literals.html) の他にも [関数 DATE()](https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-functions.html#function_date) 等とややこしいのでダメ）

## 自戒

日付型、時間型だけでも、今回の「寛容な」型の明示の他に「世話を焼いてくれる」変換があったりするが、それらとちゃんと向き合ってクエリを書こう。（自戒）

https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-type-conversion.html
Rails でメールを送信する

### 1. 送信元メールアドレス（gmail）の google アカウントの2段階認証を完了させる。

[google アカウントの Security 設定](https://myaccount.google.com/security)で、2段階認証を設定する。

### 2. 送信元メールアドレス（gmail）の google アカウントでアプリパスワードを作成する。

[google アカウントの App Password 設定](https://https://myaccount.google.com/apppasswords)で、アプリパスワードを設定すると、16個のアルファベット文字列を取得できる。これがアプリパスワード。

### 3. Rails 側の設定

##### 1️⃣ 以下のコマンドを入力

```
rails g mailer UserMailer
```

すると、以下のようにディレクトリが作成されます。

```
      create  app/mailers/user_mailer.rb
      create  app/mailers/application_mailer.rb
      invoke  erb
      create    app/views/user_mailer
      invoke  rspec
      create    spec/mailers/user_mailer_spec.rb
      create    spec/mailers/previews/user_mailer_preview.rb
```

##### 2️⃣ `ApplicationMailer` の作成

自動生成されたファイル内に以下を記載する。

```app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com' # 先ほどアプリパスワードを作成した gmail
  layout 'mailer'
end
```

##### 3️⃣ `UserMailer` の作成

自動生成されたファイル内に以下を記載する。

```app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def welcome_email(user:) # 引数は送信先ユーザー
    @user = user
    mail(to: @user.email, subject: 'メールの件名')
  end
end
```

##### 4️⃣ メール本文の作成

先ほど作成した `UserMailer` のメソッドに対応させて、 `app/views/user_mailer` 配下にファイルを作成する。
※ 件名は `UserMailer` で設定する。

```app/views/user_mailer/verify_email.text.erb
<%= @user.display_name %> 様

お世話になっております。

hogehoge
```

##### 5️⃣ 環境ごとの設定

```config/environments/development.rb
  config.action_mailer.default_url_options = { host: 'localhost', port: 3333 }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            "送信元googleアドレス",
    password:             "設定したアプリパスワード",
    authentication:       'login',
    enable_starttls_auto: true
  }
```

***

以上の設定により、送信されるはずです！！

```rb
user = User.find(1)
UserMailer.with(user: user).welcome_email(user: user).deliver_now
```
Jupyter/Google ColabでDenoを使う

## 概要

Jupyter(Google Colab)のコードセルでJavaScript/TypeScriptが書ければ便利なんじゃないかと思って試行錯誤した結果の記録

## Denoである理由

Denoの特徴の1つであるURL importによるパッケージインストール作業不要のモジュール取り込みはJuypterのコードセルのような基本再利用を前提としない書き捨てコーディング環境にはもってこいの機能だと思うので使えるようになったら面白いかなと。

## Denoカーネルを使わない理由

Denoは公式でJupyterカーネルを出してるのでそれをインストールすればいいじゃん…と思うかもしれませんが、残念ながら2024年6月現在DenoカーネルはGoogle Colabでは動かないようです。動くようになればこの記事は不要になるんですが(とはいえマジックコマンド非対応なのでIframe表示とかできなさそうですが…)

## 実現方法

これを実現するためにはセルマジックを使うのがいいようです。セルマジックはコードセルの先頭行にコマンドを書くことでそのコードセル全体の内容を引数として独自の処理をするというものです。

セルマジックの実態はほぼ単なるPython関数なので、PythonでDenoを呼び出して取得したコードセルの内容を渡す感じになります。こんな感じ(あらかじめDenoをインストールしてパスを通す必要があります)

```python
@register_cell_magic
def run_deno(line, cell):
    """
    Denoのコードを実行するマジックコマンド
    """
    # Denoコマンドを実行
    denocmd = "deno"
    process = subprocess.Popen(
        [denocmd, "eval", cell],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )

    stdout, stderr = process.communicate()

    # 結果を表示
    if process.returncode == 0:
        print(stdout.decode("utf-8"))
    else:
        print(stderr.decode("utf-8"))
```

## Google Colab対応

Google Colabにも対応ができたらいいなと思うのですが、Colabの場合Denoをランタイムが再起動する度にインストールし直す必要があるようです、またパスを通しても他のセルに反映されないっぽいので(やり方あるのかな？)Denoコマンドをフルパスで呼び出す必要がありそうです、結局なんだかんだJupyterとは処理が異なる感じになりそうなので場合分けするしかなさそう。

```Python
# Google Colabで実行しているかどうかを判定
def is_google_colab():
    try:
        import google.colab  # type: ignore  # noqa: F401
        return True
    except ImportError:
        return False


# Denoコマンド
def get_deno_cmd():
    if is_google_colab():
        return "/root/.deno/bin/deno"
    else:
        return "deno"


def install_deno_colab():
    """
    Denoのインストール(Google Colab用)
    """
    if not is_google_colab():
        print("Google Colab環境ではありません。Denoのインストールをスキップします。")
        return

    # Denoのインストールコマンド
    command = "curl -fsSL https://deno.land/x/install/install.sh | sh"

    # シェルコマンドを実行
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()

    # 出力を表示
    if process.returncode == 0:
        print("Denoをインストールしました。")
        print(stdout.decode())
    else:
        print("Denoのインストール中にエラーが発生しました。")
        print(stderr.decode())
```

### GitHubに載せてみた

その他、せっかくJavaScript/TypeScriptが使えるのだからブラウザ環境での実行も出来たら便利そうだなと思い、DenoでトランスパイルしたJavaScriptを差し込んだHTMLを生成してIFrameに出力するセルマジックも作って合わせてGitHubに公開してみました。

https://github.com/uniras/DenoMagic

ついでに、コードセルのPythonコードをPyScriptを利用してブラウザ環境で実行するマジックコマンドも作ってみた。

https://github.com/uniras/PyScriptMagic
Dartで競技プログラミングを行うたった1つの冴えないやり方

## 概要

特にすることのないときは競技プログラミングで問題を解いて感覚を忘れないようにしているのですが、
Dartに対応しているオンライン判定サイトってほとんど無いんですよね・・・

そこで、無理やりDartで課題をこなしてオンライン判定を受ける方法を考えてみました

## 結論

オンライン判定サイトが対応するプログラミング言語に変換すればいいじゃない！

ちなみにdart2jsはものすごい長大なコードを吐き出してコードの長さで弾かれるので使い物になりません。

## テンプレート

ではどうするかというと、DartコードをCharGPTやCopilot等のAIにかけてJavaScriptに変換してもらいます。プロンプトをコメントに埋め込むことでファイル全体をコピーしてAIの入力欄に貼り付けるだけで済むようにしています。
また、オンライン判定サイトへの提出もAIが出力したコードをそのままコピペすればいいようにしています。

```dart
/*
以下のDartコードをコメント内の指示に従ってJavaScriptに変換してください。
原則としてコメントとimport文は無視して出力しないでください。
ただし、最終行のコメント//process...はコメント文字//を除去してprocess...と出力してください。
ES6の機能、特にアロー関数は使わないでください。
出力コードにコメントを付ける必要はありませんし、コードの内容や変換の説明も不要です。
*/
import '../extern.dart'; //変換用の外部定義、後述

var useParse = true; //入力を２次元配列にパースする
var useNum = true;   //入力を数値に変換する

void start(String input) {
  
  
  
  
  
}

List<List<String>> inputString = [];
List<List<num>> inputNum = [];
var outputString = '';

void write(dynamic str) {
  outputString += str.toString();
}

void writeLine(dynamic str) {
  outputString += str.toString();
  outputString += '\n';
}

String parse(String input) {
  outputString = '';
  if (useParse) {
    input.split('\n').forEach((line) {
      if (useNum) {
        inputNum.add([]);
      } else {
        inputString.add([]);
      }
      line.trim().split(' ').forEach((cell) {
        if (useNum) {
          var cellnum = Number(cell);
          if (!isNaN(cellnum)) {
            inputNum.last.add(cellnum);
          } else {
            inputNum.last.add(0);
          }
        } else {
          inputString.last.add(cell);
        }
      });
    });
  }
  start(input);
  return outputString;
}

//process.stdout.write(parse(require('fs').readFileSync('/dev/stdin', 'UTF-8').trim()));
```

## 正確に変換してもらうための工夫

文字列を数値に変換する辺りはDartとJavaScriptでは大きく異なっており、そのままでは不正確な変換をされる恐れがあるので、変換する前のDartコードを意図したJavaScriptと同じコードに出来るようにJavaScriptと同等の関数を別のDartファイルで定義しています。

```dart
//dartにはないNumberコンストラクタとisNaN関数を定義して
//JavaScriptと同等のコードをDartでも動かせるようにする。
dynamic Number(String str) {
  try {
    return num.parse(str);
  } catch (e) {
    return double.nan;
  }
}

bool isNaN(dynamic numdata) {
  if (numdata is double) {
    return numdata.isNaN;
  } else {
    return false;
  }
}
```

## Dart環境でデバッグする

別ファイルに入力データと回答のDartコードを実行するコードを記述することでデバッグをします。
これで、変換依頼用のコードを加工やコピー範囲の調整をすることなくAIに変換依頼できるように工夫しています。

Dartには標準でユニットテスト用のライブラリがインストールされているので、それを活用することも出来ます。

上記の変換依頼用のコードはparse関数がエントリーポイントになっているので、入力データの文字列を引数にparse関数を呼び出せば実行します。

```dart
import 'dart:io';
import 'aot.dart' //変換依頼用Dartコード

void main() {
    //''' '''の間に入力データを貼り付けます
    var input = '''

    ''';

    //Dartコードを実行し、その結果を出力
    print(parse(input.trim())); 
}

```

ユニットテストを使用する場合は次のようにします

```dart
import 'dart:io';
import 'package:test/test.dart';
import 'aot.dart' //変換依頼用Dartコード

void main() {
  test('aoj test1', () {
    //''' '''の間に入力データを貼り付けます
    var input = '''

              ''';

    //''' '''の間に想定される出力文字列を貼り付けます
    var correct = '''

                  ''';

    //Dartコードを実行し、想定の出力と一致するか確認
    expect(parse(input.trim()).trim(), correct.trim());
  });

}

```
VirtualBoxからWSL2へ乗り換え　セットアップ備忘録

## 動機

もともとvagrantを利用しVirtualBoxの仮想環境を立てていましたが、PCを移行したことでスペックが下がり仮想環境での開発作業に支障が出るレベルになってしまったため、WSL2の仮想環境にて高速な開発が行えないか試してみよう！　という動機です。

## 概要

動機のとおり、移行作業を行ううえで躓いたポイントや、設定した内容などをメモとして残しておいて
未来の自分や、同じように設定をしようとしているみなさんが少しでも挫けないように残しておければと思っています。

## 環境

- Ubuntu 22.04

## 課題1. aptにてDNSの名前解決に失敗

#### 問題

`apt install` や `apt-get update` などで

```
Temporary failure resolving 'archive.ubuntu.com'
```

のエラーとなる

#### 対応1 => 失敗

https://qiita.com/kkato233/items/1fc71bde5a6d94f1b982

`generateResolvConf = false` とすると再起動時にresolv.confが作成されずにその場限りだった

#### 対応2 => 失敗

https://qiita.com/kkato233/items/1fc71bde5a6d94f1b982

の下のほうにあった

```
[external]
dnsTunneling=true
```

を試してみても全く効かず。

#### 対応3 => 失敗

https://zenn.dev/99no_exit/articles/e05c8536c86248

ではexternalではなくwsl2と記載していたのでそちらも試しました

```
[wsl2]
dnsTunneling=true
```

#### 対応4 => 失敗

https://zenn.dev/99no_exit/articles/e05c8536c86248

にて `/root/boot.sh` に配置し、 `/etc/wsl.conf` で実行する案ですが、boot.shが実行されていないようでうまくいきませんでした。

#### 対応5 => 成功

https://zenn.dev/nobsun/articles/workaround-dns-issues-in-wsl2

対応4の方法に似た対応ですが、wsl.confにて実行コマンドではなく、systemctlのserviceを自作する案

## 課題2. sshで接続できるように準備

WSL2の環境にそのままではssh接続できない

#### 対応1 => 成功

https://qiita.com/tmiki/items/022242af3853cd8e7a6a

のとおり、sshをインストールし、sshdにより接続できるようにする

## 課題3. wslがUbuntuのアプリを終了すると自動でshutdownされてしまう

https://qiita.com/fronoske/items/f7e410460290cfb4062f

にある通り、自動終了される仕組みのよう。

#### 対応1 => 成功

https://qiita.com/toydev/items/7784927f96e58b182b26

を参考にvbsを用意し自動でバックグラウンド起動するようにする

## 課題4. クリップボードの共有

wsl内のneovimとwindowsのクリップボードの共有をしたい

#### 対応

https://qiita.com/r12tkmt/items/ddb75886b69dc4a328c3
にて別記事でまとめました

## 課題5. $PATHにwindowsのPATHが混ざっている

`zsh: no matches found: (x86)/NVIDIA`

と出て、原因がわからず困っていたが
$PATHを見ていると `/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common` というものがあり、おそらくスペースが適切に判断されず`(x86)/NVIDIA` の部分だけがエラーにでていた様子。

#### 対応

wsl.confに下記を追加
```
[interop]
appendWindowsPath=false
```
WSL2とneovimでクリップボードを共有する(lemonade)

## 背景

もともとwindowsにてvirtualboxの仮想環境を扱っておりましたが、  
諸事情によりWSL2に乗り換えることとなりました。

virtualboxでは[lemonade](https://github.com/lemonade-command/lemonade) を使用し、
windows側でlemonadeサーバーを立て、仮想環境からwindows側へTCPを使いクリップボードの共有を行いに行く　という形をとっていました。

が、仕事の都合上、windowsのファイヤーウォールの設定をいじることができないため、疎通ができないため諦めていてWSLでの他の共有方法を探していました

## 検討

WSLでのクリップボードを共有する方法を調べていると、

- xclip/xsel
    - xサーバーをwindowsで立てる形になり、windows側へ疎通するのが同じくファイヤーウォールの都合上難しい
- win32yank
    - たまにfreezeしたりcrash報告がいろいろあるらしい
- clip.exeでコピーとpowershellで貼り付け
    - powershellを使ったpasteが遅いらしい

などなど、どれも微妙だな～と思っていました。

## 仮説

lemonadeでは

> windows側でlemonadeサーバーを立て、仮想環境からwindows側へTCPを使いクリップボードの共有を行いに行く

という方法だったが、wslでは仮想環境から直接windows側のlemonade.exeを実行できるので、ホスト側のlamonadeで直接copyしてあげればクリップボードに反映されるのでは？

## 動作確認

wsl側で、`/mnt/c/` から辿るとexeファイルをそのまま実行できるので、`/mnt/c/hogehoge/lemonade.exe copy "hoge"` としてみると、windows側でpasteしてみると`hoge`が貼り付けられた！ => 成功 :smile: 

同じようにwindows側でコピーした内容も `/mnt/c/hogehoge/lemonade.exe paste` にてコンソールに表示されることを確認

## 設定

https://github.com/neovim/neovim/blob/master/runtime/autoload/provider/clipboard.vim#L120

を見ると、`lemonade` にパスが通っているとneovim側で何も `g:clipboard` に設定しなくても良さそう

wsl用にわざわざ設定を分けなくて良いので、vimの設定ファイルはキレイさを保てる！
環境の問題は環境側の設定のみで解決したい。

パスを通すため、パスの通っているところにlemonadeのシンボリックリンクを貼る

`ln -s /mnt/c/hogehoge/lemonade.exe ~/.local/bin/lemonade`
BlobStorageの使用量をaz cliでとりたい

# はじめに
普通、Blob Storageの値は、Azureポータル画面から見られるわけだけど、
数値データを収集したいのでaz cliでとる方法を調べてきました。

# az cliでとるよ！
今回はaz cliでサクッととる方法を調べました。

# 先に結論
az loginしてから実行する
--resourceにはリソースIDを入力したらごちゃごちゃ書かなくていいので楽。

```
C:\Users\user>az monitor metrics list --resource "/subscriptions/XXXXXXXXXXX/resourceGroups/pro-rg-nabehiro-001/providers/Microsoft.Storage/storageAccounts/prosanabehiro001" --interval 1h --metric UsedCapacity --query "value[0].timeseries[0].data[0].average"
```

結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c3e43ef9-5a79-5ddd-c432-ba9b49f174e5.png)



# メモ：インターバルの指定は指示に従うこと
--intervalはデフォルト値が1分となっており、その値だと、BlobStorageの場合１時間おきに値をとってるようでエラーになったのでその時の結果をおいときます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/96d48bfe-cbad-52b6-1878-23625cd9a071.png)

# メモ２：BlobStorageのUsedCapacity全体の値
ピンポイントで値を指定する前にjsonの構造を調べたときの結果を後々のために残しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/846261e9-e6bc-3d23-a756-9cde99a708ad.png)

# おわりに
Azure Monitor SDKってのがあるっぽい。
az cliだと単発になっちゃうからこれつかってガツっととれるかな？
また今度調べてみよう
https://learn.microsoft.com/en-us/python/api/overview/azure/monitor?view=azure-python
【個人開発】「住所なう！」というブラウザで今自分がいる場所の住所を出すだけのシンプルなアプリを作成しました！

**これは下記記事の本人による転載です。**

https://ogatomo.net/blog/2024/06/02/jyusyonow/

こんにちは。中学1年の小川です。

今日は新しいアプリを作ったので紹介します！

## 「住所なう！」とは？

その名も住所なう！です。

平成中期のネーミングセンスですね(彼は2011年生まれです)

このアプリは今いる場所の郵便番号と住所、ビルやマンション・アパートなどの建物の場合は建物名を表示するアプリです。

下のリンクから実際に使ってみることができます。

[https://ogatomo.net/jyusyonow/](https://ogatomo.net/jyusyonow/?utm_source=qiita&utm_medium=button&utm_campaign=introduction)

## 操作方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518724/226f75c5-b49d-f4e9-edc2-43fa9f4480e4.png)

操作方法はいたってシンプルでボタンを押すだけで使えます。

現在地を取得を押すと位置情報へのアクセスが求められるので許可します。

今回は東京駅と大阪駅の場合で試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518724/47fc5489-a47c-1bc5-f636-52364c3c85d3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518724/6a5515b5-8044-d38e-5f93-1483ba10c954.png)

どちらも無事に取得できています。

## 利用API

今回このアプリを作るにあたって、緯度経度から住所・建物名の取得に「Yahoo!リバースジオコーダAPI」を、住所から郵便番号への変換に「ExcelAPI」を用いています。

どちらもすごく使い勝手がよく開発しやすかったです。

## 注意事項

- パソコン等の内蔵GPSがない端末で使うとWi-Fiなどをもとに位置情報を算出するため、位置情報の精度に影響がございます。ですのでスマートフォンでの利用を推奨しております。
- 利用しているExcelAPIの都合上、建物ごとなどの固有の郵便番号は表示されず、汎用の郵便番号で表示されます。郵便はしっかり届くのであまり実用上の問題はないかと思われます。
- 当サイト、およびアプリでは一切位置情報の収集は行いませんが、Yahoo!ジオコーディングAPI及びExcelAPI側では位置情報が収集される可能性があります。ご利用の際は完全自己責任でお願いいたします。

## 最後に

いかがだったでしょうか。今回は今いる住所を簡単に出すことができるアプリ「住所なう！」を紹介しました。Webアプリでインストールせずに使えるのでぜひ使ってみてください！

最後までお読みいただきありがとうございました。

[https://ogatomo.net/jyusyonow/](https://ogatomo.net/jyusyonow/?utm_source=qiita&utm_medium=button&utm_campaign=introduction)
エージェントを使わずに、LangChainとOllamaでタイタニックデータセットに直接質問してみた

## はじめに
こんにちは！今回は、LangChainとOllama（llama3）を使用して、タイタニックのデータセットに対する質問応答をしてみます。前回はpandas_dataframe_agentを使用していましたが、今回はこれを使わずにテーブルのデータを文字列としてあつかって、LLMでそこに聞いてみるアプローチをしました。

エージェントを使わなかった場合、情報量が少ないとエラーが発生せず、うまくいくこともあるのではとおもって試してみました。

https://qiita.com/Tadataka_Takahashi/items/cb6be826e2e9ae95afad

結論からいいますと、この記事は失敗談です。**私の考えは甘かったです・・。**

試行錯誤の結果、全体のデータに対して質問するよりも、部分的な情報に対して扱う方が、現在の自分の扱えるモデル（llama3）では実用性が高いのではないかということが分かりました。この経験を共有し、皆さんの参考になればと思います。

ただし、将来的にもっとパラメータ数の多いモデル、違うハードウェアで動かした場合には結果が変わってくる時代がそう遠くない未来にくるのではと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/6b45b25f-b493-582f-fa6d-8684b1208e4d.png)
きっと近い未来にもっとうまくいくはず・・？agent使った場合も、もっと精度高くなっていく？

## 前提条件

- Python 3.7以上
- Pandas
- LangChain
- Ollama
ollamaはインストールされていて、llama3のモデルをpullしていることを前提としています。

## 環境設定

まず、必要なライブラリをインストールします。

```bash
pip install pandas langchain ollama langchain_community 
```

## コードの説明

以下のコードは、LangChainとOllamaを使用して、タイタニックデータセットに対して直接質問を投げる方法を示しています。

### ステップ1: ライブラリのインポート

```python
import pandas as pd
from langchain_community.llms import Ollama
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
```

### ステップ2: データの読み込み

サンプルデータとしてタイタニックのデータセットを読み込みます。

```python
# サンプルデータとしてタイタニックのデータセットを読み込む
df = pd.read_csv(
    "https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv"
)
```

### ステップ3: LLMのインスタンス作成

Ollamaを使用して、言語モデルのインスタンスを作成します。

```python
# LLMのインスタンスを作成
llm = Ollama(model="llama3")
```

### ステップ4: PromptTemplateとLLMChainの作成

PromptTemplateとLLMChainを作成し、DataFrameを文字列に変換した後、新しい質問を投げます。

```python
# PromptTemplateを作成
template = """
{{question}}

### Document
{{dataframe}}

### Answer
"""
prompt = PromptTemplate(template=template, input_variables=["dataframe", "question"])

# LLMChainを作成
llm_chain = LLMChain(prompt=prompt, llm=llm)
```

### ステップ5: 質問の実行

DataFrameを文字列に変換し、質問を投げます。

```python
# DataFrameを文字列に変換
dataframe_str = df.to_string()

# 質問を定義
question = "how many rows are there in PassengerId?"

# 質問を投げて回答を得る
response = llm_chain.run(dataframe=dataframe_str, question=question)
print("Answer:", response)
```

## 結果
google colabでの実験結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ebf05606-bc17-b38a-5214-c5a3d54c0b21.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b8d21e7c-11c1-f74d-f7fc-3d693cdf9411.png)

891なんだが・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/70136765-4ca8-091a-9783-ae1330ecff48.png)
ChatGPTで確認したところ、517人だった・・・。うーん。
ChatGPTのほうはコードインタープリターでpythonで処理した結果だしな。ギャップがあることがわかった。ChatGPTになれて、それが当たり前になってる自分の感覚も麻痺しているのかもしれない・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/6ba6b8e9-8f9a-2947-9485-4b5c1342bcb4.png)

## まとめ

LangChainとOllamaを使用すると、データフレームに対して直接質問を投げ、回答を得ることができます。しかし、今回の試行から、全体のテーブルデータに対してLLMで操作するよりも、部分的な情報に対して扱う方が実用性があるのではないかという、結論になりました。現時点では。これは一つの失敗談として、次回以降の改善に役立てたいと思います。将来的に、もっとパラメータ数の多いモデル、更新されたライブラリ、実装方法で試してみることで、結果が変わるかもしれません。データの探索や分析をより効率的に行うための一助になれば幸いです。