OmniAICreator/Qiita-1.07M huggingface dataset:
ファインチューニングしたモデルをGGUFに変換する。


## はじめに

ファインチューニングしたモデルをOllamaなどで使いたい時にはみなさんどうしていますか？
今回はLLMモデルをGGUF形式に変換することで、Ollamaなどで使える形式にしてみました。
方法を忘れないようにこのブログに残しておきます。

## GGUFとは？
GGUFは「GPT-Generated Unified Format」の略で、大規模言語モデル（LLM）のための形式です
llama.cppやOllamaで使う際にはこの形式に変換すると使えるようになります。


## GGUF変換
では実際に変換していきましょう。GoogleColabを想定しています。
変換したものはHuggingfaceにPushするのでまずはログインしておきましょう。

```python
!huggingface-cli login
```

必要なライブラリは以下。

```python
!pip3 install -q -U accelerate transformers
```

まずは自前でチューニングしたモデルまたはGGUF形式に変換したいモデルを用意してください。

```python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
model_id = "you-hf/your-model"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map={"":0})
tokenizer = AutoTokenizer.from_pretrained(model_id, add_eos_token=True)

```

Pythonのロケール（locale）設定を変更して、文字エンコーディングを強制的にUTF-8に設定します。

```python
import locale
def getpreferredencoding(do_setlocale = True):
  return "UTF-8"
locale.getpreferredencoding = getpreferredencoding

```

llama.cppをクローンします。
```python
!git clone https://github.com/ggerganov/llama.cpp
```

プロジェクトのセットアップと必要な依存関係のインストールを行います。
```python
!cd llama.cpp && LLAMA_CUBLAS=1 make && pip install -r requirements/requirements-convert-hf-to-gguf.txt
```

```python
from huggingface_hub import snapshot_download
base_model = "./original_model/"
quantized_path = "./quantized_model/"
#
snapshot_download(repo_id=model_id, local_dir=base_model , local_dir_use_symlinks=False)
original_model = quantized_path+'/your_model.gguf'
```

そして`convert_hf_to_gguf`でGGUF形式に変換します。

```python
!python /content/llama.cpp/convert_hf_to_gguf.py ./original_model/ --outtype f16 --outfile ./quantized_model/your_model.gguf
```

それを最後にHuggingFaceにアップロードします。
```python
from huggingface_hub import HfApi, HfFolder, create_repo, upload_file
model_path = "./quantized_model/your_model.gguf" # Your model's local path
repo_name = "your-model-name-qa-GGUF"  # Desired HF Hub repository name
repo_url = create_repo(repo_name, private=False)
```

これでHuggingFace上にGGUF形式のモデルがPushされました。
ぜひOllamaとかで使ってみてください。

## 最後に

Xやってるので気になる方はフォローお願いします。

https://x.com/hudebakonosoto
ゼロから始める！サーバーレスアーキテクチャの世界

# はじめに
サーバーレスアーキテクチャは、近年非常に注目を集めている技術の一つです。クラウドサービスの進化に伴い、サーバーレスは開発者にとって避けて通れないテーマとなっています。このブログでは、サーバーレスアーキテクチャの基本からその利点、具体的な活用方法までを詳しく解説します。
初心者から中級者まで幅広い読者に向けてわかりやすく説明しているので、ぜひ最後までお読みください！

# 対象読者
- サーバーレスについて知りたい方
- クラウドサービスを活用している方
- システムアーキテクトやエンジニア

# 目次
1. サーバーレスアーキテクチャとは
2. サーバーレスの利点と課題
3. サーバーレスを始めるためのステップ
4. よくあるサーバーレスのユースケース
5. 実際のサーバーレスプロジェクトの例
6. サーバーレスアーキテクチャのベストプラクティス

# 1. サーバーレスアーキテクチャとは
サーバーレスアーキテクチャは、インフラの管理をクラウドプロバイダーに任せることで、アプリケーション開発に専念できるアーキテクチャの概念です。

### サーバーレスの基本について
サーバーレスという言葉は「サーバーが存在しない」という意味ではなく、「開発者がサーバー管理をする必要がない」状態を指します。
Amazon Web ServicesのLambdaやGoogle Cloud Functionsが有名なサーバーレスサービスです。

# 2. サーバーレスの利点と課題

### サーバーレスの利点
サーバーレスアーキテクチャには以下のような利点があります：

- インフラ管理のコスト削減
- スケーラビリティの向上
- デプロイの簡素化

### サーバーレスの課題
一方で、以下のような課題も存在します：

- 特定のクラウドプロバイダーに依存する
- デバッグが難しい
- コールドスタート問題

# 3. サーバーレスを始めるためのステップ
サーバーレスアーキテクチャを始めるためには、まず基本的な概念を理解することが重要です。

## 環境構築とツール
- クラウドプロバイダーの選定（AWS, GCP, Azure）
- 開発ツールの準備（Serverless Framework, AWS SAM）

## 実際にコードを書いてみよう！
```python
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello, World!')
    }
```
上記は簡単なAWS Lambdaの例です。Pythonを使い、イベントを受け取ってレスポンスを返すだけのシンプルなコードです。

# 4. よくあるサーバーレスのユースケース

### ウェブアプリケーションのバックエンド
サーバーレスはウェブアプリケーションのバックエンドとして広く利用されています。ユーザー認証、データベース操作、APIゲートウェイなど様々な機能をサーバーレスで実装できます。

### データ処理パイプライン
サーバーレスは膨大なデータを効率よく処理するパイプラインの構築にも適しています。データの収集、変換、保存などをイベント駆動で実行できます。

# 5. 実際のサーバーレスプロジェクトの例
ここでは、実際にサーバーレスアーキテクチャを用いたプロジェクトの例を紹介します。

## 事例1: Eコマースサイトの構築
AWS Lambda、API Gateway、DynamoDBを用いて、迅速でスケーラブルなEコマースプラットフォームを構築しました。ユーザーの注文処理や在庫管理といった機能が自動的にスケールします。

## 事例2: リアルタイムデータ分析
Google Cloud FunctionsとBigQueryを利用して、リアルタイムのデータ解析システムを実装。ログデータの収集と分析をスムーズに行えます。

# 6. サーバーレスアーキテクチャのベストプラクティス

### ロギングとモニタリング
サーバーレスはその特性上、ロギングとモニタリングが重要です。AWS CloudWatchやGCP’s Stackdriverを使用して監視しましょう。

### セキュリティ対策
クラウドのセキュリティは極めて重要です。IAMポリシーを適切に設定し、最小権限の原則を守ることが必要です。

### テストとデプロイメント
サーバーレスは自動テストとCI/CDが強力な助っ人になります。Serverless Frameworkなどのツールは、これを簡単にします。

# まとめ

サーバーレスアーキテクチャは、現代のソフトウェア開発において非常に強力なアプローチです。
インフラ管理の手間を削減し、スケーラビリティやコスト効率を向上させることで、開発者が本来の業務に集中できる環境を提供します。このブログが、サーバーレスの世界に一歩踏み出すきっかけとなれば幸いです！
React Testing LibraryでUnable to find an element with the text: XXXXのエラー

# 問題

React Testing Libraryを使用してテストを実装している中で、```screen.getByText('XXXX');```を使用すると以下のエラーが発生する。

```javascript
 Unable to find an element with the text: XXX 
 ```

# やったこと

まずは該当のコードをwaitFor関数で囲みます。

こうすることで非同期操作が完了するまで、テキストを取ってくるのを待ってくれるようになります。

以下が修正コードです。

```javascript
await waitFor(() => {
const contentElement = screen.getByText('XXXX');
const timeElement = screen.getByText('10');

expect(contentElement).toBeInTheDocument();
expect(timeElement).toBeInTheDocument();
});
```



まだ同じエラーが出ましたが補足分がついてきました。

```javascript 
Unable to find an element with the text: XXX 
This could be because the text is broken up by multiple elements.
In this case, you can provide a function for your text matcher 
to make your matcher more flexible.
 ```

「取得したい要素が複数の要素の可能性があるため、もう少し柔軟なマッチャーを使用してみて」と言われています。

ここでカスタムマッチャーを使ってみて独自の条件を指定することにしました。
カスタムマッチャーを使用することで、より広範囲でテキスト合致を検索をすることができます。

```javascript
await waitFor(() => {
const contentElement = screen.getByText((content, element) => {
return element.textContent.includes('XXXX');
});

const timeElement = screen.getByText((content, element) => {
return element.textContent.includes('10');
});

expect(contentElement).toBeInTheDocument();
expect(timeElement).toBeInTheDocument();

});

```

ここで、Unable to find an element with the text: XXXのエラーが出なくなりました。

代わりに以下のエラーが発生しました。

```javascript
(If this is intentional, then use the `*AllBy*` variant of the query
(like `queryAllByText`, `getAllByText`, or `findAllByText`))
```

中身を読むと「Allby〜」を使ってくださいと言われています。

言う通りに、getAllbyTextを使用することにしました。以下が変更後のコードです。

```jsx
await waitFor(() => {
    const contentElements = screen.getAllByText((content, element) => {
      return element.textContent.includes("テスト学習内容");
    });
    const timeElements = screen.getAllByText((content, element) => {
      return element.textContent.includes("10時間");
    });

    expect(contentElements.length).toBeGreaterThan(0);
    expect(timeElements.length).toBeGreaterThan(0);

    contentElements.forEach((element) => {
      expect(element).toBeInTheDocument();
    });
    timeElements.forEach((element) => {
      expect(element).toBeInTheDocument();
    });
```

上記のコードでエラーが発生しなくなり、無事解決をすることができました。


## getByTextとgetAllByTextの違い
それぞれの違いを知っていないと使う時にエラーの原因になってしまうので、要点を記載します。

### getByText

使用目的：DOM内の指定されたテキストを含む要素を1つだけ取得

結果の型：単一の要素

### getAllByText

使用目的：DOM内の指定されたテキストを含むすべての要素を取得

結果の型：要素の配列

<br/>

上記の通り、getAllByTextは結果が配列として返ってくるので要素の取り出しにはforEachなどを使用するようにしてください。

# おわりに

今回はエラーに続くエラーで解消が大変でしたが、getAllByTextについて学ぶいい機会となりました。
React Testing Libraryで非同期処理のエラーが出た時の解消方法

# 問題
React Testing Libraryを使用してテストを実装している中で、waitFor関数内で原因不明のエラーが出ていたのですが、コンソールログを入れるとうまくいったので、理由を調べてみました。

# 事象：
該当のコードがこちら。

```jsx
afterEach(cleanup);

test("削除ボタンを押すと学習記録が削除される", async () => {
  render(<App />);

  // 削除ボタンが表示されるまで待機
  await waitFor(() => {
    const deleteButtons = screen.getAllByTestId("delete");
    expect(deleteButtons.length).toBeGreaterThan(0);
    // console.log("Initial delete buttons count:", deleteButtons.length);
  });

  // 初期の学習記録の数を取得
  const initialRecords = screen.getAllByTestId("record");
  //   console.log("Initial records count:", initialRecords.length);

  // 削除ボタンクリック
  const deleteButton = screen.getAllByTestId("delete")[0];
  fireEvent.click(deleteButton);
  //   console.log("Clicked delete button");

  // 削除後の学習記録の数を検証
  await waitFor(async () => {
    const updatedRecords = await screen.getAllByTestId("record");
    console.log("Initial records count after click:", initialRecords.length);
    console.log("Updated records count:", updatedRecords.length);
    expect(updatedRecords.length).toBe(initialRecords.length - 1);
  });
});

```

上記コードの最後のwaitFor関数内に`console.log`で変数の配列要素数をとってくるようにしました。
そうするとそれまでで続けていたどこが原因かわからないエラーがなくなり、テストが通りました。


# 解決の理由

どうして`console.log`を入れるとうまく行くのか謎だったのでさらに調べると、どうやらコンソールログが非同期の実行順序に影響を与えていた可能性が理由のようでした。

つまり`console.log`を挿入することで、非同期の処理が完了するまでの時間が確保されてテストが正しく実行されたということです。

## 別の解決策

`console.log`を入れる以外に方法はないか検索したところ、`getAllByTestId`の代わりに`findAllByTestId`　を使用すると同じ結果を得ることができました。

それぞれの違いを簡単に説明すると、

`getAllByTestId`は同期的に動作して、指定されたテストIDに一致する要素を即座に返します。そして見つからない場合は、エラーを投げます。

`findAllByTestId`は非同期的に動作をします。指定された時間内に要素が見つかるまで待機をして要素が見つかればそれを返します。

以下がコードです。

```jsx
afterEach(cleanup);

test("削除ボタンを押すと学習記録が削除される", async () => {
  render(<App />);

  // 削除ボタンが表示されるまで待機
  await waitFor(() => {
    const deleteButtons = screen.getAllByTestId("delete");
    expect(deleteButtons.length).toBeGreaterThan(0);
    // console.log("Initial delete buttons count:", deleteButtons.length);
  });

  // 初期の学習記録の数を取得
  const initialRecords = screen.getAllByTestId("record");
  //   console.log("Initial records count:", initialRecords.length);

  // 削除ボタンクリック
  const deleteButton = screen.getAllByTestId("delete")[0];
  fireEvent.click(deleteButton);
  //   console.log("Clicked delete button");

  
    // 削除後の学習記録の数を検証
  await waitFor(
    async () => {
      await screen.findAllByTestId("record");
      await new Promise((r) => setTimeout(r, 2000));
    },
    { timeout: 3000 }
  );

  const updatedRecords = await screen.findAllByTestId("record");
  console.log(updatedRecords.length);
  expect(updatedRecords.length).toBe(initialRecords.length - 1);
  
});

```



今回はupdateRecordsの要素を取得するまでに時間がかかっているようで、findAllByTestIdで待機時間を指定して取得する方法でうまくいきました

上記では```await new Promise((r) => setTimeout(r, 2000));```で2秒間待機をするように指定しています。

そして```{ timeout: 3000 }```を設定することで、3秒以内にwaitFor関数の条件が満たされなかったらエラーをスローするようにしています。

# おわりに

今回は何が原因でエラーが出ているのかわからず、ひたすらトライアンドエラーを繰り返していましたが、コンソールログをさまざまなところに設定することが解決の糸口につながりました。
生成AI（OpenAI）を用いたLaravelアプリケーションの開発

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

# 概要
Laravelは強力なPHPフレームワークであり、豊富な機能と柔軟性を備えています。生成AI（例：OpenAIのGPT-4）を組み合わせることで、さらに高度な機能を実装し、アプリケーションの価値を高めることができます。本記事では、生成AIを活用してLaravelアプリケーションの機能を拡張する方法について解説します。

# 生成AIとは？
生成AI（Generative AI）は、人工知能の一種であり、新しいデータやコンテンツを生成する能力を持っています。OpenAIのGPT-4などのモデルは、テキストの生成、翻訳、要約など多様なタスクをこなすことができます。

# Laravelと生成AIの連携方法
Laravelと生成AIを連携させるためには、以下の手順を踏むことが一般的です。

- OpenAI APIキーの取得
- Laravelプロジェクトへのインストールと設定
- API呼び出しの実装
- OpenAI APIキーの取得
- OpenAIの公式サイトからAPIキーを取得します。(これは、API呼び出しを行うために必要です。)

# Laravelプロジェクトへのインストールと設定
OpenAI APIを使用するために、HTTPクライアントとしてGuzzleを使用します。まず、Guzzleをインストールします。

``` bash
composer require guzzlehttp/guzzle
```

次に、.envファイルにAPIキーを追加します。

``` env
OPENAI_API_KEY=your_openai_api_key
```

# API呼び出しの実装
以下は、生成AIを呼び出すための基本的なコード例です。

``` php
use GuzzleHttp\Client;

class OpenAIService
{
    protected $client;
    protected $apiKey;

    public function __construct()
    {
        $this->client = new Client();
        $this->apiKey = env('OPENAI_API_KEY');
    }

    public function generateText($prompt)
    {
        $response = $this->client->post('https://api.openai.com/v1/engines/davinci-codex/completions', [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->apiKey,
                'Content-Type'  => 'application/json',
            ],
            'json' => [
                'prompt' => $prompt,
                'max_tokens' => 150,
            ],
        ]);

        $result = json_decode($response->getBody(), true);
        return $result['choices'][0]['text'];
    }
}
```

# 実装例：AIを用いた自動応答機能
ユーザーからの問い合わせに対して、自動で応答する機能を実装します。コントローラでAIサービスを呼び出し、レスポンスを返す例を示します。

``` php
use App\Services\OpenAIService;

class ChatController extends Controller
{
    protected $openAIService;

    public function __construct(OpenAIService $openAIService)
    {
        $this->openAIService = $openAIService;
    }

    public function respond(Request $request)
    {
        $userMessage = $request->input('message');
        $aiResponse = $this->openAIService->generateText($userMessage);

        return response()->json(['response' => $aiResponse]);
    }
}
```

# 実装例：AIによるコンテンツ生成
ブログ記事や商品説明文などのコンテンツを自動生成する機能を実装します。

``` php
use App\Services\OpenAIService;

class ContentController extends Controller
{
    protected $openAIService;

    public function __construct(OpenAIService $openAIService)
    {
        $this->openAIService = $openAIService;
    }

    public function generateContent(Request $request)
    {
        $topic = $request->input('topic');
        $prompt = "Write a detailed article about " . $topic;
        $content = $this->openAIService->generateText($prompt);

        return response()->json(['content' => $content]);
    }
}
```

# まとめ
生成AIを用いることで、Laravelアプリケーションに高度な自動化機能やコンテンツ生成機能を追加することができます。今回紹介した例を基に、独自の機能を実装してみてください。

# 参考文献
- [OpenAI Documentation](https://platform.openai.com/docs/overview)
- [Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/8.x/filesystem)
TypeScriptにおけるas constの役割

as constの役割がいまいち理解できてなかったので、見返す用にまとめます。
自分の理解用に抽象化しているので詳細は[サバイバルTypeScript](https://typescriptbook.jp/reference/values-types-variables/const-assertion "constアサーション「as const」 (const assertion)
")などをご参照ください。

## 概要
as constを使うとTypeScriptでリテラル型の定数を定義できる。オブジェクトや配列を変更不可能（読み取り専用）にし、それらのプロパティの型をリテラル型とする。

## 具体例
```
const CounterActions = {
  DECREMENT: 'DECREMENT',
  INCREMENT: 'INCREMENT',
  ADD: 'ADD',
} as const;
```
この場合、CounterActionsオブジェクトの各プロパティは'DECREMENT' | 'INCREMENT' | 'ADD'という文字列リテラル型として推論され、変更不可能になる。

## as constの役割の要点
１　変更不可能にする
- オブジェクトや配列のプロパティを読み取り専用にする。
- readonly修飾子が自動的に追加される。

２　リテラル型として推論させる
- 各プロパティの型をその具体的な値（リテラル型）として推論する。
- 'DECREMENT'はstringではなく、文字列リテラル型'DECREMENT'として推論される。
- as constをしない場合は型推論でstring型と判断されてしまう。

## 使用場面と注意点
使用場面
- 変更不可の定数オブジェクトや配列を定義したいとき。状態管理のためのアクションタイプや設定値など。

- 特定のリテラル型として値を扱いたいとき。'DECREMENT'や42など特定の値のみを許容するユニオン型を作成する場合。

使用例
```
const directions = ['North', 'South', 'East', 'West'] as const;

type Direction = typeof directions[number];
// Direction は 'North' | 'South' | 'East' | 'West' というユニオン型
```

## 注意点
- 可読性
as constを使うと、コードの意図が明確になり、可読性が向上しますが、過度に使用するとかえって混乱することがあります。適切なコメントやドキュメントを追加すると良いでしょう。

- 変更不可の性質
as constを使用すると、オブジェクトや配列のプロパティが読み取り専用になります。これを意図しない場合は注意が必要です。

## 関連
- readonly修飾子:
プロパティを変更不可にするために使用される修飾子。as constはこれを自動的に適用する。

- ユーティリティ型:
TypeScriptには多くのユーティリティ型（型を操作するためのツール）がある。as constと組み合わせて使うことが多い。
```
Partial<T>,プロパティをオプショナルにする
Required<T>,プロパティを必須にする
Readonly<T>,プロパティを読み取り専用にする
Pick<T>,指定したプロパティのみを抽出
Record<K, T>: キーの型Kと値の型Tを持つオブジェクト型を生成
Pick<T, K>: 型Tから指定されたプロパティKだけを抽出
Omit<T, K>: 型Tから指定されたプロパティKを除外
ValueOf<T>,ビルトインのユーティリティ型ではないので
あらかじめ「type ValueOf<T> = T[keyof T];」のように定義が必要。
T型のキーを抽出し、抽出したキーに対応するvalue（値）を取得する。
```
【Go】名前付き戻り値を使うべきなのか

#  ブランクreturnの挙動
名前付き戻り値は以下のようにブランクreturnを使用することができる。
```go:
package main

import "fmt"

func add(num1, num2 int) (addResult int) {
	addResult = num1 + num2;
	return 
}

func main() {
	fmt.Println(add(1, 2)) //3
}
```

ではブランクreturnに誤って引き算の計算結果を記述した際の動作はどうなるのだろうか。
```go:
package main

import "fmt"

func add(num1, num2 int) (addResult int) {
	addResult = num1 + num2;
	return num1 - num2
}

func main() {
	fmt.Println(add(1, 2)) // -1
}
```
addメソッドは-1を返してしまうようだ。名前付き戻り値はreturnに値を記述した時はその値を返してしまうようだ。
# 名前付き戻り値を使うべきなのか？
このことから[effective_go](https://go.dev/doc/effective_go#named-results)からも分かるように名前付き戻り値を指定した場合はブランクreturnとの組み合わせが一般的なようだ。
私は名前付き戻り値を使うべきではないと思う。名前付き戻り値が悪いというより、ブランクreturnが良くない。ブランクreurnを書いてしまうとその変数が最後にどこで代入されているかを見ないといけないのでコードが非常に見にくくなってしまう。
参考書籍にも以下の記載がある。
> 関数が値を返すなら、絶対にブランクreturnを使ってはなりません。実際に返される値が非常にわかりにくくなる場合があります。

個人的には名前付き戻り値は必ずその変数名を返却するような仕様に変更してほしい。。

# おまけ
名前付き戻り値に指定した変数をメソッド内で代入しなかった場合は初期値が返される。

```go:
package main

import "fmt"

func add(num1, num2 int) (addResult int) {
	return
}

func main() {
	fmt.Println(add(1, 2)) // 0
}
```

# 参考
[effective_go](https://go.dev/doc/effective_go#named-results)
[初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド](https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEGo%E8%A8%80%E8%AA%9E-%E2%80%95%E4%BB%96%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A4%E3%83%87%E3%82%A3%E3%82%AA%E3%83%9E%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFGo%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-Jon-Bodner/dp/4814400047)
【chmod】ファイルとかディレクトリ権限の自由に設定したい！

## はじめに
`sudo`コマンド等で、ファイルやディレクトリを作成したときに  
`root`ユーザーからアクセスを変更するときのオプションなど忘れてしまうので、  
まとめておきます！
> 省略可能なものは、`{ }`で囲っています。
```bash
chmod {オプション} モード ファイル名
```


## モード
|モード|数値|説明|
|:---:|:---:|:------|
|`r`|4|読み取り|
|`w`|2|書き込み|
|`x`|1|実行|

### 権限早見表
| 数値 | 読み取り(r) | 書き込み(w) | 実行(x) |
|:-:|:-:|:-:|:-:|
| 7 | **`+`**| **`+`** | **`+`** |
| 6 | **`+`** | **`+`** | - |
| 5 | **`+`** | - | **`+`** |
| 4 | **`+`** | - | - |
| 3 | - | **`+`** | **`+`** |
| 2 | - | **`+`** | - |
| 1 | - | - | **`+`** |
| 0 | - | - | - |

## オプション
|オプション|説明|
|:-----------:|:------|
|-R|指定したディレクトリ内のすべてのアクセス権限を再帰的に変更する|
|-v|アクセス権限の変更を行ったものを表示する|
|-c|実際にアクセス権限の変更を行ったものだけ表示する|
|--reference=<br>{ファイル名}|参照ファイル(ディレクトリ)と同じ権限にする|


#### 補足
- `-c` と `-v` は似ているが、`-c` は既にアクセス権限が変更しようとしていたものと同じ場合、出力に表示されない。  
- `--reference` は複数ファイル指定ができる。  
   - 使用例↓
        ```bash
        chmod --reference=ref_file.txt file1.txt file2.txt
        ```
        `ref_file.txt` のアクセス権限と同様のものを `file1.txt` と`file2.txt` に与える。
        また、ディレクトリも同様の方法で権限を変更することが出来る


## 特定のユーザーへの変更
:::note warn
 `chmod`ではなく`chown`になっているところに注意
:::
```bash
chown {オプション} 新しい所有者:新しいグループ ファイル名
```

- ユーザーのみ変更する場合、`:グループ名` は省略可能。  
- グループのみ変更することも可能で、その場合は `:グループ名` だけ指定すればいい。  



## おわりに
使っていないとこの辺のコマンドとかが忘れてしまうので、まとめてみました。
参考になれば、幸いです。
【Rails】カラムの確認と削除

## 環境
Docker Compose
## 確認手順
Railsコンソール起動
```bash:コマンド
docker compose exec web rails c
```

以下コマンド実行でusersテーブルのカラム名が表示
```Ruby:コマンド
User.column_names
```

## 削除手順

**構文**

```ba:コマンド
rails g migration Removeカラム名Fromテーブル名 カラム名:型名
```

以下は`users`テーブルの`role`カラムを削除するマイグレーションファイルを作成・実行
```bash:コマンド
docker compose exec web rails g migration RemoveRoleFromUsers role:integer
```

---
マイグレーションファイルを確認

---

**リセットとロールバック**
コマンド実行してマイグレーションファイルのステータスを確認する
```bash:コマンド
docker compose exec web rails db:migrate:status
```

データベースに反映
```bash:コマンド
docker compose exec web rails db:migrate
```
ブロックボックスとインラインボックス復習

<h1>ブロックボックスとインラインボックス

<p>HTMLでマークアップされた要素の多くはブロックボックスとインラインボックスのどちらかの性質を持っています。
<p>性質を変えたい場合はCSSのdisplayプロパティの値を変更します。

<h2>【ブロックボックス】の例
<p> "h1〜h6" "p" "ul"など

<h2>ブロックボックスの特性
<p>ブロックボックスは可能な限り横幅いっぱいの領域をとろうとします

<h3>■並び方
<p>横幅いっぱいに広がり積み重なる

![ブロックボックスの特性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/d7c09c73-2dc5-729b-e11f-c44bfcae3b4a.png)

<h3>■幅と高さの指定
<p>幅（width）と高さ（height）の指定が出来る<br>
	
 <p>下の例<br>
	幅（width）= 400px<br>
	高さ(height) = 100px<br>
 
 ![width_height.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/6c077b6c-396a-c78f-aa8d-dcc5e1c84e91.png)

 <h3>■余白の指定
 <p>marginとpaddingを四方に指定できる
<p>margin

![margin四方に指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/22cebeb1-2a59-15f7-f06b-3a50b66b9eac.jpeg)

<p>padding

![padding四方に指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/270e042e-28e8-87dc-7e87-f4ac7c09e5bc.jpeg)

<h2>インラインボックスの特性
<p>＊インラインボックスはマークアップしたコンテンツの幅と同じ幅の領域に
なる
<p>＊テキストそのものもインラインボックスと同じ性質になる
<p>＊幅と高さは変えられない

<h2>【インラインボックス】の例
<p> "a" "img" "em"など
<p>私、個人的には "img" をインラインボックスからブロックボックスにする
作業をする事が多い<br>
<bold>CSSで幅と高さをもたせるため<br>
<p>img{<br>
display:block;<br>
}

<h2>■並び方
<p>横に並ぶ

![インラインボックス横に並ぶ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/1b45fb9e-5232-3215-7130-8707dd2a2ab9.jpeg)


<h2>■幅と高さの指定
<p>要素の中身に寄って変化する（指定不可）


![インライン要素の中身.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/271f5f54-6712-0580-57d5-318a695ac3d8.png)


<h2>■余白の指定
<p>padding<br>
margin<br>
は左右のみ指定できる

<p>padding

![インラインボックスpadding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/40162bd8-652c-5063-ec3f-b7a6c95b4086.png)

<p>margin

![インラインボックスmargin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/bfb8ea05-941b-6790-43b6-3c97b3f6eee5.png)

<h2>【"img"に display:block; を適用させると幅と高さが指定できる】

<p>CSS
<p>img{<br>
 display:block;<br>
width:50px;<br>
height:50px;<br>	
}



![imgにdisplay_block.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/9c299346-69de-6dfe-b17d-9c80655d5e4a.jpeg)
【Unity】Singletonパターンでクラスを実装しよう

# Singletonパターンとは

Singletonパターンとは、ソフトウェアデザインパターンの1つで、
特定のクラスのインスタンスがプログラム全体で一意に存在することを保証する方法です。

具体的には、次の3つの性質を持っています。

<INS> **1．唯一のインスタンス** </INS>

シングルトンクラスのインスタンスは1つしか存在しません。
新たに外部からインスタンスを生成することはありません。

<INS> **2．グローバルなアクセスポイント** </INS>

シングルトンクラスのインスタンスには、
どこからでもアクセスできる共通のアクセスポイントが提供されます。

<INS> **3．インスタンス化の制御** </INS>

シングルトンパターンでは、通常、最初のアクセス時にインスタンスが生成されます。
そして、その後のアクセスではその生成されたインスタンスが再利用されます。

# Singletonパターンでクラスを実装する

<details><summary>上記3つの特性に沿って実装したクラスがこちらです。</summary>

```cs
using UnityEngine;

public class Singleton : MonoBehaviour
{
    // シングルトンインスタンス
    private static Singleton instance;

    // インスタンスのプロパティ
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                // シーン内からインスタンスを検索
                instance = FindObjectOfType<Singleton>();

                if (instance == null)
                {
                    // インスタンスが見つからなかった場合、新しいゲームオブジェクトを作成
                    GameObject singletonObject = new GameObject();
                    instance = singletonObject.AddComponent<Singleton>();
                    singletonObject.name = typeof(Singleton).ToString() + " (Singleton)";

                    // シーン遷移時にオブジェクトを破棄しないように設定
                    DontDestroyOnLoad(singletonObject);
                }
            }
            return instance;
        }
    }

    // Awakeメソッドで重複インスタンスをチェック
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }
    }
}
```
</details>

1．唯一のインスタンスに該当するのは

```cs
// シングルトンインスタンス
private static Singleton instance;
```

2．グローバルなアクセスポイントに該当するのは

```cs
// インスタンスのプロパティ
public static Singleton Instance
{
    get
    {
        if(instance == null)
        {
            // 最初のアクセス時にインスタンスを生成
            instance = new Singleton();

            // シーン遷移時に破棄されないようにする
            DontDestroyOnLoad(instance.gameObject);
        }
        return instance;
    }
}
```

3．インスタンス化の制御に該当するのは


```cs
// Awakeメソッドで重複インスタンスをチェック
private void Awake()
{
    if (instance == null)
    {
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
    else if (instance != this)
    {
        Destroy(gameObject);
    }
}
```

という構成になっています。
Singletonパターンで実装するだけなら、DontDestroyOnLoadに設定する必要はありません。

最後までご覧いただきありがとうございました :laughing:
LeetCode挑戦日記：Day37

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Medium] 1372. Longest ZigZag Path in a Binary Tree

二分木の根が与えられたとき、二分木のジグザグ経路は以下のように定義されます：

1. 二分木の任意のノードと方向（右または左）を選びます
2. 現在の方向が右であれば、現在のノードの右の子ノードに移動します。
   そうでなければ、左の子ノードに移動します
3. 方向を右から左、または左から右に変更します
4. 木の中で移動できなくなるまで、2番目と3番目のステップを繰り返します

ジグザグの長さは訪れたノードの数 - 1として定義されます。（単一のノードの長さは0です）
その木に含まれる最長のジグザグ経路を返します。

## 素直に解いてみる

### 考え方

1. 次の方向を引数に持つ再帰関数を作成する

### コーディング

```typescript
function longestZigZag(root: TreeNode | null): number {
    let max = 0;

    const func = (root: TreeNode | null, direction?: string): number => {
        if (!root) { return 0; }

        const l = func(root.left, 'right');
        const r = func(root.right, 'left');

        switch (direction) {
            case 'right':
                if ((r + 1) < l) { max = Math.max(max, l); }
                return (r + 1);
            case 'left':
                if ((l + 1) < r) { max = Math.max(max, r); }
                return (l + 1);
            default:
                return Math.max(max, l, r);
        }
    }
    return func(root);
};
```

### 結果

Runtime：140ms
Beats 78.75%

Memory：72.62MB
Beats 71.25%
【Ruby】配列のうしろに配列の要素を追加する

配列のうしろに配列を追加する方法です。

```ruby
array1 = []
array1.push(1)
array1.push(2)

for i in array1 do
  puts i
end
```

実行した結果
![tst.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710584/4634b553-9e8f-9ce4-75b2-49d7d863255e.jpeg)
【これからの情報伝達手段の形】AIを使った1on1メッセンジャーの構築

これからの情報伝達手段はAIを使った1on1の時代になると思います。
1on1とは上司と部下が定期的に行う面談のことです。

## 情報伝達手段の整理
今までの情報伝達手段を整理してみました。

|名前|メリット|デメリット|
|-|-|-|
メール|記録が残る<br>いつでも送れる|送ってから修正ができない<br>相手の状況がわからない
SMS|即時性が高い|70文字の制限がある
FAX|改ざんのリスクが低い|コストが高い
郵送|改ざんのリスクが低い|コストが高い
SNS|情報収集<br>テキストだけのやり取りより感情を伝えやすい|不特定多数の人とのトラブルにつながる可能性がある
メッセンジャー|即時性が高い<br>コミニケーションが取れる|情報が流れてしまう
動画|情報量が多い|一方的になる
ホームページ|情報量が多い<br>情報をまとめることができる|一方的になる

## AIによる情報伝達手段の新しい形
既存の情報伝達手段にAPI連携でAIを組み合わせることでユーザーとの密なコミニケーションを構築することができていくと考えています。

## メッセンジャーとの連携
メッセンジャーとAIを連携させることでユーザーのニーズを満たせるサービスが作れる。

|名前|内容
|-|-
ツール|LINE
方式|API連携

最近話題になったDifyというAツールで知識データベースを持つRAGが実装できるので実際にどうすれば実装できるか調査していこうと思います。

Difyについては
https://qiita.com/momomoge/items/91cbea8b9e540f0e6e11

DifyとLINEの連携は以下記事が参考となります。
https://qiita.com/bathtimefish/items/d48761702255c090b4f8
【KMP】XcodeでJAVA_HOMEがなんちゃらって言われてビルドが通らないとき

## はじめに
KMPを少し触り始めました。いいですね。KMP面白いです。
基本的には以下のチュートリアル的なものを進めていけば、導入としては良さそうです。
ただ僕はチュートリアルを進めていく中でXcodeでのiOSアプリビルドができなくて困ったので、その解決法を記しておきます。

https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html


## この記事でなにを解決できる？
- Xcodeでビルドした時に以下の画像のようなJAVA_HOME関連のエラーが出た人は参考になると思います
- もし以下のようなエラーでなくても一通り試してもらえばもしかしたら解決するかも？

![スクリーンショット 2024-07-13 17.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/60b05920-4831-428e-2a7a-939bcc1d30f1.png)


## 環境
### IDE
- Android Studio: Koara
- Xcode: 15.2

### mac
- MacBook Air M2
- macOS: Sonoma14.1

## 解決方法
解決方法はいくつかありそうですが、僕が解決した方法と手順を記しておきます。

### JAVA_HOMEの設定

```.zshrc```ファイルに以下の2行を付け足して使用するJavaをAndroid Studioに含まれているものにします。

```.zshrc

export PATH=$PATH:/Applications/"Android Studio.app"/Contents/jbr/Contents/Home/bin
export JAVA_HOME=/Applications/"Android Studio.app"/Contents/jbr/Contents/Home

```

ファイルに書き込んだ後は、ファイルの再読み込みをお忘れなきよう。
ターミナルで以下のコマンドを叩いてください。

```
$ source ~/.zshrc
```

以下のコマンドでjavaのバージョンを確認します
```
$ java -version
```
以下のようにJavaのバージョンが表示されればOKです！
![スクリーンショット 2024-07-14 15.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/9c340264-2a31-5889-2e97-cd4351ee7c2e.png)

※もしjavaのバージョンが表示されない場合はターミナルで以下コマンドを叩いて、このディレクトリに移動できるかを試してみてください。

```
$ cd /Applications/"Android Studio.app"/Contents/jbr/Contents/Home/bin
```
ディレクトリの移動もできない場合、以下の画像のようにjavaがあるディレクトリを```Android Studio.app```配下から探して```.zhrc```のパスを実際にjavaが存在するものに書き換えてください。

![スクリーンショット 2024-07-14 15.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/40fe08f7-72ee-8c85-a21a-7be37e4694f4.png)

### Xcodeで使用するJavaを設定

メニューの```Xcode > Settings > Location```と進みます。(以下画像の画面)
![スクリーンショット 2024-07-14 15.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/a14679c8-492b-63e9-9568-5a9c374f449a.png)

左下にある「+」ボタンをタップし、画像のように```Name```、```Display Name```を入力してください。

Pathには以下を入力します。

```
/Applications/Android Studio.app/Contents/jbr/Contents/Home
```

:::note warn
警告
Android Studio.appはダブルクォーテーションを使用していないことに注意してください。
:::

Pathまで設定できたら、クリーンビルドをして、ビルドしてみましょう！！
これでいけるはず！！


## おわりに
kmpおもろいけどむずいところ結構ありますね！
おーわーり！！
ITパスポート マルチメディア

・マルチメディア
文字や画像、動画、音声などの様々な種類の情報をデジタル化し、組み合わせて扱うこと

圧縮
データ量を小さくすること
伸張（解凍）
元に復元すること

・圧縮の方式
可逆圧縮方式
圧縮したデータを完全に復元できる方式
非可逆圧縮方式
圧縮したデータを完全には復元できない方式

・マルチメディアのファイル形式
画像
BMP（.bmp）
GIF（.gif）
JPEG（.jpg）
PNG（.png）
動画
MPEG（.mpg）(.mp4)
AVI（.avi）
音声
MP3（.mp3）

・ストリーミング
データをダウンロードしながら同時に再生できる技術

・アーカイブ
複数のファイルをまとめて一つのファイルにすること

・音のデジタル化
1. 標本化（サンプリング）
アナログの波形を一定時間間隔で区切り、値を取り出す
2. 量子化
標本化で取り出した値を、決められた範囲の中で、最も近い値を割り当てる
3. 符号化
量子化で割り当てた値を、２進数で表す

・マルチメディアの応用
・CG（コンピュータグラフィックス）
・VR（バーチャルリアリティ、仮想現実）
・AR（拡張現実）
現実世界の映像に、CGを合成した映像を映し出す技術
・プロジェクションマッピング
プロジェクタを用いて、建物や模型などの立体物に、CGなどを投影することで、様々な視覚効果を出す技術

・グラフィックスデータ
・ベクタグラフィクス
主に線画を扱う
拡大しても図形の輪郭にギザギザが生じない
・ラスタグラフィクス
主に写真を扱う
拡大すると輪郭にギザギザが生じる
BMP、GIF、JPEG、PNGなど
リポジトリの綺麗な運用術

# はじめに
GitHubは、多くの開発者やプロジェクトチームにとって欠かせないツールです。
ですが、私自身、過去のrepoを見返してみると煩雑で汚いものが数多くあります。
今回の記事では、綺麗なリポジトリを運用するための方法をいくつかまとめてみましたので、是非参考にしてみてください。


# リポジトリの構造を整理する
## フォルダ構造の最適化
プロジェクトのフォルダ構造は、直感的でわかりやすいものにしましょう。
例えば、こんな感じ。

```
/fugahoge-project
├── src
├── docs
├── tests
├── scripts
├── .git
├── README.md
└── .gitignore
```

特に、Vueなどではコンポーネントが肥大化していくので、ロジックをうまく分割してあげると保守性の向上に繋がります。

## 不要ファイルの除去
不要なファイルやディレクトリは、`.gitignore`を使ってリポジトリから除外します。
これにより、リポジトリが邪魔なもののない整理された状態を保つことができます。

テスト用の`.env`とかそういうのですね。


# READMEの充実化
## プロジェクトの概要を記載
READMEには、プロジェクトの目的や概要を明確に記載します。
新しいユーザーや開発者がプロジェクトを理解しやすくなります。

しかし、ここにあまり詳細に書きすぎるのもよくないので、概要と目次別にDocsへのリンクだけを乗せるくらいがちょうどいいのではないでしょうか。


## インストール方法と使用方法
具体的なインストール手順や使用方法を記載することで、他の開発者が簡単にプロジェクトを利用できるようになります。

## 貢献方法
プロジェクトに貢献する方法やルールを明示しましょう。
個人開発の場合、コントリビューターが増えるとしあわせになれるかもしれません。

GitHubの場合、以下のページに詳細な定義方法が記載されています。

https://docs.github.com/ja/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository

https://docs.github.com/ja/communities/using-templates-to-encourage-useful-issues-and-pull-requests/manually-creating-a-single-issue-template-for-your-repository


# IssueとPull Requestの管理
## テンプレートの使用
IssueやPull Requestのテンプレートを設定することで、情報が整理され、やり取りがスムーズになります。
テンプレートには、必要な情報を漏れなく記載できるようにしましょう。

## ラベルの活用
IssueやPull Requestにはラベルを付けて管理します。
バグ、機能追加、質問など、種類ごとにラベルを設定しておくと、管理が楽になります。
~~(私はこれをあまり使えていません)~~


# ブランチの運用
## ブランチモデルの採用
GitFlowやGitHub Flowなどのブランチモデルを採用することで、開発フローが整理され、作業が効率化されます。

しかし、例外として少人数での小規模な開発であれば、ルールでガチガチに縛り付けるよりもある程度の定義だけをやっておいて柔軟な運用をしたほうがいいかと思います。

## ブランチの命名規則
ブランチ名には、作業内容がわかるような命名規則を設けましょう。
例えば、`feat/[機能名]`や`fix/[修正内容]`みたいな感じ。


# コミットメッセージのルール化
## 一貫したフォーマット
コミットメッセージには一貫したフォーマットを採用します。
例えばこんな感じ

```
prefix: 説明
```


## prefix
コミットメッセージの先頭につけるprefixをいくつか用意しておきます。
例えば、`feat`(新機能)、`fix`(バグ修正)、`docs`(ドキュメント)、`refactor`(リファクタリング)などです。

私は、[僕が考える最強のコミットメッセージの書き方](https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e)を参考にしています。
分かりやすいので是非参考にしてみてください。


# 自動化ツールの導入
## GitHub Actionsの活用
GitHub Actionsを使って、CI/CDパイプラインを構築しましょう。
自動テストやデプロイを設定することで、作業の自動化が進みもれなくしあわせになれます。

これ一つでDockerイメージのビルドからコンテナレジストラへの登録まで全部完結するので便利です。

## Dependabotの設定
Dependabotを設定することで、依存関係の更新を自動で行い、セキュリティリスクを軽減します。
取り敢えず使っておきましょう。


# おわりに
この記事ではリポジトリの運用術について書いてきましたが、実際に綺麗で完璧な状態のまま運用するのにはなかなか厳しいものがあります。

ですが、これまで紹介したいろいろを使うと、リポジトリを心做しかちょっとだけ綺麗に運用することができます。
リポジトリが整理されていると、作業効率が上がり、しあわせになれるでしょう。

是非、使ってみてください。

それでは。
【JavaSilver】パッケージについて

# パッケージの主な目的

　1.名前空間を提供し、名前の衝突を避ける
　2.アクセス修飾子と組み合わせてアクセス制御機能を提供する
　3.クラスの分類を可能にする

# 「名前空間を提供し、名前の衝突を避ける」とは
ソフトウェア開発ではすべての部品を自分たちで作るわけではない。
過去のプロジェクトで使われていたものを再利用したり、オープンソースの部品を使ったりすることは頻繁に行われるる。
そのため、クラス名が他のソフトウェア部品で使われているクラスメイト重複する可能性が高くなる。
もし名前が重複してしまった場合はコンパイラやJVMはどちらのクラスを利用すればよいかがわからなくなる。

このような事態を避けるためにコンパイラやJVMはクラスを「パッケージ名.クラス名」の完全修飾クラス名で扱う。
***
このようにパッケージは名前の重複を避けるために使う。そのためパッケージ名はできるだけ一意であることが推奨される。
そこで慣習として「xxx.co.jp」というドメインであれば逆にして「jp.co.xxx」といった名前を付けられることが多い。しかしあくまでも慣習であって決まりではないためパッケージ名にはドメインを逆にした以外の名前もつけることができる。

 # 「アクセス修飾子と組み合わせてアクセス制御機能を提供する」とは
 パッケージとアクセス修飾子を組み合わせることで、クラスやメソッド、フィールドへのアクセスを制御できる。
 これにより、必要な部分だけ公開し、内部実装に関しては隠蔽することができる。
 公開・非公開に分けることで、設計者の意図しないクラスが不用意に使われることを防ぐ。
***
　・修飾子なし
 　→そのメンバーは同じパッケージ内のクラスからのみアクセスできる。
　・public
   →クラスやメンバーはすべてのパッケージからアクセスすることが可能
　・protected
 　→同じパッケージ内のクラスとサブクラスからアクセスが可能
　・private
 　→同じクラスからのみアクセスが可能

# 「クラスの分類を可能にする」とは
パッケージは、ディレクトリ構造とマッピングされるため多数のクラスを分類整理することができ、ソフトウェアの管理が容易になる。

 jp.co.xxx.Smapleクラスが配置されるのはjp/co/xxx/Sample.classになる

 # 最後に
 :::note warn
 クラスは必ず何らかのパッケージに属するため、パッケージ宣言を省略したクラスもデフォルトで無名パッケージに属するものと解釈される。
GithubのMarkdownの見た目をリッチにする記法の紹介

# 初めに
Githubには以前から下記のように、Markdownで書かれた文章の見た目をちょっとだけリッチにする記法があります。
![６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/79277b23-8875-39ce-a84c-740993a5a559.png)

このような記法を使うことで、筆者が伝えたいことを分類し、強調することが出来ます。
視覚的に強調されるため、***ユーザーは重要な情報を見逃すことは減り、操作ミスの削減***につながるため、積極的に取り入れて使っていきましょう！

# 書き方
説明するより見てもらった方が早いので、パパっと紹介！
```
> [!NOTE]
> Useful information that users should know, even when skimming content.<br>
> コンテンツをざっと読むときでもユーザーが知っておくべき有用な情報。

> [!TIP]
> Helpful advice for doing things better or more easily.<br>
> 物事をより良く、より簡単に行うための役立つアドバイス。

> [!IMPORTANT]
> Key information users need to know to achieve their goal.<br>
> ユーザーが目標を達成するために知っておく必要のある重要な情報。

> [!WARNING]
> Urgent info that needs immediate user attention to avoid problems.<br>
> 問題を回避するためにユーザーがすぐに対応する必要がある緊急情報。

> [!CAUTION]
> Advises about risks or negative outcomes of certain actions.<br>
> 特定の行動のリスクや否定的な結果についてアドバイスします。
```

## ちょっとした小技
箇条書きやリスト、表と組み合わせて記述することも可能です！
![８.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/51f0d950-d664-cb29-74ad-9de4db44871e.png)

書き方は下記の通り
```
> [!NOTE]
> 箇条書きも可能！
> - リンゴ
> - ほうれん草
> - 鮭

> [!TIP]
> リスト形式も可能だよ！
> 1. パイナップル
> 2. きゅうり
> 3. 鯖

> [!IMPORTANT]
> 表形式も可能じゃ！
> |No|列１|列２|
> | --- | --- | --- |
> |1|桃|アボカド|
> |2|トマト|ズッキーニ|
> |3|まぐろ|エビ|
```

# 最後に
色がつくと一気に見た目が華やかになるので、書いていて楽しくなりますよね。
筆者も読者も両方にメリットがあってwin-winなので、今後も使っていこうと思う次第じゃ。
AppIntentsにおける主要プロトコル

## AppIntent
https://developer.apple.com/documentation/appintents/appintent
インテントそのものを定義するプロトコル。これがインテントの本体。@Parameterでインテントに使う変数を宣言することができ、Perform()で実行内容を作る。これ単体でもショートカットアプリ内でアクションとして用いれるが、デフォルトでショートカットとして使えるようにするにはAppShortcutsPorviderで指定する必要がある。

## AppShortcutsProvider
https://developer.apple.com/documentation/appintents/appshortcutsprovider
ショートカットを定義するプロトコル。ここでショートカットの名前、フレーズ、そして実行するアクション(AppIntent)などを指定する。アイコン(SF Symbols)や背景色なども指定する。ここで指定してショートカットはショートカットアプリやSpotlight検索で表示される。

## AppEntity
https://developer.apple.com/documentation/appintents/appentity
AppIntentでデータのモデルを扱いたいときに使うプロトコル。

## FileEntity
https://developer.apple.com/documentation/appintents/fileentity
iOS18から新しく加わった。

## AppEnum
https://developer.apple.com/documentation/appintents/appenum
AppIntentでカスタムな型が必要な時に使う。 

### TypeDisplayRepresentable
AppEnumが表示される際に使われる文字列。

```
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Name")
```
### caseDisplayRepresentations
AppEnumのcaseが表示される際に使われる文字列。ショートカットアプリで変数を選択される時などに使用される。
AppIntentのメタデータの設定一覧

https://developer.apple.com/documentation/appintents/appintent#Configuring-the-metadata

### title
AppIntentのタイトル。ショートカットの名前として表示される。

### description
ショートカットの説明文。

### openAppWhenRun
その名の通り、インテントが実行された時にアプリを開くかどうかのBool。trueにすると、インテントが実行された時アプリが開かれる。

### isDiscoverable
インテントがショートカットアプリやSpotlightで表示されるかを設定できる。デフォルトだとtrueだが、隠したい時はfalseにする。
【Unity】DontDestroyOnLoadでシーンを跨いで保持しよう

# DontDestroyOnLoadとは？

DontDestroyOnLoad（以下、DDOL）とは、
特定のゲームオブジェクトがシーンを移動しても破棄されないようにするための方法です。

DDOLを利用することで、そのゲームオブジェクトとその子オブジェクトが
シーン遷移時に破棄されず、情報や設定を保持することが可能になります。

逆に、DDOLを使用しない場合、シーンが切り替わる（アンロードされる）と、
そのシーンに存在するすべてのゲームオブジェクトは破棄されます。

そのため、シーンが切り替わってもオブジェクトを残しておきたい場合に有効です。

# DDOLをスクリプトから設定する

下記のコードを残したいゲームオブジェクトにアタッチしましょう。

```cs
using UnityEngine;

public class DDOL : MonoBehaviour
{
    private void Awake()
    {
        // DDOLに登録する
        DontDestroyOnLoad(gameObject);
    }
}
```

これだけ？と思うかもしれません。**これだけです。**

# 実際にテストしてみる

では、これだけで本当にゲームオブジェクトが残るのか実際に確かめてみましょう。
適当に2つのシーンを作ります。「Scene 1」と「Scene 2」にしました。

次に、シーンを遷移させる処理を実装しましょう。
適当なオブジェクトに下記のコードをアタッチします。

```cs
using UnityEngine.SceneManagement;

public class DDOLTest : MonoBehaviour
{
    void Start()
    {
        SceneManager.LoadScene("Scene 2");
    }
}
```

SceneManager.LoadScene()の引数には、遷移先のシーン名を指定しましょう。
なお、インスタンスを作成せずにLoadSceneメソッドを呼び出せる理由は、
SceneManagerが静的クラスであるためです。

また、シーンを実行する前に「Build Settings」の「Scenes In Build」の欄に
「Scene 1」と「Scene 2」をドラッグアンドドロップしましょう。
「Build Settings」はメニューバーの「File」から選択できます。

この状態で「Scene 1」を実行してみましょう。
DDOLクラスをアタッチしたオブジェクトが「Scene 2」にも存在しています。

最後までご覧いただきありがとうございました :laughing:
ショートカットアプリでインテントを表示させないようにする

https://developer.apple.com/documentation/appintents/appintent/isdiscoverable-1fl1s

ふとこんなものを発見した。通常、AppIntentを定義すると自動的にショートカットアプリで表示されるのだが、それを非表示にできるらしい。

```
static var isDiscoverable = false
```
表示させない時にはfalseにする。

他のAppIntentで組み合わせるために作ったインテント、単独で使わないインテントにはこれを使う（？？？）
配列について　データ構造

# はじめに
今回は、プログラミングをする上でどの言語でも使用する配列というデータ構造が実際どういうものなのかを紹介してきたいと思います。
## 配列とは
配列はよく以下のような形で見られます。
```cpp
int numbers[3] = {3, 5, 1};
```
上記は、数値の配列ですが何を表しているのでしょうか？
これは、連続したメモリ領域に３つの数値データを持たせておくということを表しています。

## 配列の条件
- 配列には同じデータ型のデータしか入れられない
- 指定した配列の長さを超えるインデックスを指定してデータが入れられない
上記の条件があります。
これは、以下の問題が発生するからです。
## 問題
1. データ型によって、使用するバイト数が違うためデータを取得できない
```cpp
[3, "ああ", true]
```
このような配列になった場合、データ型が決まっていないため何バイトを先頭から指定したら`3`が取得できるか判断できません。

2. 連続して最初に固定値のメモリ領域を確保するため、続きのメモリが空いてるとは限らない

例えば、最初の例でint型の長さ3の配列を作成しました。このときメモリ上では3つの数値データが入る分の領域を確保しています。インデックス4にデータを入れようとすると、確保していない部分のメモリを使うことになります。この領域が他の用途で使用されていた場合、データを保存できません。

## 疑問
Q. jsやPHPでは、違うデータ型のデータを配列に入れる事ができてしまうのはなぜ？
A. これは、配列内のデータの中で一番多いバイト数のデータに全データ合わせるからです。

`[3, "あああ", 4]`の例で説明すると、`3`が2バイト、`"あああ"`が3バイト、`4`が2バイトです。
これだと`"あああ"`の3バイト分の領域に合わせて他のデータも確保します。
つまり、2 + 3 + 2の7バイト分ではなく、3 + 3 + 3の９バイト分のデータを確保し、３倍と読み取ればデータを正しく読み取れる状況を作っているのです。

### まとめ
配列についてコンピュータサイエンスの視点から解説しました。よく発生するエラーの原因が少しでも理解いただければ幸いです。

私は大学でコンピュータサイエンスを学んでいないため、誤りがあるかもしれません。ご指摘いただけると幸いです。


ここまで読んでくださり、ありがとうございました。
配列とオブジェクトの分割代入

## 分割代入とは
JavaScript では分割代入と呼ばれる変数への代入方法があります。
配列やオブジェクトなどに含まれる複数の要素を別々の変数へ分割して代入することができます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

## オブジェクトの分割代入
オブジェクトの分割代入構文を用いると、オブジェクトの値を取り出す処理を簡潔に書けます。
```ts
const obj = {
  foo: 271,
  bar: "str",
  "1234": 314,
}
const { foo, bar } = obj
console.log(foo) //271
console.log(bar) //str
```

変数名と同じプロパティキーに対応する値が変数に代入されます。
ただし型注釈をつけることはできず、変数の型は型推論によって決定されます。

### 識別子でないプロパティ名
プロパティ名が識別子ではない場合（数字で始まっていたり、特定の記号を含んでいる場合）には、変数名を変更することで分割代入が可能となります。
```ts
const obj = {
  foo: 271,
  bar: "str",
  "1234": 314,
}
const { foo, "1234": var1234 } = obj

console.log( foo )
// 271
console.log( var1234 )
// 314
```
`const { foo, bar } = obj`という書き方は、`const { foo: foo, bar: bar } = obj`という書き方の省略形となっていたわけです。
分割代入において、変数名とプロパティキー名が同じ場合にはこの省略形が使用できます。

### ネストされているオブジェクト
ネストされているオブジェクトから値を取り出したいときにも活用できます。
```ts
const nestedObj = {
  foo: 123,
  obj: {
    bar: 1,
    obj2: {
      baz: 2,
    },
  },
}
const { obj: {bar, obj2: { baz }}} = nestedObj

console.log(bar)
// 1
console.log(baz)
// 2
```
#### React のイベントオブジェクト`e.target.value`と分割代入
先の記法により、例えばReact のイベントオブジェクト`e`の`target`に含まれる`value`値を取得して変数に格納したい場合に、`e.target.value`のように書かずに直接`value`へ分割代入して格納する事もできます。
```tsx
function App() {
  const [name, setName] = useState("");

  return (
    <>
      <input
        type="text"
        value={name}
        onChange={(e) => setName(e.target.value)}
      />
      <p>Name: {name}</p>
    </>
  );
}
```
以下のプログラムでは`(e)=>setInputValue(e.target.value)`の部分を書き換えています。
```tsx
function App() {
  const [name, setName] = useState("");

  return (
    <>
      <input
        type="text"
        value={name}
        onChange={({ target: { value } }) => setName(value)}
      />
      <p>Name: {name}</p>
    </>
  );
}
```

`({ target: { value } }) => setInputValue(value)`と分割代入によって受けとることで、`e.target.value`と書いていた箇所が`value`だけで済むようになっていますね。

https://ja.react.dev/reference/react-dom/components/common#react-event-object

## 配列の分割代入
配列についても分割代入が使用可能です。

複数の変数をもつ配列に対して、代入元の配列の先頭要素から順に代入されていきます。
オブジェクトの場合と同じで型注釈をつけることはできず、型推論のみによって型が決定されます。
```ts
const arr = ["hello", 123, true]

const [foo, bar] = arr

console.log(foo)
// "hello" 
console.log(bar)
// 123
```
１つ目の変数`foo`には`arr`の先頭の要素である`"hello"`が代入され、２つ目の変数`bar`には`arr`の先頭から２つ目の要素である`123`が代入されています。
#### `useState`と分割代入
配列の分割代入が利用されている例として、React の`useState`があります。
`useState`からは`state`とset 関数が配列の形（タプル型）で返されます。
```ts
const [state, setState] = useState()
```
`state`や`setState`の部分にはどのような変数名をつけても１つ目の変数に`state`用の値が代入されて、２つ目の要素にset 関数が代入されます。
`const [setState, state] = useState()`のような書き方もできるわけですが、この場合には`state`の方にset 関数が代入されます。
##### 命名の自由度
配列の分割代入によって値を受けとることで自由な変数名を簡潔につけることができますが、自由に名前をつけられる一方で変数名の付け方によっては`useState`のset 関数なのか等がわかりにくくなってしまいます。

そのためset 関数の代入先の変数名の先頭には`set`を付すことが推奨されているわけですね。
Goのエラーハンドリングざっくり

## GO言語のエラーハンドリング
GO言語では、エラーを示すために組み込みの`error`型を使用します。例えば、os.Open関数はファイルを開く際に失敗すると非nilの`error`値を返します。
```go:例
f, err := os.Open("filename.ext")
if err != nil {
    log.Fatal(err)
}
// ファイルを開いた後の処理
```
#### `error`型の詳細
`error`型はインターフェース型であり、以下のように定義されています。
```go:例
type error interface {
    Error() string
}
```
最も一般的な`error`の実装は、`errors`パッケージの`errorString`型です。

```go:例
type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}
```
`errors.New`関数を使用して`errorString`を生成できます。
```go:例
func New(text string) error {
    return &errorString{text}
}
```
#### カスタムエラーの作成
エラーに追加情報を持たせたい場合、カスタムエラー型を定義することができます。
```go:例
type NegativeSqrtError float64

func (f NegativeSqrtError) Error() string {
    return fmt.Sprintf("math: square root of negative number %g", float64(f))
}
```
このようにすることで、エラーの詳細を呼び出し元が確認できるようになります。
#### エラーハンドリングの簡略化
GO言語ではエラーハンドリングが重要であり、明示的にエラーをチェックすることが推奨されています。以下のように、HTTPハンドラでエラーハンドリングを簡略化する方法があります。
```go:例
type appHandler func(http.ResponseWriter, *http.Request) error

func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if err := fn(w, r); err != nil {
        http.Error(w, err.Error(), 500)
    }
}

func init() {
    http.Handle("/view", appHandler(viewRecord))
}

func viewRecord(w http.ResponseWriter, r *http.Request) error {
    c := appengine.NewContext(r)
    key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil)
    record := new(Record)
    if err := datastore.Get(c, key, record); err != nil {
        return err
    }
    return viewTemplate.Execute(w, record)
}
```
このようにすることで、エラーハンドリングのコードを簡潔に保つことができます。
## 参考記事
https://go.dev/blog/error-handling-and-go
ITパスポート 表計算（関数の応用）

・IF関数
条件を満たしているかどうかによって、処理を分ける関数
IF（論理式の条件,真の処理,偽の処理）

例
平均点が70点以上であれば'合格'、そうでなければ'不合格'となる
IF（F2≧70,'合格','不合格'）

例
平均点が80点以上であれば'〇'、50点以上80点未満であれば'△'、50点未満であれば'×'となる
IF（F2≧80,'〇',IF（F2≧50,'△','×'））
IF（IF≧50,IF（F2≧80,'〇','△'）,'×'）

・関数の応用
例
英語と数学の得点が、両方とも80点以上であれば'合格'、そうでなければ'不合格'となる
IF（論理積（B2≧80,C2≧80）,'合格','不合格'）

例
英語と数学の得点のうち、どちらかが80点以上なら'合格'、そうでなければ'不合格'となる
IF（論理和（B2≧80,C2≧80）,'合格','不合格'）

・マクロ機能
表計算ソフトの複数の操作を記憶して、自動的に一連の操作を実行できる機能

・クロス集計
様々な項目を組み合わせて集計すること

・ピボットテーブル
クロス集計の項目を簡単に切り替えられるデータ分析ツール
Laravelのジョブとキューを使った非同期処理の実装方法


# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です！
今回はLaravelのジョブとキューを使った非同期処理の実装について記事を書いてみました！
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです！

# 概要
Laravelはジョブとキューを利用することで、非同期処理を簡単に実装することができます。このガイドでは、ジョブとキューの基本的な概念から、具体的な実装方法、そして実際のサンプルコードまでを紹介します。

# ジョブとキューの概要
ジョブとキューは、バックグラウンドで実行する処理を管理するための仕組みです。ジョブは特定のタスクを定義するクラスであり、キューはこれらのジョブを順次実行するための仕組みです。

# ジョブ (Job): 実行するタスクを定義するクラス。
キュー (Queue): ジョブを管理し、バックグラウンドで実行するためのシステム。
非同期処理を利用することで、ウェブアプリケーションのレスポンスを高速化し、ユーザー体験を向上させることができます。

# Laravelプロジェクトのセットアップ
まず、Laravelプロジェクトを新規に作成します。

``` bash
composer create-project --prefer-dist laravel/laravel queue-example
cd queue-example
```

次に、データベースの接続設定を.envファイルに記載します。

``` env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=queue_example
DB_USERNAME=root
DB_PASSWORD=
```

# ジョブの作成
ジョブを作成するには、make:jobコマンドを使用します。

``` bash
php artisan make:job ExampleJob
```

作成されたapp/Jobs/ExampleJob.phpを開き、handleメソッドに実行したいタスクを記述します。

``` php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ExampleJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
        // コンストラクタで必要なデータを渡すことができます
    }

    public function handle()
    {
        // ジョブの具体的な処理をここに記述します
        \Log::info('ExampleJob is being processed');
    }
}

```

# キューの設定
次に、キューの設定を行います。Laravelは複数のキュー接続をサポートしていますが、ここではデフォルトのデータベースキューを使用します。

まず、キューのテーブルをマイグレーションします。

``` bash
php artisan queue:table
php artisan migrate
```

次に、.envファイルでキューの接続設定を行います。

``` env
QUEUE_CONNECTION=database
```

# キューの使用例
ジョブをキューに投入する方法は以下の通りです。例えば、コントローラーからジョブをディスパッチします。

``` php
namespace App\Http\Controllers;

use App\Jobs\ExampleJob;
use Illuminate\Http\Request;

class JobController extends Controller
{
    public function dispatchJob()
    {
        ExampleJob::dispatch();
        return response()->json(['message' => 'Job dispatched']);
    }
}
```

# キューの監視と管理
キューを処理するワーカーを起動するには、以下のコマンドを実行します。

``` bash
php artisan queue:work
```

このコマンドを実行することで、キューに投入されたジョブが順次実行されます。

キューの監視や管理にはhorizonパッケージを利用することもできます。horizonはキューのモニタリングや管理機能を提供します。

``` bash
composer require laravel/horizon
php artisan horizon:install
php artisan migrate
php artisan horizon
```

# 参考URL
- [Laravel公式ドキュメント: ジョブ](https://laravel.com/docs/8.x/queues)
- [Laravel Horizon](https://laravel.com/docs/8.x/horizon)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（68/100）

【68日目】
トピック 7：SAPS/4HANAにおける拡張計画（14/14）

≪問題68≫
アドバンスト計画（PP/DS）で、生産計画実行の結果として考えられるものはどれですか。
（２つ選択）
□製造指図
□計画手配
□納入日程行（分納契約）
□購買発注

≪解答≫
□製造指図
■計画手配
■納入日程行（分納契約）
□購買発注

≪解説≫
◆生産計画によって、既存の所要量を充足するために使用される以下の調達要素が生成されます。
（1）計画手配は、内製の計画の目的で登録されます。この計画手配は、後の段階で製造指図に変換されます。
（2）購買依頼は、外部調達される製品に対して登録されます。この購買依頼は、購買発注に変換する必要があります。
（3）納入日程行（分納契約）も即時に登録することが可能です。
趣味論文読み：SKED: Sketch-guided Text-based 3D Editing

# SKED: Sketch-guided Text-based 3D Editing
ICCV 2023

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/4cf07018-514e-7c9b-f3d2-330b73e8b755.png)

https://sked-paper.github.io/

:::note info
アニメとかメタバースとかいろんな応用例がありそう
:::

### 概要
SKEDは、スケッチとテキストプロンプトを使用して3Dオブジェクトを編集する新しい手法。事前に学習されたNeural Radiance Fields (NeRF)を入力として使用し、複数の視点からのスケッチとテキストプロンプトを組み合わせて局所的かつ意味のある編集を行う。新しい損失関数を提案し、ベースインスタンスの密度と放射性を維持しながら、望ましい編集を生成する。

:::note info
NeRF技術使ったtext & Sketchから3Dモデルを生成する
:::



### 研究の背景
テキストから画像生成モデルの進化により、テキストから3D生成パイプラインが開発されているが、インタラクティブな編集には課題が残る。SKEDは、ユーザーのスケッチをガイドとして使用することで、3Dオブジェクトの編集を直感的かつ効果的に行う方法を提案する。

### 新規性
- **スケッチとテキストの統合**: 2つの異なる視点からのスケッチとテキストプロンプトを使用して3D形状を編集する。
- **新しい損失関数の提案**: 元のNeRFの密度と放射性を維持しながら、追加された部分をスケッチに従って変更する損失関数を導入。
- **反復プロセス**: テキストプロンプトの意味を尊重しつつ、スケッチで指定された領域を編集する反復プロセスを採用。

### 方法
1. **入力準備**: 複数の視点からのスケッチとテキストプロンプトを用意。
2. **スケッチ領域の定義**: スケッチで指定された領域を編集するための粗い3D空間を定義。
3. **詳細編集**: Score Distillation Sampling (SDS)を使用して、テキストプロンプトに基づいた詳細で現実的な編集を行う。

### 実験と応用
- **多様なオブジェクト編集**: さまざまなオブジェクトや形状に対して、スケッチとテキストプロンプトを使用して意味のある編集を行う。
- **漸進的な編集**: NeRFを再構築または生成し、段階的に編集を行うことが可能。
- **定量評価と定性評価**: 提案手法の有効性を定性的および定量的に実証。

### 注目すべき点
- **高い編集忠実度**: 元のオブジェクトの密度と色を維持しながら、スケッチで指定された領域を正確に編集。
- **スケッチの多様性**: ユーザーのスケッチが完全に一致していなくても編集が可能。
- **効率的な学習プロセス**: 単一GPUで短時間で編集を実行可能。

### 結論
SKEDは、スケッチとテキストプロンプトを使用してNeRFを編集する新しい手法。新しい損失関数と反復プロセスを使用することで、高い忠実度と意味のある編集を実現。今後の研究や応用において、3Dオブジェクトの直感的かつ効果的な編集を可能にする重要なステップとなる。
プロンプトの色変更

## 0.概要
プロンプトの色がデフォルトで白だったために，どこからがコマンドなのか非常にわかりづらい！そこで，プロンプトの色を変えることにします！という記事です．

本環境は，mac0Sで，シェルは，zshを使っています．

## 1.現状の把握
プロンプトの書式は次のコマンドで出力できます．
```
% echo $PS1
%n@%m %1~ %# 
```

この文字列を修正することで，プロンプトの文字の色を緑に，ディレクトリの色をマゼンタ色にします．

## 2.対処法
下記のコマンドを入力して下さい．
```
% PS1="%F{green}%n@%m%f %F{magenta}%1~%f %# ”
```
プロンプトの色が変更されたと思います．ただし，これでは，毎回変更する必要が出てくるので，/.zshrcファイルに書き込みましょう．
```
% echo "export PS1="%F{green}%n@%m%f %F{magenta}%1~%f %# "" >> ~/.zshrc
% source ~/.zshrc
```
これで再起動しても問題ありません．

## 3.仮想環境の色も変えよう
仮想環境に入ると，プロンプトの前に仮想環境名が入りますよね．この色が白色だと，やはり見づらいので，変更します．
```
% vim 仮想環境ディレクトリ名/bin/activate
```
上記のファイルを次のように変更します．
```
（変更前）
PS1="(仮想環境名) ${PS1:-}"
    export PS1

（変更後）
PS1=“%F{yellow}(仮想環境名)%f ${PS1:-}"
    export PS1
```
これで，仮想環境名を黄色にすることができました．
ただ，この方法では，それぞれの仮想環境に対して色の変更をする必要があるので，まとめて変更する必要があったら教えて下さい．

## 4.参考
https://qiita.com/syoshika_/items/0211c873475eb0d59e23

https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（67/100）

【67日目】
トピック 7：SAPS/4HANAにおける拡張計画（13/14）

≪問題67≫
アドバンスト計画（PP/DS）のヒューリスティックはどのような目的に使用できますか。
□生産マスタデータでデフォルト値を設定する。
□生産プラントでコストと時間を最適化する。
□品目供給で品目移動を自動化する。
□定義済みオブジェクトに関する計画問題を解決する。

≪解答≫
□生産マスタデータでデフォルト値を設定する。
□生産プラントでコストと時間を最適化する。
□品目供給で品目移動を自動化する。
■定義済みオブジェクトに関する計画問題を解決する。

≪解説≫
◆ヒューリスティックは、選択したオブジェクトを計画するために使用できる計画機能であり、バックグラウンド計画および対話式計画の両方で利用可能で、幅広い計画機能を提供します。
◆ヒューリスティックを使用すると、特定のオブジェクトに対する特定のアルゴリズム（製品、作業、リソース、指図のいずれを計画の焦点としているかによって異なる）に基づいて計画の問題を解決できます。また、独自のユーザー定義のヒューリスティックを使用することも、SAPが提供するヒューリスティックを使用することも可能です。