OmniAICreator/Qiita-1.07M huggingface dataset:
CSSを学びたい Step20 スムーズスクロール

## はじめに
CSSを学びたい Step20です！スムーズスクロールを実現します！
※スムーズスクロールは、リンクをクリックしたときにページ内の特定の位置にスムーズにスクロールする事です。

## 成果物
![smooth-scroll.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/52af1848-74b6-27b2-342b-386a9df57468.gif)

## ソースコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Smooth Scroll Example</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <h2>スムーズスクロールのサンプル</h2>
  <nav class="sticky-nav">
    <ul>
      <li><a href="#section1">1</a></li>
      <li><a href="#section2">2</a></li>
      <li><a href="#section3">3</a></li>
      <li><a href="#section4">4</a></li>
      <li><a href="#section5">5</a></li>
    </ul>
  </nav>

  <div id="section1" class="section">
    <h3>セクション1</h3>
    <p>ここはセクション1の内容です。</p>
  </div>

  <div id="section2" class="section">
    <h3>セクション2</h3>
    <p>ここはセクション2の内容です。</p>
  </div>

  <div id="section3" class="section">
    <h3>セクション3</h3>
    <p>ここはセクション3の内容です。</p>
  </div>

  <div id="section4" class="section">
    <h3>セクション4</h3>
    <p>ここはセクション4の内容です。</p>
  </div>

  <div id="section5" class="section">
    <h3>セクション5</h3>
    <p>ここはセクション5の内容です。</p>
  </div>
</body>
</html>
```

```css:styles.css
body {
  font-family: Arial, sans-serif;
  background-color: #f4f4f4;
  margin: 0;
  padding: 20px;
  scroll-behavior: smooth; /* スムーズスクロールを有効にする */
}

h2 {
  text-align: center;
  color: #333;
}

.sticky-nav {
  position: -webkit-sticky; /* Safari用 */
  position: sticky;
  top: 0;
  background-color: #fff;
  padding: 10px 0;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  z-index: 1000;
}

nav ul {
  list-style-type: none;
  padding: 0;
  margin: 0;
  text-align: center;
}

nav ul li {
  display: inline;
  margin-right: 10px;
}

nav ul li a {
  text-decoration: none;
  color: #007BFF;
}

nav ul li a:hover {
  text-decoration: underline;
}

.section {
  background-color: #fff;
  border-radius: 5px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  margin: 20px 0;
  padding: 20px;
}
```
PowerPointマクロをクイックアクセスツールバーに登録する方法

# はじめに
PowerPointのマクロは一般的なアドインとして登録することができませんが、次の3つのステップでアドインのように使用できるようにすることが可能です。

1. マクロを作成する
1. マクロをクイックアクセスツールバーに登録する
1. マクロのリンクをpptmファイルからppam（アドイン）ファイルに書き換える


この手順を踏むことで、PowerPointの起動時にマクロをすぐに使える状態にすることができます。以下に、各ステップを分かりやすく説明します。

# 手順
## 開発ツールをONにする
    1. PowerPointを開きます。
    2. メニューバーの「ファイル」タブをクリックします。
      「オプション」を選択し、「PowerPointのオプション」ウィンドウを開きます。
    3. 左側メニューから「リボンのユーザー設定」を選択し、右側の「開発」ボックスにチェックを入れます。
    4. 「OK」をクリックしてウィンドウを閉じます。

これで「開発」タブが表示され、マクロを作成する準備が整いました。

## マクロをPPTMファイルに作成する
    1. 「開発」タブをクリックし、「マクロ」を選択します。
    2. マクロ名を入力し、「作成」をクリックします。
    3. VBAエディターが開くので、マクロのコードを入力します。

以下は簡単な四角形（□）を描画するマクロのサンプルコードです。これを例に説明します。

```vb
Sub DrawSquare()
    Dim sideLength As Single: sideLength = 100 ' 辺の長さ
    Dim posX As Single: posX = 200 ' 四角形の左上X座標
    Dim posY As Single: posY = 150 ' 四角形の左上Y座標
    
    ' 四角形を描画
    Dim square As Shape
    Set square = ActivePresentation.Slides(1).Shapes.AddShape(msoShapeRectangle, posX, posY, sideLength, sideLength)
    
    ' 四角形のスタイルを設定
    square.Line.Weight = 2 ' 線の太さ
    square.Line.ForeColor.RGB = RGB(0, 0, 0) ' 線の色（黒）
    square.Fill.Transparency = 1 ' 塗りつぶしを透明に
End Sub
````

コードを書き終えたら、VBAエディターを閉じます。

## ファイルをppam形式（アドイン形式）で保存
マクロファイルをppam形式（アドイン形式）で保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/d72c2e0f-3e21-cf4b-a723-ea1a155d5236.png)

保存後アドインツールを有効にすることをしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/7cd65eec-0784-d6fa-5e73-dfdb82f722ce.png)

 

## マクロをクイックアクセスツールバーに登録する
1. PowerPointの左上にある「クイックアクセスツールバー」を右クリックし、「クイックアクセスツールバーのユーザー設定」を選択します。
2. 「PowerPointのオプション」ウィンドウが開いたら、「コマンドの選択」で「マクロ」を選択します。
登録したいマクロ(pptmの方）を選び、右側の「追加」ボタンをクリックします。
3. 「OK」をクリックしてウィンドウを閉じると、クイックアクセスツールバーにマクロが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/a59282c3-485e-e111-2d62-24f166b1d723.png)


## PPTMファイルを閉じて、リンク先のファイルをppamに書き換える
PowerPointとpptmファイルを閉じます。

クイックアクセスツールバーの設定ファイルを以下の場所から開きます：

C:\Users\***\AppData\Local\Microsoft\Office\PowerPoint.officeUI
※***には自分のユーザー名が入ります。

メモ帳などのテキストエディタでPowerPoint.officeUIファイルを開き、登録したマクロがpptmファイルとしてリンクされている部分を探します。
pptmのリンクを、ppam（アドイン）ファイルに書き換えます。必要に応じて、PowerPoint.officeUIファイルをバックアップしておいていください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/5d0b2fdf-97ac-8815-7951-c1c1fc1e4c02.png)



## PowerPointを再起動する
PowerPointを再起動します。
クイックアクセスツールバーに登録したマクロがアドインとして利用できるようになっているはずです。
以上の手順で設定すれば、PowerPointの起動時にクイックアクセスツールバーからマクロを実行できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/dfc4d50e-8895-2cdf-b7be-1352b58887d0.png)

## 最後に
簡単って書いたけど、あんまり簡単ではなかったですね。
aタグとbuttonタグの使い分けについて

# はじめに
学んだことを忘れないように備忘録として残しています

aタグとbuttonタグは、どちらもユーザーがクリックすることで動作する要素ですが、役割や使用場面が異なります。
それぞれの特徴と使い分けのポイントを以下に説明します。

## 1. aタグ
主に他のページやサイト、または同じページ内に飛ぶためのリンクに使用されます。

・特徴
リンクとしての役割がある。
href 属性が必要です。href にリンク先のURLを指定し、ユーザーがクリックするとそのリンク先に移動します。
SEOやアクセシビリティの観点で、検索エンジンが「リンク」として認識します。

## 2. buttonタグ
buttonタグは、「ボタン」として、フォームの送信やJavaScriptのトリガー（例.ハンバーガーメニュー）など、ページ内の操作を実行するために使用されます。

・特徴
フォームの送信やJavaScriptによる処理の実行などに使用されます。

## 3. aタグとbuttonタグの使い分けポイント
タグ	使い分けのポイント
・buttonタグ
クリックしてもページ移動しない

・aタグ
クリックするとページ移動する
OSリソースをリアルタイム監視！New Relic Infrastructureを使用してみた

# はじめに
この記事は**New Relic 使ってみた情報をシェアしよう！ by New Relic Advent Calendar 2024**シリーズ1の7日目です。

https://qiita.com/advent-calendar/2024/newrelic

本記事では、[New Relic](https://newrelic.com/jp)が提供する多彩なサービスの中から、特に**New Relic Infrastructure**に注目して使用してまとめてみました。

個人でサーバーを構築している方や、業務でサーバー・コンテナ環境を運用している方、さらにはPCやローカル環境のパフォーマンスを効率的に管理したい方は参考になるのではないかなと思います。

## New Relic Infrastructureとは
**New Relic Infrastructure**は、サーバーやアプリケーションの動作状態をリアルタイムで監視できるツールです。
CPU使用率、メモリ消費量、ディスクI/O、ネットワークトラフィックなど様々なデータを可視化し、アラート機能で問題の早期発見や問題箇所を把握し改善することでパフォーマンス向上に役立ちます。

今回記事内で使用したMacOS環境以外にも**Linuxディストリビューション**、**Windows**など主要なOSに対応していて、**Docker**や**Kubernetes**などのコンテナ技術を使用した環境のモニタリングにも対応しているようです。

# New Relic Infrastructureの導入手順

## 1. New Relicアカウントの作成
New Relicの機能を利用するためには、アカウントを作成する必要があります。
2024/12/07現在、Freeプランでは全機能にアクセスできるフルアクセスユーザー1名と月間100GBまでのデータ転送が可能のようです。

https://newrelic.com/jp/sign-up-japan

## 2. 監視エージェントのインストール
#### **ステップ1: Guided Installの選択**  
アカウント登録後、New Relic管理画面の左サイドバーから**Integrations & Agents** > **Guided Install**を選択します。 
![NewRelicIntegrations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/f60525cf-dc55-d024-6a84-c0d6a5872fb6.png)

#### **ステップ2: 対象環境の選択**  
監視したい環境（Mac、Linux、Windowsなど）を選びます。
今回私はMacを監視したいため、`macOS`を選択しました。
![select os.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/10d47242-fe42-3600-6682-90da7c9d5f6f.png)

#### **ステップ3: UserKey発行とインストールコマンドの実行**  
New Relicが提供するUserKeyを発行し、表示されたインストールコマンドをコピーして実行します。

:::note warn
**UserKey**は重要な認証情報のため公開リポジトリやブログ記事などに誤って記載しないように注意してください。
:::

![apikey and command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/4da794b9-125f-5359-a2de-a9056cd3f30f.png)

#### **ステップ4: インストール結果の確認**  
インストール完了後、コマンドの出力結果に表示されるリンクをクリックすると、監視対象のリソース情報が管理画面に表示されます。  

![NewRelicShell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/5415d817-acd2-4cc1-1c22-96a7013a4beb.png)

出力結果にあるリンクへアクセスするとお使いの環境の動作情報が監視できているはずです！

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/3176735b-6e52-2917-1731-f617005fb2ae.png)

## おまけ
**New Relic**はモバイルアプリ版も提供しているみたいで、移動中でもスマホからリアルタイムのシステム状況を把握できるのはありがたいですね。

モバイル版のダウンロードはこちらから

https://docs.newrelic.com/jp/docs/mobile-apps/mobile-apps-intro/

実際にモバイル版もダウンロードしてみました。

![IMG_1426.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/37ada78f-b29e-acad-51c3-05e4a59ff95b.png)


## まとめ

今回は**New Relic Infrastructure**について使用してまとめてみました。
リアルタイムモニタリングや柔軟なアラート通知対応など、幅広い用途で利用可能なツールです。
月間100GBまでのデータ転送が無料枠で使用できるのでぜひ一度使ってみてはいかがでしょうか。
【データ改ざん対応】安全な情報伝達手段、JWT（JSON WEB Token）とは？

**JWT（JSON Web Token）**は、クレームベースの情報を安全に伝達するためのコンパクトでURLセーフなトークンフォーマットです。JWTは、JSON形式のデータをベース64URLエンコードし、署名を付けて作成されます。これにより、データの改ざんが防止され、トークンの送受信が安全かつ効率的に行われます。

### JWTの構造

JWTは、**ヘッダー**、**ペイロード**、**署名**の3つのパートで構成されており、各パートはピリオド（`.`）で区切られています。構造は以下の通りです。

```
header.payload.signature
```

#### 1. **ヘッダー（Header）**

JWTのヘッダーには、トークンの種類（通常は`JWT`）と署名に使用するアルゴリズム（例：HS256、RS256）が記載されます。

**例**:

```
{ "alg": "HS256", "typ": "JWT" }
```

‌

このヘッダーはBase64URLエンコードされ、トークンの最初のパートを形成します。

#### 2. **ペイロード（Payload）**

ペイロードには、トークンに含まれるクレーム（claims）と呼ばれる情報が格納されます。クレームには、標準クレーム、公開クレーム、プライベートクレームの3種類があります。

- **標準クレーム**: JWTの仕様で予約されたクレームで、意味が定義されています。
  - `iss`（Issuer）: トークンの発行者。
  - `sub`（Subject）: トークンの対象ユーザー。
  - `aud`（Audience）: トークンの対象者（サービス）。
  - `exp`（Expiration Time）: トークンの有効期限。
  - `iat`（Issued At）: トークンの発行日時。
  - `nbf`（Not Before）: トークンが有効になる日時。
- **公開クレーム**: 開発者が定義し、共通の意味を持たせることができます。例えば、`name`や`email`といった情報。
- **プライベートクレーム**: 特定のアプリケーション間でのみ使用されるクレームです。共通の定義はありません。

**例**:

```
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": 1516239022 }
```

ペイロードはBase64URLエンコードされ、JWTの2番目のパートを形成します。

#### 3. **署名（Signature）**

署名は、JWTが改ざんされていないことを確認するために使用されます。署名は以下の方法で生成されます：

```
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
```

**署名の生成に使用される要素**:

- **アルゴリズム**: ヘッダーで指定されたアルゴリズム（例：HS256やRS256）。
- **シークレットキー**: HMACの場合は共通の秘密鍵を、RSAの場合は秘密鍵を使用。

この署名パートはトークンの最後の部分を形成します。

### JWTの使用例

JWTは、通常HTTPヘッダーに付与され、APIリクエストなどで認証や認可のために使用されます。

**例**:

```text
Authorization: Bearer <your_jwt_token>
```

### JWTの使用ケース

- **認証**: ユーザーがログインした後にトークンを発行し、各リクエストにトークンを付与することで、認証を維持します。
- **情報の安全な伝達**: JSON形式のデータを安全に送信するために使用され、改ざんされていないことを保証します。

### JWTのセキュリティ

JWTは改ざんを防止するための署名が付与されているため、受け取った側はトークンが改ざんされていないことを検証できます。しかし、**JWTは暗号化されていない**ので、誰でもペイロードの内容を閲覧することができます。そのため、機密情報はペイロードに含めるべきではありません。

**セキュリティ考慮点**:

- **HTTPS使用の必須**: JWTは安全に送信されるよう、常にHTTPS経由で通信します。
- **トークンの有効期限管理**: `exp`クレームを使用してトークンに有効期限を設定し、セキュリティを強化します。
- **署名アルゴリズムの選択**: 強力なアルゴリズム（例：RS256）を使用し、秘密鍵の適切な保護を確保します。

### JWTの利点

- **コンパクトでURLセーフ**: Base64URLエンコードにより、URLに組み込んで使用することができます。
- **自己完結型**: トークン自体に必要な情報が含まれているため、データベースアクセスが不要になることがあります。

### JWTの欠点

- **ペイロードの可視性**: ペイロードは暗号化されていないため、機密情報を含めるべきではありません。
- **サイズ**: 大量のクレームを含めるとトークンサイズが大きくなり、パフォーマンスに影響を与えることがあります。

JWTは認証と認可において非常に便利で広く使用されていますが、その利用には適切なセキュリティ対策を講じることが重要です。
【リスト内包表記】ラムダ式と組み合わせたら困った話

## 目次
- [はじめに](#はじめに)
- [問題について](#問題について)
- [解決方法](#解決方法)
- [考察](#考察)
- [結論](#結論)
- [最後に](#最後に)
## はじめに
　リスト内包表記でのラムダ式の使用中に、期待と違う動作をされて困ったので、備忘録として解決策を置いておこうと思います。考察もしていますが、厳密な説明ではなく、あくまで筆者の解釈です。

## 問題について
```python
l = ['apple', 'grape', 'lemon']
l2 = [lambda:[i, id(i)] for i in l]
for j in l2:
    print(j())

>>>
['lemon', 2409481603056]
['lemon', 2409481603056]
['lemon', 2409481603056]
```
　このように、リスト内包表記の中でラムダ式を使うと、リストの要素が全て最後の要素と同じになってしまうので、これを解消する方法を紹介したいと思います。

## 解決方法
先に結論を言っておくと、以下のコードを
```python
l2 = [lambda:[i, id(i)] for i in l]
```
このように書き換えると解決します。
```python
l2 = [lambda x=i:[x, id(x)] for i in l]
```
　```i```を直接中身に渡すのではなく、一度```x```に渡して、```x```を中身に渡すという風に変わっています。こうすることで、関数を呼び出したときに```i```の値が変わっていても関係なくなるため解決します。

追記：
コメントで教えていただいたのですが、以下のように変更しても解決可能です。
①
```python
l2 = [(lambda i:
           lambda : [i, id(i)]
       )(i)
    for i in l
    ]
```
引数を受け取った状態の関数を返すので、```i```が書き換わっても関係がなくなるためです

②
```python
l2 = (lambda:[i, id(i)] for i in l)
```
リスト内包表記の代わりにジェネレータ式を用いています。ジェネレータは次に値を取り出すまで処理を止めて待ってくれるので、```i```が書き換わらずに待ってくれるためです。ただし、こちらは取り出す順番が決まっている場合にのみ有効な手段となります。


## 考察
　ここからはなぜ上記の方法で解決できるのか考えてみたいと思います。
```python:test.py
def test():
    l = ['apple', 'grape', 'lemon']
    l2 = []
    for i in l:
        func = lambda:[i, id(i)]
        l2.append(func)
    return l2
for j in test():
    print(j())
>>>
['lemon', 1761796013040]
['lemon', 1761796013040]
['lemon', 1761796013040]
```
　とりあえず、リスト内包表記を用いずに、この問題を再現してみました。再現できたという事は、リスト内包表記に特有な問題というわけではなさそうですね。これと同じことが、リスト内包表記でも起こっていると考えて、考察を行なっていきます。
　まず、forループ中での```i```の扱いですが、配列から取り出した各要素と```id```が一致します。これは変数の定義のように、普通の代入をしている状態です。つまり、上記のコードで言うなら、ループごとに```i```というローカル変数を、上書きしている状態です。
　次に```func```について考えていきます。ここで重要になるのが、```func```がどのタイミングで```i```を受け取るかということです。上記のコードでは、リスト内包表記に見立てた関数を抜けた後で、外部から```func```を呼び出しています。これは、```test```の内部にローカル変数として定義されている```func```を呼び出すと言う操作になります。どうやら```func```が```i```を参照するのが、定義された時ではなく、この呼び出された時のようなのです。実際```return```の前に```del i``` としてやると、値がないためエラーが出ますし、```i = 'meron'```としてやれば、全て```'meron'```に置き換わります。
　要するに解決策としては、```i```を受け取るのを、呼び出された時ではなく、定義された時にしてやれば良いわけです。```lambda x=i:[x, id(x)]```としてやれば、いつ呼び出されても参照するのは```x```の方になりますので、どれだけ```i```が上書きされようが、問題ないと言うわけですね。
　リスト内包表記で実際に試してみると、期待通りの結果が得られました。
 ```python
l = ['apple', 'grape', 'lemon']
l2 = [lambda x=i:[x, id(x)] for i in l
for j in l2:
    print(j())
>>>
['apple', 2248410854192]
['grape', 2248413513840]
['lemon', 2248413513904]
```
## 結論
　問題の原因は、ラムダ式が参照している先の変数が書き換わることだった。したがって、ラムダ式を使う際は、変数を直接渡すのを避けるべきである。リスト内包表記に限らず、関数内でラムダ式の定義を行う場合には、同様の問題が起こりうるので、注意が必要である。

## 最後に
　今回は、リスト内包表記とラムダ式を組み合わせる際の注意点と、解決策を扱いました。自分はネットで検索してもうまくヒットせず、AIに聞いて解決した問題だったので、この記事が役に立ったと思う人が、一人でもいればいいなと思います。
書籍『LangChainとLangGraphによるRAG・AIエージェント［実践］入門』(2024年11月9日発売)について

とにかく初心者にもわかりやすく、生成AI初心者や非エンジニアにもわかりやすい。

生成AI関係の書籍の中で間違いなくナンバーワンの書籍と言える❗️
## <font color="Blue">目次</font>

第1章　LLMアプリケーション開発の基礎
第2章　OpenAIのチャットAPIの基礎
第3章　プロンプトエンジニアリング
第4章　LangChainの基礎
第5章　LangChain Expression Language（LCEL）徹底解説
第6章　Advanced RAG
第7章　LangSmithを使ったRAGアプリケーションの評価
第8章　AIエージェントとは
第9章　LangGraphで作るAIエージェント実践入門
第10章　要件定義書生成AIエージェントの開発
第11章　エージェントデザインパターン
第12章　LangChain/LangGraphで実装するエージェントデザインパターン


## <font color="Blue">本書の筆者</font>
下記の通り、日本の生成AIをリードするエンジニア達が執筆している。私も以前より大嶋氏の講演は何度か聞いたことがあった。また生成AI界隈イベントにも積極的に登壇されていて、名前を知っている方も多いのではないか。

#### 西見公宏（にしみまさひろ）
株式会社ジェネラティブエージェンツ 代表取締役CEO
ChatGPTの利活用を中心に大規模言語モデルを活用したアプリケーション開発ならびにアドバイザリーを提供する中で，吉田，大嶋と出会い，株式会社ジェネラティブエージェンツを共同創業。AIエージェントを経営に導入することにより，あらゆる業種業態の生産性を高めるための活動に尽力している。 「その仕事，AIエージェントがやっておきました。――ChatGPTの次に来る自律型AI革命」（技術評論社）単著，Software Design「実践LLMアプリケーション開発」（技術評論社）連載。

#### 吉田真吾（よしだしんご）
株式会社ジェネラティブエージェンツ 取締役COO / 株式会社セクションナイン 代表取締役CEO
AWS Serverless Heroとして日本におけるサーバーレスの普及を促進。 「ChatGPT/LangChain によるチャットシステム構築［実践］入門」（技術評論社）共著，「Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門」（技術評論社）共著，「AWSによるサーバーレスアーキテクチャ」（翔泳社）監修，「サーバーレスシングルページアプリケーション」（オライリー）監訳，「AWSエキスパート養成読本」（技術評論社）共著。 ChatGPT Community（JP）主催

#### 大嶋勇樹（おおしまゆうき）
株式会社ジェネラティブエージェンツ 取締役CTO
大規模言語モデルを組み込んだアプリケーションやAIエージェントの開発を実施。個人ではエンジニア向けの勉強会開催や教材作成など。オンラインコースUdemyではベストセラー講座多数。勉強会コミュニティStudyCo運営。 「ChatGPT/LangChain によるチャットシステム構築［実践］入門」（技術評論社）共著。


## <font color="Blue">読むべき読者層</font>
生成APIを使っての開発、特にLangchainを使ってこれから開発をやりたいエンジニアにとっての必読書と言えると思います。
Langchain関係の公式のドキュメントを読む前にこちらを一読することをおすすめします。ドキュメントの理解が進むと思います。
第1章から第3章まで、生成AIの基本が説明されており、初心者にもおすすめの書籍である。

## <font color="Blue">全体像</font>
1から3章は初心者にもわかりやすくとても丁寧に解説がされてます。
4章以降は主にLangchainについてのハンズオン形式になっているパターンが多く、Pythonが少し理解できる方なら読み進めることができると思います。

## <font color="Blue">読みどころ</font>
特に下記の章はエンジニア必読だと思う。ここまで詳しく解説している本はない。 
第5章　LangChain Expression Language（LCEL）徹底解説
第6章　Advanced RAG
第7章　LangSmithを使ったRAGアプリケーションの評価


## <font color="Blue">本書の活用</font>
以前、ハッカソンで生成AIのアプリを作り、下記の記事を書いたが、
本書でLangchain周りを勉強し、Langchainの機能を使いこなし、下記のアプリを作り直したい。

chatGPTのAPIを使った東京観光情報BOTの開発と実装
https://qiita.com/morrrrr/items/8bcb0b11352d8fb5e793
https://github.com/mori-tt/Tourism_recommendation_bot

上記のリニューアル中のアプリ
https://github.com/mori-tt/Tourism_recommendation_bot_3
OAuthにおける各登場人物とその役割を調べた

# リソースオーナー（Resource Owner）
リソースオーナーは、アクセスしたいデータやリソース（情報やサービス）の所有者、つまりユーザーのことです。リソースオーナーは、自身のデータにアクセスする権限を持っており、この権限を他のアプリケーション（クライアント）に委譲できる立場です。

例：リソースオーナーがユーザーである場合、ユーザーは自身のSNSデータ、写真、またはGoogleの連絡先リストなどのリソースを所有しています。

役割：アクセスを許可または拒否する権利を持っており、通常は認可サーバー経由でアクセス許可の操作を行います。

# リソースサーバー（Resource Server）
リソースサーバーは、リソースオーナーのデータを実際に保存・管理しているサーバーで、クライアントのリクエストに応じてデータを提供します。リソースサーバーは、アクセスの際にクライアントからアクセストークンを受け取り、そのトークンが有効であればデータへのアクセスを許可します。

例：Google Driveのデータを保存しているGoogleのAPIサーバーや、Facebookのユーザープロフィールデータを保持しているFacebookのサーバーなどがリソースサーバーです。

役割：アクセストークンの認証を行い、有効なトークンであればクライアントに対してリソースを提供します。直接的な認証を行うのではなく、トークンを受け取ることで認可の確認を行います。

# クライアント（Client）
クライアントは、リソースオーナーのデータにアクセスするために許可を求めるアプリケーションやサービスです。クライアントはリソースオーナーに代わり、リソースサーバーにアクセスを試みますが、アクセスを行うにはユーザーの許可が必要です。

例：ユーザーがSNSアカウントを使ってサインインする時に利用するサードパーティアプリや、フィットネスアプリがユーザーのGoogleカレンダーと同期するためにGoogleにアクセスをリクエストするケースなどです。

役割：リソースオーナーからアクセスの許可を得て、認可サーバーからアクセストークンを取得します。このアクセストークンを使ってリソースサーバーにアクセスし、必要なデータにアクセスします。

# 認可サーバー（Authorization Server）
認可サーバーは、リソースオーナーの認証を行い、クライアントにアクセストークンを発行する役割を担います。認可サーバーはリソースサーバーと同一である場合もありますが、分離して設置されることも多いです。

例：GoogleのOAuth 2.0 認可サーバーや、FacebookのOAuthサーバーなどが該当します。これらの認可サーバーは、ユーザーがアクセス権を許可したかどうかを確認し、クライアントにアクセストークンを発行します。

役割：リソースオーナーの認証を行い、認証が成功した場合にクライアントへアクセストークンを発行します。アクセストークンはリソースサーバーにアクセスする際に使用され、一定の有効期限が設定されています。

# OAuth2.0フローの流れ(Authorization Code Flow)
１，リクエスト：ユーザーがクライアント（例：フィットネスアプリ）で、「Googleでログイン」ボタンを押します。この操作により、クライアントは認可サーバー（GoogleのOAuthサーバー）にアクセス権のリクエストを送信します。

２，認可ページ表示：認可サーバーはリソースオーナー（ユーザー）に、クライアントが特定のリソース（例：Googleの連絡先やカレンダー）にアクセスする許可を与えるかどうかを尋ねる画面を表示します。

３，認可コードの発行：ユーザーが許可すると、認可サーバーは一時的な認可コードをクライアントに発行します。

４，アクセストークンの取得：クライアントは認可サーバーに認可コードを送り、アクセストークンをリクエストします。認可サーバーは、認可コードが有効であれば、クライアントにアクセストークンを発行します。

５，リソースサーバーへのアクセス：クライアントはアクセストークンを用いてリソースサーバー（GoogleのAPIサーバー）にアクセスし、リソース（例：ユーザーのGoogleカレンダーのデータ）を取得します。

# 参考サイト
https://www.tdk.com/ja/tech-mag/knowledge/147

https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth
Ubuntuの起動についてメモ（電源からブートローダまで）

ChatGPTに聞いて知った起動の流れ自分用メモ(64bit/x86/Ubuntuマシンでざっくり検証)

1. 電源ユニットのボタンを押す
1. 電源ユニットからマザーボードにリクエストが飛ぶ
1. マザーボードが各種コンポーネント(メモリ、CPU、SSDなど)にリクエストを送って起動する
1. CPUが起動して、CPUにハードコードされたリセットベクタ(起動時のメモリ空間はマザーボード上のフラッシュメモリ(4MB)のアドレスが主にマッピングされている)から処理が開始する
1. UEFIプログラムは、SSDの先頭にあるGPT（パーティションやパーティションの情報が書かれている）を見て、GUIDがc12a7328-f81f-11d2-ba4b-00a0c93ec93bのパーティションをESPとして認識する
1. ESPパーティションはUEFIの場合FAT32ファイルシステムでフォーマットされていることがUEFIレベルで定まっているので、UEFIプログラムは読み込める（UEFIプログラムはFAT32ドライバをもっている）。ESPにはブートローダー（一般にOSを起動するプログラム）が入っていて、FAT32ファイルシステム上で/EFI/Ubuntu/grubx64.efiが典型(Ubuntuだと/boot/efiにESPパーティションはマウントされる)。おそらく、grubx64.efiにext4ファイルシステムのドライバが入っていたりする
1. GRUBは、UEFIやBIOS経由で起動されるブートローダプログラム。つまり、エントリーポイントがUEFI/BIOSで、そこからGRUBに処理が引き渡される
1. GRUBが選択されると、GRUBは次のbootパーティションを読み込む。ここはUbuntuだと/bootにマウントされる箇所で、ext4ファイルシステムでフォーマットされていがち。このext4ファイルシステムの/grub/grub.cfg（Ubuntu上だと/boot/grub/grub.cfg）を読み込む。これに基づいて、GRUBは起動するOSを選ばせてくれる(grub.cfgにはGRUBシェルスクリプトが書かれており、OS非依存でGRUB環境のもと動くらしい)
1. GRUBに処理が引き渡されているので、この中でOSを選べば、自由にOSを起動できる

個人的おもしろポイント
* CPUファームウェアによってBIOSかUEFIかは決まっている。その上でいくつかブートローダを選べる中で結局GRUBに処理が引き渡される。GRUBはUEFIより便利？なので、BIOSよりUEFIが進化しているとしても、嬉しい
* Windowsを起動したい場合、UEFIからESPのWindowsブートローダを直接選んでもいいし、GRUBブートローダを選んでGRUBのインターフェースからWindowsブートローダを選んでも良い
* リセットベクタは、x86だと0xFFFF0、RiscVだとデフォルトで0x00001000、ARMだと0x00000000_80000000など、およそISAごとに決まっているらしい
![スクリーンショット 2024-11-28 14.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149425/ec8b58be-6353-c366-f7d7-3c7ae036cd68.png)
CSSを学びたい Step19 アコーディオン

## はじめに
CSSを学びたいのStep19です！アコーディオンを実現します！

## 成果物
![acordion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/e7999291-1f61-2ab7-bc2e-6d956670656d.gif)

## ソースコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Accordion Example</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <h2>アコーディオンのサンプル</h2>

  <div class="accordion">
    <input type="checkbox" id="section1" class="accordion-checkbox">
    <label for="section1" class="accordion-button">セクション1</label>
    <div class="accordion-content">
      <p>コンテンツ1</p>
      <p>コンテンツ2</p>
      <p>コンテンツ3</p>
    </div>
  </div>
</body>
</html>
```

```css:styles.css
body {
  font-family: Arial, sans-serif;
  background-color: #f4f4f4;
  margin: 0;
  padding: 20px;
}

h2 {
  text-align: center;
  color: #333;
}

.accordion {
  background-color: #fff;
  border-radius: 5px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  margin: 20px auto;
  max-width: 600px;
  overflow: hidden;
}

.accordion-checkbox {
  display: none;
}

.accordion-button {
  background-color: #007BFF;
  color: #fff;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 18px;
  transition: background-color 0.4s;
  display: block;
}

.accordion-button:hover {
  background-color: #0056b3;
}

.accordion-content {
  padding: 0 18px;
  display: none;
  overflow: hidden;
  background-color: #f9f9f9;
  border-top: 1px solid #ddd;
}

.accordion-checkbox:checked + .accordion-button {
  background-color: #28a745; /* 緑色に変更 */
}

.accordion-checkbox:checked + .accordion-button + .accordion-content {
  display: block; /* 表示 */
  padding: 18px;
}
```
OAuthとSAMLの違いを調べた

# ユースケースの違い
### OAuth
主にモバイルアプリやWebアプリで使われ、ユーザーが第三者アプリケーションに対して自分のデータへのアクセス権を付与するために使用されます。例えば、ユーザーがSNSアカウントを使って別のサービスにログインしたり、SNS上のデータにアプリがアクセスする権限を付与したりする場合に使われます。

### SAML
主にシングルサインオン（SSO）に利用され、企業や大規模な組織のWebアプリ間での認証に適しています。例えば、企業のポータルサイトから社内の様々なアプリに一度のサインインでアクセスできるようにする場合に使われます。

# 認証VS認可
### OAuth
認可プロトコルです。OAuthは「認可（Authorization）」にフォーカスしており、クライアントアプリケーションにリソースへのアクセス権を与えるために使用されます。認証機能自体は含んでいませんが、OAuth 2.0の上にOpenID Connect（OIDC）を使用することで認証機能を実装することが可能です。

### SAML
認証プロトコルです。SAMLは「認証（Authentication）」にフォーカスしており、ユーザーが一度サインインすることで複数のアプリケーションにアクセスできるシングルサインオン（SSO）の仕組みを提供します。

# トークン形式の違い
### OAuth
アクセストークンとしてJSON Web Token（JWT）などのフォーマットを使用します。JSON形式であるため軽量で、モバイルアプリやAPI通信に適しています。

### SAML
XML形式のSAMLアサーションを使用します。XMLベースのため情報量が多く、一般的にWebブラウザ間の通信やWebアプリケーションで使用されます。

# 使用される環境
### OAuth
Webやモバイルアプリケーションなど、インターネットを介した様々な環境に適しています。APIの認可にもよく使用されます。

### SAML
企業や組織内のWebアプリケーションのシングルサインオン環境に適しています。企業のイントラネットやB2B（企業間）環境で使われることが多いです。

# アーキテクチャの違い
### OAuth
OAuthの認証フローでは、リソースオーナー（ユーザー）、リソースサーバー、クライアント、認可サーバーといった役割が登場します。リソースオーナーがクライアントアプリにアクセス権を付与するという仕組みです。

### SAML
SAMLのアーキテクチャでは、IdP（Identity Provider：アイデンティティプロバイダ）とSP（Service Provider：サービスプロバイダ）が主な役割を担います。IdPがユーザーを認証し、SPが提供する各サービスに対して認証情報を渡すという仕組みです。

# 参考サイト
https://www.okta.com/jp/identity-101/saml-vs-oauth/

https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth
sqlの基礎的なものをメモをまとめました(山浦清透さんのYouTubeを見ながらメモしました。)

<h1>SELECT 文の使い方</h1>

SELECT カラム名,
FROM テーブル名
カラムをテーブルから取ってくる

<h2>SELECT name AS 名前, feature AS 特徴</h2>
nameを名前として取り出す。
featureを特徴として取り出せる。

<h2>SELECT ※
FROM テーブル名</h2>

テーブル名のカラムを全て取り出す。

<h2>SELECT DISTINCT(カラム名)
FROM テーブル名</h2>

テーブル名からDISTINCT(カラム名)の重複を一つにしてカラムを取って来れる。

<h2>SELECT カラム名,　カラム名,
FROM テーブル名

WHERE カラム名 >5 (5より大きい意)</h2>

WHERE (条件文) 
条件を指定できる。

WHERE 条件式　AND　条件式
二つの条件式を満たすものだけ取って来れる

WHERE 条件式　OR　条件式
どちらかの条件式にあてはまれば取って来れる。


<h2>SELECT ※
FROM テーブル名
WHERE カラム名 IN(カラム名　カラム名)</h2>

カラム名をまとめてもっと来れる

NOT IN まとめて否定

WHERE カラム名 LIKE ア%
アから始まるやつを持って来れる

WHERE カラム名 is NULL
NULLのものを持ってこれる。


<h2>SERECT ※
FROM テーブル名
LIMIT 数値 </h2>

数値行目までもってこれる。

山浦さんは1000を指定することが多いらしい。
あまりに大量だとsqlの処理にpcが負担がかかり処理速度が遅くなる。


<h2>SELECT ※
FROM テーブル名
ORDER BY カラム名</h2>
昇順で並び替えて持って来れる。

<h2>ORDER BY DESC カラム名</h2>
降順で並び替えて持ってこれる。
農家に役立つサービスを開発した話

今回は、オリジナルプロダクトとして、農家に役立つサービスを開発したので、プロダクトの機能や作成の経緯、感想を書いていけたらと思います。
## 完成品
ここから、登録されている作物の一覧を確認できます。
![スクリーンショット 2024-11-01 161034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/a9d73a57-7c18-2bbd-4a68-d9927d46970d.png)
作成した作物に対して、作業、肥料、農薬の記録を残せます。
![スクリーンショット 2024-11-01 161443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/f984b506-e335-9b71-42fc-ee2c61157abe.png)
編集、作業追加画面
![スクリーンショット 2024-11-01 161513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/cf8c8765-da5e-025c-1b80-9ed3b3550f86.png)
![スクリーンショット 2024-11-01 161541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/0ed98f7f-185a-e469-98db-d58ef5da6e1c.png)
農地の最短巡回ルートを探索できる機能。
![スクリーンショット 2024-11-01 232644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/d1fe41dc-6464-e8a4-fd1a-c8a8f60d8e6b.png)

### 機能要件

・最短巡回ルートを算出する機能

・作物の登録機能

・農薬、肥料を撒いた日付の登録機能

・登録した作物に対して日記のように秘訣を残せる機能

### 非機能要件
・セキュリティ

・ログイン機能

・画面は1秒以内に表示することができる

・静的解析ツールを用いて可読性のあるコードを書く

### 使用技術
フロントエンド:HTML/CSS,JavaScript

バックエンド:PHP　8.3.0,Laravel 11.11.1

データベース:MySQL

インフラ:AWS

バージョン管理:Git/GitHub

その他:OSRM API ,Leaflet

### システム構成図
![スクリーンショット 2024-09-01 201125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/01ab4547-8150-1b66-05b6-a962d0d2d811.png)

### ER図
![スクリーンショット 2024-11-03 212009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774215/533f6060-b0a8-af42-f53a-3a550087a95b.png)


## 作成の経緯
### 1.何故、農家に役立つサービスなのか
私がエンジニアになりたい一つの理由として、社会の課題解決に貢献したいという思いがあります。
なので、サービスを作成するにあたって、まずは身近な人に役に立つサービスを開発しようと考えました。
そこで、農家を経営している祖父母の役に立てるサービスを開発しようと思いました。

### 2.抱えている課題
サービスを開発するにあたって現状、農家の課題は何か考えました。
課題１：
現在、祖父母が農業を経営しており、近々、定年を迎える両親が後継ぎすることとなってるが、祖父母は基本的に紙など何も残さずに感覚で作物を育てているので、引継ぎが上手くできるかが課題

課題２：
農地を多数所持しており（実家の場合10箇所以上所持）、感覚で移動している農家が多く、研究結果でもほとんどの農家が最短経路で農地を回れていないとされている。

以上が現状抱えている課題だと考えました。

### 3.解決策
課題1に対して：
 作物を育てる過程をデータとして残す。（具体例；農薬を撒いた量、苗を植える時期、水やりの時期などの経過観察を全て記す）

課題2に対して:
 最短巡回ルートをアルゴリズムを用いて自動で計算する

 以上の2点の機能があれば解決できると考えました。

それぞれの機能の詳細は長くなりそうなので他の記事にでも書こうかと考えてます。

## こだわり
・高齢者が使用することを考慮してUI,UXはシンプルに
・経路探索の計算はOSRMというオープンソースコードを用いることによってコストを削減

 ##  感想
 実際に祖父母に使ってもらった結果としては、まだ、改善点はあるが使い続けてみたいと感想を頂きました。
 少しでも課題が解決できて嬉しい気持ちです。

この経験から、より多くのユーザーに使ってもらえるサービスを開発できるようになりたいと思いました。
VSCode配色テーマ別RPGコードの外観

## はじめに

Visual Studio Code（以下、VSCode）の拡張機能である[Code for IBM i](https://marketplace.visualstudio.com/items?itemName=HalcyonTechLtd.code-for-ibmi)を使用することで、VSCode上で、IBM iプログラム開発が可能です。

VSCodeには多くの拡張機能があり、ソースコードの外観を変更するための配色テーマ拡張機能も豊富に揃っています。

今回は、VSCodeでインストール数が多いテーマ、また個人的に気に入っている配色テーマ拡張機能を使うことで、RPGソースコードがどのような見た目になるのかをご紹介します。

## VSCodeの既定のテーマ

VSCode「既定のテーマ」の「Default Dark Modern」です。

固定長RPG
![VscodeThemaRpg_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/dbc72b90-b864-1b75-9dee-8c104ffb79de.png)

FF RPG
![VscodeThemaRpg_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/8ca7de6e-38eb-1bed-31f2-414e5f048c52.png)

## GitHub's VS Code themes

[GitHub's VS Code themes](https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme)の「GitHub Dark Default」

GitHubのダークモードやライトモードに基づいたテーマです。
視認性が高く目に優しい色合いで、GitHubでコードを読むときのような一貫性が特徴です。

固定長RPG
![VscodeThemaRpg_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/95dcf31c-f266-da8f-5885-881bd10bd1cd.png)

FF RPG
![VscodeThemaRpg_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/e0ac99a8-c620-31b1-5077-ca6212821e86.png)

## One Dark Pro

[One Dark Pro](https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme)の「One Dark Pro Darker」

GitHubが開発していたAtomエディタの「One Dark」テーマをVSCode用に移植したものです。
視認性が高く落ち着いたダーク系の配色が特徴です。

固定長RPG
![VscodeThemaRpg_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/fdb0e0d8-fe74-f450-d185-1145c20c5d7d.png)

FF RPG
![VscodeThemaRpg_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/f0ac6e76-6442-5ac0-d593-6eac0ac27813.png)

## Dracula Theme Official

[Dracula Theme Official](https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula)の「Dracula Theme」

主に紫、ピンク、緑、青といった暗めの背景に映える高コントラストの色合いが特徴です。

固定長RPG
![VscodeThemaRpg_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/a52a012c-01d9-5ae4-37d3-e2db968ea45a.png)

FF RPG
![VscodeThemaRpg_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/4d0ecbab-efab-8039-f5d9-de7f97727491.png)

## Kanagawa Black

[Kanagawa Black](https://marketplace.visualstudio.com/items?itemName=lamarcke.kanagawa-black)の「Kanagawa Black」

日本の伝統的な芸術からインスパイアされた落ち着きのある色調で、特に「暗黒の和」や「墨色」をイメージした配色が特徴です。

「Kanagawa Black」は個人的に気に入っている配色テーマです。
命令コードだけでなくコメントの見分けがつきやすいところ、また落ち着いたトーンの配色なので、目に優しいところが気に入っています。

固定長RPG
![VscodeThemaRpg_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/36cf2ec6-9d3d-7aec-9e1b-1bb73d4a24e8.png)

FF RPG
![VscodeThemaRpg_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/d190a4f4-af58-da97-5dc7-7f55ca203ea7.png)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。
コンテナ環境でAWS CLIを使用してIAM権限を確認する方法

# きっかけ
- EC2インスタンスにDocker/Podmanを動作させ、その上のコンテナに対してAWSの権限がちゃんと付与できたか確認したいと思うこと、ないでしょうか？
- え、ないです？？私はありました。
- ただ、よく使われる軽量コンテナイメージには、当然ながらaws cliがデフォルトインストールされていないため、インストールする手順 & aws cliをコンテナ上で動作させる手順を記します
# 前提
確認した環境は以下
- Docker(25.0.3)
- インストールしたaws cli(2.17.28)
    - Dockerfile内で記載していますが、バージョンは指定せず、latestです
    - 必要に応じて、バージョンを指定してください
# 手順
1.Dockerfileを作成
``` Dockerfile
# AmazonLinux 2023をベースイメージとして使用
FROM amazonlinux:2023

# 必要なパッケージをインストール
RUN yum install -y sudo unzip

# AWS CLIのインストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    sudo ./aws/install && \
    rm -rf aws awscliv2.zip

# デフォルトのコマンドを設定（オプション）
CMD ["/bin/bash"]
```
2.コンテナイメージをビルド
``` shell
$ docker build -t amazonlinux2023-awscli .
```
3.コンテナをrun
``` shell
$ docker run -it amazonlinux2023-awscli
```
4.【コンテナ内】aws cliがインストールされていることを確認する
``` shell
# aws --version
```
- 実行例
``` shell
# aws --version
aws-cli/2.17.28 Python/3.11.9 Linux/6.6.16-linuxkit exe/aarch64.amzn.2023
```
5.【コンテナ内】(オプション)AWS認証設定のコマンド
- 本番ではアクセスキー/シークレットキーは使用せず、インスタンスプロファイルを使用することが*強く推奨*されています
``` shell
# aws configure
```
- 実行例
```
# aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
# 
```
6.【コンテナ内】AWS認証設定の確認コマンド例
``` shell
# 認証情報の確認
# aws sts get-caller-identity
```
- 実行例
``` shell
# 認証情報の確認
# aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/example-user"
}
```
7.【コンテナ内】コンテナから抜ける
```
# exit
```
# 終わりに
- そんなに難しいことをしているわけでは無いですが、咄嗟に出てこなかったこともあり、まとめてみました
- もしどなたかに刺さる内容であれば幸いです
Jetpack composeでのバックボタン制御について

# はじめに
今回はJetpackComposeでのバックボタン制御について少し話したいと思います
実装方法自体は依然記事を書いたのでそちらを参照してください
### 本文
さて、今回は話したい内容としてはバックボタン制御の伝播についてです。
コードの中身を見てみると引数で渡しているBool値でenableを切り替えています。
enableをfalseのときはBackHandlerのラムダに記述されたコードは実行されません。
その時にどういった挙動をするかというのがメインの話題になります。
何もみずに直感のみで答えるならAndroid準拠の何も制御してない状態と同じ処理をすると思います。
しかし実際にはそれよりも下のレイヤーで制御をしていた場合そちらを参照します。
ただしここで注意したいのが、特に何も記載しない場合はNavHost,composable(),Scaffoldで強制的にAndroid準拠のものに塗り替えられるということです

そのため上記三種類を使う場合はBackHandlerにfalseをわたしてあげないといけません
### さいごに
今回はBackHandlerの制御について少しややこしいことがあったので記事にしてみました
どなたかのお役に立てれば幸いです
Java Silver資格試験にむけた学習ページ

## 今回の目的
java silver資格試験に向けて勉強中のエンジニアがjava学習のために書いている記事です。
用語やjavaルールを忘れないために学習の一環として書いています。
どうぞお手柔らかに。

## プログラム実行までの流れ
①java言語仕様にそってプログラムを作成して、拡張子.javaファイルを作成
②コンパイラが起動して、作成したプログラムがコンパイルされる。コンパイルされると拡張子.classファイルが作成される。
③javaコマンドによって、プログラムがJVM上で実行される

## リテラリ
ソースプログラムの中で直接書き込まれたもの。
表現できるデータには、数値、文字列、null、真偽値がある

## データの型
基本データ型は以下の8種類ある

| 種類 | データの型 | サイズ | 表現できる値 |
|:-:|:-:|:-:|:-:|
| 整数  | byte  | 8ビット  | -128~127  |
|   |  short | 16ビット  | -32768~32767  |
|   |  int |  32ビット |  -2147483628~2147483627 |
|   |  long |  64ビット | -9223372036854775808~9223372036854775807  |
|  浮動小数点 | float  | 32ビット  |  IEEE754に基づく値 |
|   |  double |  64ビット | IEEE754に基づく値  |
|  文字 | char  |  16ビット | ￥u0000~￥uffff  |
|  真偽値 |  boolean |  - |  true,false |
|   |   |   |   |

参照型は基本データ型以外のもの。文字列や配列など。

## ローカル変数
メソッド内やメソッド引数で定義される変数の有効範囲（スコープ）は、当該メソッド内にしか及びません。更に、メソッド内のブロック内部で定義された場合は、そのブロック内から制御が外れるとメモリ上からドロップされて永遠に失われる。このような変数を**ローカル変数**と呼ぶ。ローカル変数は制御がそのスコープから外れるとメモリ上からドロップされる変数。

## ローカル変数の型推論
**var**を使用してローカル変数を宣言した場合、型推論が可能。
宣言時に代入する値の型が明確な場合のみ使用できる。null値を代入した場合、コンパイルエラーが発生する。
## 複合代入演算子
| 演算子 | 使用例 | 説明 | 算術演算子での記述 |
|:-:|:-:|:-:|:-:|
| += | a += b  | 加算して代入  | a = a + b  |
| -=  | a -= b  | 減算して代入  | a = a - b  |
| *=  | a *= b  |  乗算して代入 | a = a * b  |
| /=  |  a /= b | 除算して代入  |  a = a / b |

## 条件演算子
条件によって異なる式を実行するもの。三項演算子とも呼ばれる。
**条件式　? 式1 : 式2**

## メンバ変数
オブジェクトの属性を保持するための変数。
クラスのメンバであるため、メンバ変数と呼ばれる
ローカル変数で使用できたvarを使用した型推論は使えない。

## メンバメソッド
オブジェクトの操作を行うメソッド。
これもメンバ変数と同様に、クラスのメンバであるため、メンバメソッドと呼ばれる


## アクセス修飾子
クラスやメンバ変数、メンバメソッドへのアクセスを制限するために、アクセス修飾子がある。
アクセス修飾子を指定することで、公開範囲を制限する。
| 修飾子| 説明 |
|:-:|:-:|
|  public | すべてのクラスから利用可能  |
|  protected |  同じパッケージ内、または、継承関係がある場合のサブクラスからアクセス可能 |
|  省略 | 同じパッケージ内。パッケージプライベートとよぶ。|
|  private |  同じクラス内から利用可能 |

## カプセル化
オブジェクトの属性と関連する操作をまとめて保持することを**カプセル化**と言う。
クラス定義の際に、オブジェクトの属性となるメンバ変数と、それにアクセスするメソッドを1つのクラスに記述することで実現する。
また、属性を外部から隠ぺいすることを、**データの隠ぺい**と呼ぶ。
メンバ変数にprivate,メソッドにはpublicをつけることで成立する。
ある日アプリが動作しないと言われたら

# 前置き
先日、自社で納品したWEBアプリを使用しているクライアントから
『今朝いきなりログインができなくなり、アプリケーションが表示できない。早急に原因を調査し解決して欲しい。』と連絡があり、対処する機会があった。

# 推測してみる
いったんrebootコマンドでサーバーを再起動してみるが動作は解消せず。
色々な原因が考えられたがその時までアプリケーションは2年近く問題なく動作していたため、格納されているオンプレミスサーバー内ディスクのメモリが何らかの原因で容量ギリギリまで使用されていたのではないかと推測し、調査した。

# 調査した

まずteratermでサーバーに接続後、以下のdf -hでサーバー内全体のディスクの容量を確認した。
```
df -h
```
画像はないが、何故か/varディレクトリ以下が88%使用となっており、仮説が正しそうと思い始める。次にディレクトリを移動しながらdu -sh/*でディレクトリごとの容量を確認していく。
```
du -sh/*
```
すると/var/spool/mail/rootディレクトリで80%以上使用しており、このディレクトリが肥大化したことでサーバーが動作しなくなったと突き止める。
調べた結果cronがrootにログを送っているファイルであった。

直下のログファイルを確認すると毎日cronで動かしているシェルファイルでvar_dumpして値の確認をしていたphpファイルがログに出力したまま放置されていた。
その結果、繰り返しサーバーの容量を圧迫していきある日動かなくなったということだった。

# 対処した
まず、var/spool/mail/root内のログを空にするため、以下のコマンドを実行。
```
cat /dev/null > /var/spool/mail/root
```
その結果、該当ディレクトリが空になったことを確認した。
その後、原因となっていたログを出力していたファイル内のvar_dumpを全てコメントアウトし、再度ログを空にした。
また、rootにcron宛のメールが送られることも原因であったので/etc/crontabを開いて、以下の内容に変更した。
```diff
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO="root"
+ MAILT0=""
// ... 略
```
対処した結果アプリケーションが動き出し、クライアントの業務も動き出した。
胸を撫で下ろす。

# 感想
安直だがログを出したまま、放置しないことはやはり大事。どこで動作不良の原因になるかわかったものではない。本番で問題が起こると焦るが原因を推測しつつ段階を追って対処することが緊急時ほど重要であることを再確認した。

# 参考URL
https://academy.gmocloud.com/wp/lesson/20150721/530

https://iret.media/1024

https://ex1.m-yabe.com/archives/3480

https://www.t3a.jp/blog/infrastructure/shutdown-reboot/

https://qiita.com/toshihirock/items/565fe71d778d3ee36b96

https://qiita.com/Michinosuke/items/eb15d81d66b2459eaef5

# 近況
最近CI/CDをやりたいと思い、以下の書籍を購入しGithubActionsについて学習している。
サンプルコードも付いていて動作が分かりやすい。時間をかけてでも理解していきたい。
後はSAAを年内には取りたいなと思っている。

<img width="150" src="https://m.media-amazon.com/images/I/81v7axmwYIL._SL1500_.jpg">

https://www.amazon.co.jp/GitHub-CI-CD%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89%E2%80%95%E2%80%95%E6%8C%81%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%82%92%E6%94%AF%E3%81%88%E3%82%8BGitHub-Actions%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E9%81%8B%E7%94%A8-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E9%81%B8%E6%9B%B8/dp/4297141736/ref=sr_1_1?adgrpid=160470870123&dib=eyJ2IjoiMSJ9.ey3nKlEaNH3aD6kAukdqJMHgjsyUwgKoMIltujdYdA5WOyVRUkzkqIxLmKOTEXdT6wr2xKXZLsmtFZWJCJRXudEqXNDUtZ8nG88xCtYhISAkGv8-NXs1x-Tf0DjTLhC5iQwB71EeOxAIBJiqasbt7uNRSnG_KYROhYk_pohu7INiIX6bQJz4d4OemstyfwSB.7DdxPQrkrKetDPY7dDi-orMQkU14W5yVUzbfHt5V3kM&dib_tag=se&gad_source=1&hvadid=696069964999&hvdev=c&hvlocphy=9197681&hvnetw=g&hvqmt=e&hvrand=6107965201498379959&hvtargid=kwd-2305196819162&hydadcr=27270_14738616&jp-ad-ap=0&keywords=github+ci%2Fcd%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89&qid=1730636307&sr=8-1
マイクラをPythonプログラムで動かすための設定チェックポイント

# **概要**
マイクラをPythonで動かすための設定方法については，すでに様々な記事があると思います．何らかの都合で，エラーが出てマイクラをPythonで動かすことができずに，困った時のために，設定が上手くいっているかどうかのチェックポイントについて，備忘録として残しておこうと思います．
# **事前にインストールが必要なModは２つ**
１．**Forge**
２．**RaspberryJamMod**
# **設定の確認事項１**
パソコンにJavaがインストールされていること．
# **設定の確認事項２**
マインクラフトは，Java版と統合版があるが，Java版を購入・インストールする．
![スクリーンショット 2024-11-03 20.33.44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/5bd5c7d6-990b-22e0-5a05-08d7f3df657b.jpeg)
（図１）Java Editionを起動
# **設定の確認事項３**
**MC_prog_Forge1.12** がインストールされていることを確認する．
![②マインクラフトPythonで迷路生成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/257e531f-87a8-ae2a-62f8-c1bc122545f6.jpeg)
（図２）最新のリリース横の ^ を押して開く
# **設定の確認事項４**
マイクラを最新のリリースではなく，バージョン1.12のものを起動するようにする．
（図２の**MC_prog_forge1.12を起動する**）
![③マインクラフトPythonで迷路生成のコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/bec3cf7b-66dd-aaa9-b198-3d1f76866f44.jpeg)
（図３）起動時に左上のMincraftのバージョンが1.12.2となっていること
# **設定の確認事項５**
![④マインクラフトPythonで迷路生成のコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/cbff0a1b-ef20-4330-0e1f-072d0384a24c.jpeg)
（図４）Modsボタンを押す
![④１マインクラフトMod Listのコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/527f2174-feb4-5979-5c73-b10768084d76.jpeg)
（図５）Raspberry Jam Mod が設定されていることを確認する
# **設定の確認事項６**
Pythonのバージョンは，3.9以前を使用する．
![①マインクラフトPython_VSCode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/5f186139-a71b-fd16-fb7b-9c6d165e8b90.jpeg)
（図６）VSCodeのPythonライブラリを確認

Pythonでマイクラを動かすのに必要なパッケージライブラリは，
　　**・mcpi**
です．インストール必須です！

迷路的なものを作成するのに便利なパッケージは，
　　**・mazelib**
です．これは，必須ではないですが，インストールしておけば，役に立ちます．


以上がチェックポイントです．
それらが全てちゃんと設定されていれば，Pythonプログラムで
下図のような迷路が一瞬で作成できます．
![⑤マインクラフトPythonで迷路生成のコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/ca1e71e5-287d-49e9-4249-6afb9746fb48.jpeg)
NumberとparseFloatとparseInt関数を使ったキャストの違い

# ■はじめに

こんにちは。白水（しらみず）と申します。
普段は不動産スタートアップでフロントエンドエンジニアとしてお仕事しています。
不動産系のサービスに携わっていると、賃料や管理費、敷金、礼金など数字に関わるものを多々扱うことがあります。
その中でも整数なのか少数なのかで、利用するJSのメソッドが違うため、毎回動作を確認するのが大変でした。
そこで、今回「Number()」と「parseFloat()」と「parseInt()」の動作違いを検証したので備忘録として残そうと思います。
短い記事なので、良ければご覧ください。

[Shiramizu\_Junya lit\.link\(リットリンク\)](https://lit.link/js226)

# ■Numberメソッド

```jsx
Number("12"); // 12
Number("015", 10); // 15
Number("12.3"); // 12.3
Number("12.00"); // 12
Number("12.03"); // 12.03
Number("0.35"); // 0.35
Number("15,123"); // NaN
Number(undefined); // NaN
Number(null); // 0
Number(''); // 0
```

整数、少数を気にしないで、とりあえず数値型に変えたければNumberが良さそうな気がします。

しかし、`Number(null);`や`Number('');`が「０」になるのは気をつけたほうが良さそうです。

[Number - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number)

# ■parseIntメソッド

```jsx
parseInt('12', 10); // 12
parseInt("015", 10); // 15
parseInt('12.3', 10); // 12
parseInt('12.9', 10); // 12
parseInt('12.00', 10); // 12
parseInt("12.03", 10); // 12
parseInt("0.35", 10); // 0
parseInt("15,123", 10); // 15 →　カンマあると、カンマ以降が消えちゃう。。。
parseInt(undefined, 10); // NaN
parseInt(null, 10); // NaN
parseInt('', 10); // NaN
```

少数でも切り捨てて整数にしたい場合は、`parseInt`が良さそうです。

四捨五入したい場合は、`Math.floor()`や`Math.ceil()`や**`Math.round()`**を使ったほうが良さそうです。

しかし、Number型に変換できないとNaNになるので、ここは注意が必要かなと思います。

日本のお金は「15,123円」のように「,」が入ることがあるので、そこは注意が必要そうです。

[parseInt() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)

# ■parseFloatメソッド

```jsx
parseFloat('12'); // 12
parseFloat("015", 10); // 15
parseFloat("12.3"); // 12.3
parseFloat("12.00"); // 12
parseFloat("12.03"); // 12.03
parseFloat("0.35"); // 0.35
parseFloat("15,123"); // 15 →　カンマあると、カンマ以降が消えちゃう。。。
parseFloat(undefined) // NaN
parseFloat(null) // NaN
parseFloat(''); // NaN
```

少数を維持したい場合は、`parseFloat()`でいい感じです。

[parseFloat() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)

# ■まとめ

数値を扱うWebサービスは多々ある中で、メソッドの戻り値が意図したものになるか気にする必要があるので、この機会に動作確認できてよかったです。
ArcaneLink-1

カーネルモジュールを使って、他のUIDのメモリを確認する。

カーネルモジュールとは、linuxの機能の１つ。再起動せずに機能を追加・変更できる。

カーネルモジュールを開発するのに必要なもの。
（１）カーネルヘッダ
（２）ｇｃｃ
（３）ｍａｋｅ

カーネルヘッダの存在を確認。
```
$ ls /usr/src/linux-headers-$(uname -r)
```
なければ
```
$ sudo apt install linux-headers-$(uname -r)
```
ｇｃｃとｍａｋｅの存在を確認。
```
$ gcc --vervion
$ make --version
```
なければ
```
$ sudo apt install build-essential
```

モジュールの素をｃ言語で書く。拡張子は「.c」。
```
$ nano hello_module.c
```
なかみ
```
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A Simple Hello World Module");

static int __init hello_init(void) {
    printk(KERN_INFO "Hello, World! Module loaded.\n");
    return 0; // 0を返すことで正常にロードされたことを示す
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, World! Module unloaded.\n");
}

module_init(hello_init);
module_exit(hello_exit);
```

Ｍａｋｅｆｉｌｅをつくる。拡張子なし、このファイル名じゅないとダメ。
```
$ nano Makefile
```
なかみ
```
obj-m += hello_module.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
```
注意：makeの前は、スペースじゃなくタブにすること。

.cファイルから、.koファイルをビルドする。
```
$ make
```
参考：「.o」他、様々な中間ファイルができるが、「.ko」以外、すべて不要。

モジュールをインサートする。
```
$ sudo insmod hello_module.ko
```
結果を確認する。
```
$ dmesg | tail
```
モジュールをリムーブする。
```
$ sudo rmmod hello_module.ko
```
結果を確認する。
```
$ dmesg | tail
```
ｍａｋｅでゴジャゴジャできたファイルたちを削除する。
```
$ make clean
```
Spotifyから #nowplaying のツイートを作る

Spotifyのリンクからツイート用のテキストをぱっと作るのが面倒なので、ブックマークレットで実現しました。
Spotifyをブラウザで開ければ、スマホでもPCでも動くと思います。

# 方法
## ブックマークレットを作る
1. 適当なページをブックマークに登録
1. ブックマークの名前を自分の分かりやすいもの（「なうぷれ」など）に置き換える
1. ブックマークのURLを以下のコード（ブックマークレット）に置き換える
    ```javascript
    javascript:(function(){
      const title = document.title;
      const pattern = /^(?<song>.+) ‑ (曲・歌詞：|by )(?<artist>.+) \| Spotify$/u;
      const groups = title.match(pattern).groups;
      const text = `#nowplaying ${groups.song} / ${groups.artist}`;
      const url = location.href.replace(/\?.*$/,"");
      const intent = `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`;
      open(intent);
    })();
    ```
もし手順で詰まった場合は「ブックマークレート 登録」などで調べてみてください。


## 動かしてみる
1. Spotifyで、楽曲の「シェア」→「リンクのコピー」でリンクをコピーする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/b5efe860-77bc-845a-d301-3837e9f8b1da.png" width="40%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/096ed1b0-5ade-b794-41a5-aa8f9b3465a0.png" width="40%">

1. そのリンクをChromeやSafariなどブラウザで開く
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/e1148710-8852-5103-4fc5-0f5a5aad32de.png" width="40%"> <!-- -->

1. 登録したブックマークを開く
    スマホの場合は、アドレスバーからブックマークの名前を探すと開けます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/0f1b16df-6213-e6cd-bb8d-4219be499c85.png" width="40%"> <!-- -->

1. ツイート画面に遷移する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/d231e3ea-9685-3496-3016-1e757bef9429.png" width="40%"> <!-- -->


おわり。

# 解説
ツイートのテキストはtitle要素から正規表現で引き抜いています。
```javascript
const title = document.title;
const pattern = /^(?<song>.+) ‑ (曲・歌詞：|by )(?<artist>.+) \| Spotify$/u;
const groups = title.match(pattern).groups;
const text = `#nowplaying ${groups.song} / ${groups.artist}`;
```

正規表現パターンはPC版とスマホ版のページ（2024/11/03現在）を見つつ適当に作っているので、Spotifyの仕様変更で引き抜けなくなる場合があります。その場合はページタイトルを見て良い感じにブックマークレットを書き換えてください。

また、URLは開いているページのURLをそのまま使いつつ、クエリパラメータは除去しています。
```javascript
const url = location.href.replace(/\?.*$/,"");
```

次に、TwitterのIntent機能を使ったシェアリンクを生成します。
```javascript
const intent = `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`;
```

最後にそのページを開けば終了です。
```javascript
open(intent);
```

# 備考
解説の通り、正規表現パターンが変わるとこのブックマークレットは容易に動かなくなります。動かなくなった場合はブックマークレットを良い感じに調整してください。
Laravel 11.16.0 にアップグレードしてから file_put_contents() エラーが発生する

## はじめに
Laravelで開発をしていると以下のようなエラーが発生した人向けの解決策です。
```
Notice: file_put_contents(): Write of 61 bytes failed with errno=32 Broken pipe in /Users/[redacated]/Projects/fpwr/vendor/laravel/framework/src/Illuminate/Foundation/resources/server.php on line 21
```
## このエラーが発生した原因
私の場合、Laravelでデータベース接続の設定を行うために `.env` ファイルを編集して更新したところ、「該当するデータベースが存在しない」とエラーが表示されました。再度 `.env` を修正し、ブラウザをリロードすると表示がされるようになったものの、画面の上部に以下のエラーが表示されました。
```
Notice: file_put_contents(): Write of 61 bytes failed with errno=32 Broken pipe in /Users/[redacated]/Projects/fpwr/vendor/laravel/framework/src/Illuminate/Foundation/resources/server.php on line 21
```
私の場合、エラーが発生した原因は `.env` を書き間違えてブラウザを更新したのが原因だと思われます。
また、このエラーが発生されるようになったのは、Laravel 11 になってからだそうです。

## 解決策
解決策としては、一度起動している `php artisan serve `またはローカル環境を停止し、再起動するとエラーが解消されます。

基本的に、 `php artisan serve` は `Control + c` で停止できます。

## まとめ
このエラーは、`.env` ファイルの内容が誤った状態でブラウザを更新したことが原因でした。 解決策としては、起動中の `php artisan serve` またはローカル環境を一度停止し、再起動することでエラーが解消されます。

### 参考
https://laracasts.com/discuss/channels/laravel/file-put-contents-error-since-upgrading-to-laravel-11160
SimplexTexture3Dで遊んでみよう

内容としては下記の動画を文字に起こしただけですが、
後々検索エンジンやAIが学習できるように、かつ自分の備忘録として残し行きます。
https://www.youtube.com/watch?v=_8R5SdJiNrw

まず空のオブジェクトを作成。

そこに
Asset/Procedural Texture3Ds/SimplexTexture3D
を追加します。

追加したコンポーネントの下部に「ビジュアライザをスポーン」ボタンがあるのでそれを押下。

そうすると下図のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/317456de-3ce7-e2bb-d7f0-84fcefe97b27.png)

Scaleの値を変えると、模様が変化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/7723c62f-d389-87a8-da5c-d9d5ded76dd5.png)

Use４DのチェックをONにし、WOffsetの値を増やすとさらに模様が変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/0426a179-b586-cbcb-9d76-fe982763797e.png)

Fluxツールチップに持ち替えて
Time/WorldTimeFloat
と、WOffsetをドライブで取り出したものをつなげる。
そうすると模様が動くようになる。

ForGroundの色を変えると白い模様部分が違う色に変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/108fd4a9-a3c2-f0c6-0ac3-e864267fafb7.png)

BackGroundも同様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/add7c04d-a4ab-8575-d7b0-7642afb24bd1.png)


Devツールチップでもやもやを選択し、インスペクタからMaterialを取り出す。
![スクリーンショット 2024-11-03 203500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/a206efff-0a7e-7c97-a401-fbfc3224356c.png)

出てきたパネルのModeを「Additive」から「HitThreshold」に変更する。
BlendModeを変更する事で模様が透けるか否かなども変えられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/7770b689-432f-0931-64e9-fb5d9997c42b.png)

Fluxツールチップを装備し、
Operators/Packing/Pack3/Pack_Float3
取り出して、うえで取り出したTime/WorldTimeFloatとPack_Float3のZをつなげる。
更にOffsetをDriveでとりだしPack_Float3の右側と接続。
すると、模様が移動するようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/580f333a-47ec-fd18-518e-acd41c73c882.png)

これらの要素を使って、霧や炎など様々な演出を作ることが可能。
また、これで作られたオブジェクトは中に入っても模様が立体的に出力されるため、
空間に設置して埋めておくことで色々な演出に使えそうだ。
またUIX等一部の要素は位置に関わらずSimplexTexture3Dが手前に表示される。
Ubuntu24にコピペでさくっとNYSOLのMコマンドをインストールしてみる

コピペでNYSOLっていうかMコマンドをUbuntu24にインストールのメモです。

## NYSOLってなに？
[ホームページ](https://www.nysol.jp/)には以下のように書かれています。プロジェクト活動のこと、今回インストールするMコマンド以外に様々なものが公開されています。
> 大規模データの解析に関する様々な大学やプロジェクトでの研究成果を広く産業界に還元する目的で構築されたソフトウェアツールの総称およびそのプロジェクト活動である。「NYSOLホームページより引用」

## Mコマンドってなに？
[ホームページ](https://www.nysol.jp/)には以下のように書かれています。今回、インストールしたいのはこれになります。
> 大規模な表構造データ（CSVデータ）を効率よく処理する目的で開発されたオープンソースのコマンド群である。一般のPCでも数千万件〜数億件のCSVデータを処理できる。「NYSOLホームページより引用」

## つまり、、、
Mコマンドを使えば、CSVをコマンドで処理できて、大きいCSVファイルも扱えるっていうことで。。。正直、その説明があっているか？って言われるとちょっと自信がないです。

## さぁインストールしよう
まずは必要なライブラリをインストールして、ソースコードをゲットしてインストールです。
```bash
# install library
sudo apt -y install build-essential git libboost-all-dev libxml2-dev
# download the sources
git clone https://github.com/nysol/mcmd.git
cd mcmd
# compile and install
aclocal
autoreconf -i
./configure CXXFLAGS="-std=c++14"
make
sudo make install
echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc
source  ~/.bashrc
```

## おわりです
さっき、まずはインストールって書いたんですが、それで終わりみたいです。
うーん簡単でした。めでたし、めでたし。
PythonでWatson DiscoveryのCollectionのEnrichmentsを更新

```python
# %%
from ibm_watson import DiscoveryV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
import json

# %%
apikey='APIKEY'
version='VERSION'
authenticator = IAMAuthenticator(apikey=apikey)
discovery = DiscoveryV2(version=version, authenticator=authenticator)

# %%
service_url='SERVICE_URL'
discovery.set_service_url(service_url=service_url)

# %%
response = discovery.list_projects().get_result()
print(response)

# %%
projects = response['projects']
for project in projects:
    print(project)

# %%
name = 'PROJECT_NAME'
projects = [project for project in projects if project['name'] == name]
for project in projects:
    print(project)

# %%
project = projects[0]
print(project)

# %%
response = discovery.list_collections(project_id=project['project_id']).get_result()
print(response)

# %%
collections = response['collections']
for collection in collections:
    print(collection)

# %%
name = 'COLLECTION_NAME'
collections = [collection for collection in collections if collection['name'] == name]
for collection in collections:
    print(collection)

# %%
if len(collections) != 0:
    for collection in collections:
        response = discovery.get_collection(project_id=project['project_id'], collection_id=collection['collection_id']).get_result()
        print(response)
        print(json.dumps(response, ensure_ascii=False, indent=4))

# %%
enrichments = [
    {
        "enrichment_id": "ENRICHMENT_ID",
        "fields": [
            "AAA",
            "BBB"
        ]
    }
]
response = discovery.update_collection(project_id=project['project_id'], collection_id=collection['collection_id'], enrichments=enrichments).get_result()
print(response)
print(json.dumps(response, ensure_ascii=False, indent=4))

# %%
```


GUIでやれば良い気もしている…