OmniAICreator/Qiita-1.07M huggingface dataset:
バリデーション後、選択していた画像をプレビューに再表示する方法

# １：コントローラー
ポイント
①画像がアップロードされた際の処理
②バリデーションが通った際に、一時保存した画像のパスをクリアする処理
```/Applications/MAMP/htdocs/Laravel/EXP-alert/app/Http/Controllers/ItemController.php
public function store(Request $request)
{
    ⭐️$imagePath = null;

    // ⭐️①画像がアップロードされた場合
    if ($request->hasFile('image_path')) {
        $imagePath = $request->file('image_path');

        $imageName = time() . '.' . $imagePath->getClientOriginalExtension();

        // `storage/app/public/tmp` に一時保存
        // 'root' => storage_path('app/public'),
        $imagePath->storeAs('tmp', $imageName);

        // セッションに画像のパスを保存
        session(['image_path' => $imageName]);
    }

    // バリデーション
    $validatedData = ItemControllerService::storeItemValidate($request);

    // 保存
    Item::create(ItemControllerService::storeItemRequestData($request, $imagePath, $validatedData));

    // ⭐️②一時保存した画像のパスをクリア
    session()->forget('image_path');

    return to_route('items.index');
}
```

# ２：ビュー
ポイント
①sessionの有無で、「sessionのpath」or「予め決めていた画像」で分岐させる
```/Applications/MAMP/htdocs/Laravel/EXP-alert/resources/views/items/create.blade.php
<div class="relative">
    {{-- プレビュー --}}
    <label for="image_path" class="leading-7 text-sm text-gray-600">選択した画像：</label>
    <img id="imagePreview" class="lg:w-3/6 md:w-4/6 w-4/6 object-cover object-center rounded" 
    ⭐️①src="{{ session('image_path') 
    ? asset('storage/tmp/' . session('image_path')) 
    : asset('storage/items/noImage.jpg') }}" 
    alt="画像プレビュー">
</div>
```


# 補足
ポイント
①コントローラーで扱う「storeAs」は、
「'root' => storage_path('app/public'),」を使用するため、
「storage/app/public/tmp」に保存したい場合は、
コントローラーで「$imagePath->storeAs('tmp', $imageName);」とする必要がある。
```
'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
        'throw' => false,
    ],

    'public' => [
        'driver' => 'local',
        ⭐️①'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
        'throw' => false,
    ],
```
【仮想化技術】WindowsにVMware Workstaion にゲストOSとしてUbuntuを入れてみた後のネットワーク設定について

# 最初に 
テスト環境の作成の為に自宅のWindowsPCに久しぶりにUbuntuを入れてみた時の備忘録です。

クラウド環境やサーバレンタルで基盤環境をレンタルして、サービスを作るのもよいですが自宅のPCにテスト的なLinux環境を用意して便利かと思います。
今回は、ホストOS型のハイパーバイザー環境であるVMware Workstaionを使用してUbuntu環境を作ってみます。いろいろなサイトで新規仮想マシンの作り方は紹介されているのでそちらを参考にしてみてください。


## VMwareにおける仮想ネットワークについて
昔作った時にブリッジ接続で作った記憶があるのですが、今回はNATゲートウェイを使用して仮想環境を作りたいと思います。

下記のQitta記事が非常にネットワーク図がわかりやすく記載されています。

https://qiita.com/flets708/items/1aa6ffe578d7a93a7e7f

**NATゲートウェイ経由のホストOS接続の概要**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/88d4718b-89cf-83ec-878d-7e2421487af2.png)
(参考文献 https://qiita.com/flets708/items/1aa6ffe578d7a93a7e7f)


## ネットワーク設定

今回は、ホストOS側とNAT設定でネットワークの設定をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/78af97e7-8a95-4af4-3a18-9a31b3bb032a.png)

下記のQittaのページを参考にしています。

https://qiita.com/trkrcafeaulate/items/3dfa8d5ec1075848f1e9

Windows側のVMnet8は、IPアドレスは「**192.168.190.1**」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/aa16a478-9f49-fbd6-3159-be6333dee536.png)


Ubuntu側のネットワーク設定をしてみます。
下記のように、IPアドレスとルータのIPを指定します。NATゲートウェイのIPアドレスは、第4オクテットを「２」にするようです「192.168.190.**2**」

```yaml
user@virtual-machine:/etc/netplan$ cat 01-network-manager-all.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 192.168.190.30/24  # 任意の固定IP
      gateway4: 192.168.190.2  # ルーターのIP
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

```


## サーバ側のFirewall設定?
上記の設定で、ホストOS側 ⇔ ゲストOS側でping疎通はできました。
L3のICMPのプロトコルまでは、疎通できるのですがL4より上のレイヤーのプロトコル接続がなぜかできない・・
サーバ側のfirewall設定が原因の事もよくあるので、設定してみましたがだめ・
https://qiita.com/htshozawa/items/e24729a4ab332cb40313


telnetでも22番ポートがつながらない・
```shell-session
user@DESKTOP-C0A2DE7:~$ telnet 192.168.190.30 22
Trying 192.168.190.30...
telnet: Unable to connect to remote host: Connection refused
```

## sshデーモンが立ち上がっていない説
サーバ側でfirewallも問題ないのになぜか外部からssh(22ポート)が接続できない・
一旦サーバ側でsshの設定を確認したところ、sshdのサービスが起動していなかったです。

そしたら、SSHサーバが立ち上がっていないことがわかりました。
下記で確認して、表示されないことを確認
```sh
dpkg -l | grep openssh-server  # (Debian系: Ubuntu, Debian)
```

下記のパッケージ管理でopensshサーバをインストール。
```sh
sudo apt update
sudo apt install -y openssh-server
```

telnetも22番ポートで届くようになりました。
```sh
user@DESKTOP-C0A2DE7:~$ telnet 192.168.190.30 22
Trying 192.168.190.30...
Connected to 192.168.190.30.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
```

## 最後に
無事、UbuntuのゲストOS環境から外部ネットワークに接続することができたのですが
ブラウザからプロキシのエラーで表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/0c62d209-e3b9-c5e3-c9ee-5ac77e310505.png)


調べると、ネットワーク設定からプロキシを「Noproxy」にすると接続できるようになるとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/5935cfe0-2519-f6f8-4452-25e7d74ffb35.png)

無事、youtubeの外部サーバにもブラウザ経由でアクセスすることができました。
めでたしめでたし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381629/b6fd5f72-dff9-d63b-2ae0-b390949be420.png)
nRF Connect SDK v2.9.0に移行したらOTA(DFU)出来なくなったので調査して解決した

# 要約
- [新機能](https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/exploring-the-benefits-of-mcuboots-compressed-image-support)の[MCUboot image compression](https://docs.nordicsemi.com/bundle/ncs-2.9.0/page/nrf/app_dev/bootloaders_dfu/mcuboot_image_compression.html)を試したい！
- nRF Connect SDK v2.9.0に更新したところ、OTA(BluetoothLE経由でのDFU)がエラーで止まってしまう問題が発生した。
- **System Workqueueを使っていた時間のかかる処理を、優先度を下げた別のWorkqueueに移すと正常にDFUできた。**

## 状況
- 「自作App + SDK v2.6.x」では、正常にDFUできる。
- 「自作App + SDK v2.9.0」では、nRF Connect(iOSアプリ)でDFUオプションの「Number of buffers」を3以上にすると最初の数チャンクでDFUが止まる。
- 「自作App + SDK v2.9.0」では、nRF Connect(iOSアプリ)でDFUオプションの「Number of buffers」を2にすると正常にDFUできる。（すごく遅い）
- SDK v2.9.0付属の[サンプルコード](https://github.com/nrfconnect/sdk-nrf/tree/v2.9.0/samples/nrf_compress/mcuboot_update)では、「Number of buffers」が2〜6のいずれの値でも正常にDFUできる。

## 参考情報
SDK v2.6.1からv2.8.0へ移行して似たような問題に遭遇している方を発見

https://devzone.nordicsemi.com/f/nordic-q-a/117284/fota-over-ble-fails-after-upgrade-to-ncs-2-8-0/517997
> It turned out that the issue was that the `adc_read_async` call was being performed from within the timer handler. It seems that timer handlers run in ISR context. When performing the `adc_read_async` from a work item submitted by the timer handler the system freeze vanishes.

## 推定
- 前述の方はタイマハンドラでAD変換を実施すると問題が発生している。
- SDK v2.9.0のサンプルコードは動作するが、自作Appと組み合わせると動作しない。（自作Appには時間のかかる処理があり、SystemWorkqueueで実行している(この処理をコメントアウトすると正常にOTAできる)）
- OTA処理よりも優先度の高いタスクが長時間実行されると、OTA処理がタイムアウトしてしまうのでは？

## 対策
- [Defining and Controlling a Workqueue](https://docs.zephyrproject.org/latest/kernel/services/threads/workqueue.html#defining-and-controlling-a-workqueue)に従って、優先度の低いスレッドで実行するWorkqueueを作って、時間のかかる処理はそのWorkqueueで実行する。
> ```c
> #define MY_STACK_SIZE 512
> #define MY_PRIORITY 5
> 
> K_THREAD_STACK_DEFINE(my_stack_area, MY_STACK_SIZE);
> 
> struct k_work_q my_work_q;
> 
> k_work_queue_init(&my_work_q);
> 
> k_work_queue_start(&my_work_q, my_stack_area,
>                    K_THREAD_STACK_SIZEOF(my_stack_area), MY_PRIORITY,
>                    NULL);
> ```

※時間のかかる処理をSystemWorkqueueで実行するようにしているのであれば`CONFIG_SYSTEM_WORKQUEUE_PRIORITY`でSystemWorkqueueの優先度を下げるだけで良いのかもしれないです。（未検証）

## 動作確認環境
- toolchains v2.9.0
- nRF Connect SDK v2.9.0
VSCodeのCline拡張に無料枠のGeminiAPIを設定した際に429 Too Many Requests

# Clineを試しに使うためにGeminiAPIの無料版を利用

ClineはAIのモデルAPIを色々使えます。OpenAI、Anthropic(Claude）、DeepSeekなど。
ただ、本格的に使う前に、少しお試しで使ってみたい場合、できれば無料でつかってみたいという人もいると思います。

その場合、無料枠のあるGeminiAPIが利用できると思います。少なくとも2025年2月11日時点では、無料枠があります。

また、有償の場合も、OpenAIやAnthropicのAPIよりは安く利用できます。DeepSeekは一番安いのかもしれませんが、会社や個人の判断によっては、避けたい場合もあると思います。もちろん、そんな気にしないという方は、DeepSeekが一番コストを抑えられるので、コストを気にする場合はDeepSeekがよいと思います。


https://note.com/ai_tarou/n/nca2b3a5ac85b

https://ai.google.dev/pricing?hl=ja#2_0flash

# GeminiのAPIキーの取得とClineの設定

タイトルの手順については、以下の記事が参考になると思います。

https://qiita.com/Myrune/items/3407e125e6f752a08c84

https://zenn.dev/ma_ro/articles/49b67565462299

# Clineで無料枠のGemeniAPIのキーを設定するとエラーが発生

Clineを利用したら、ただ検索したり、チャット上でコードを生成するだけに使う人はいないと思います。
やはり、ドキュメントを読み込ませて、ソースコードを作成したり編集したりしたいと思います。

この場合、「Auto-approve」の設定をONにします。
この設定には、更に詳細な項目があります。

最初、「Use MCP servers」以外の項目をONにして、ファイルの作成などを行わせようとしました。
そうすると、以下のようなエラーが発生しました。ちなみに、検索はOKでした。

:::note alert
[GoogleGenerativeAI Error]: Error fetching from https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-002:streamGenerateContent?alt=sse: [429 Too Many Requests] Resource has been exhausted (e.g. check quota)
:::

GeminiAPIのクォータ（制限）をみると全然、制限をこえていなかったです。

上記は、「Use the Browser」をONにしていると発生するようなので、これをOFFにして実行したら、期待通り、設計書をもとにコードを作成することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/c826f2b4-15d2-e03a-5d7a-069325147ebf.png)

以下のようなMarkdownの仕様書に従い、HTMLを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/012afcbb-b243-85ff-90b9-83f90e39760f.png)


上記の処理だと、Geminiのリソース消費も大したことなかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/1ef6eebb-1348-a633-5470-09f5fee33962.png)

同じエラーが出た人の参考になればと思います。
Geminiの無料枠でも、Clineの便利さを体験できると思います。

設計書を記載して、それを指定してコーディングさせる。こういう流れが、コーディングの主流になる気もします。

# おまけ：ワークショップの告知

東京の新宿御苑で、AIを利用したソフトウェア開発のワークショップを知り合いが行います。
対象は、40代以降のシニアフリーランスエンジニアです。

要件定義、設計、コーディング、テストなどの各工程をAIをつかってどのように進めるのかについて、実際にサービスやツールを使って体験します。

https://ai-idea-share.connpass.com/event/342147/
Windows環境でFlutterを始めるときのメモ

# 本記事について

プログラミング初心者の私が、Windows環境でFlutterの開発を進めるうえで必要なツールや手順をまとめた備忘録です。

# 使用するツール

## Slack

チームメンバーとやり取りできるチャットツールです。開発の相談や情報共有に使います。  

## Git Bash  

Flutterアプリなどを動かすときに使うコマンドを入力するツールです。  

## VSCode  

コードを書くためのエディタ（編集ソフト）です。Flutterを快適に開発できる拡張機能もあります。

# Git Bashを使ってFlutterアプリを起動する方法  

Flutter SDKはすでにインストールされている前提で、Git Bashを使ってアプリを起動する方法を説明します。  

### 1. Git Bashを開く

**スタートメニュー** から **Git Bash** を探してクリックします。  

### 2. アプリのフォルダに移動する

Git Bashが開いたら、アプリのフォルダがある場所に移動します。  
以下のコマンドを入力してください。  

```sh
cd フォルダのパス
```

（例）ドキュメントに「my_app」というフォルダがある場合  

```sh
cd ~/Documents/my_app
```

※ `cd` は「フォルダに移動する」コマンドです。  

### 3. アプリを実行する  

以下のコマンドでアプリを起動します。  

```sh
flutter run
```

そうすると、以下のようにどの仮想デバイスで起動するか選択肢が表示されます。

![スクリーンショット 2025-02-11 121006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007822/c4f2129b-8fce-3620-e8bc-1fc4a23c5e4c.png)

Chromeであれば、2を選択します。

これで、ブラウザや接続したスマホにアプリが表示されます！

あとは、以下のコマンドを使って操作します。
r: 変更した内容を画面に反映
R: 画面を初期状態に戻す
q: アプリを終了する

**補足**  
- スマホをパソコンにつなげて実行する場合は、「開発者モード」をオンにしておく必要があります。  
- アプリを止めるときは、Git Bashのウィンドウで **`q`** キーを押すか、**Ctrl + C** を押してください。

これでFlutterアプリを起動できます！ 💡
solana node monitoring

https://docs.anza.xyz/operations/best-practices/monitoring

https://www.validators.app/

https://grafana.com/grafana/dashboards/22575-solana-validator-dashboard/

https://crates.io/crates/solana-metrics

https://github.com/stakeconomy/solanamonitoring

https://github.com/asymmetric-research/solana-exporter

https://www.jito.network/stakenet/history/

https://solanabeach.io/validators
MacでAndroidアプリの開発環境を作るというメモ

X-code、swiftを使ってアプリ開発がしたい！と思っていましたが、
諸事情でAndroidの開発や勉強もしないといけない可能性が出てきました。

いつもMacbookを使っているので
MacでAndroidアプリの開発をする環境を作ってみたので
調べたことをまとめてみようと思います。

MacでAndroidアプリの開発環境を作るには、以下の手順を実行すると良いです。
　

＜Android Studioのインストール＞

Androidアプリ開発には Android Studio が一般的です。以下の手順でインストールできます。
　
①Android Studioの公式サイト にアクセス
https://developer.android.com/studio?hl=ja
 
②Mac用のインストーラーをダウンロード

③ダウンロードした .dmg ファイルを開き、Android Studioをアプリケーションフォルダへ移動

④Android Studioを起動し、初期セットアップを完了


  
＜JDKのインストール＞

Android開発には Java Development Kit (JDK) が必要です。
　
	•	Android Studioにはデフォルトで JDK が含まれていますが、必要に応じて brew でインストールできます。
	•	brew install openjdk@17 などでインストール可能。

①Android SDKの設定
	•	Android Studioを開き、SDK Manager で必要な SDKプラットフォーム や SDKツール をインストール
	•	開発対象のAndroidバージョンを選択

②エミュレーターのセットアップ
	•	AVD Manager で 仮想デバイス（エミュレーター） を作成
	•	実機での開発をしたい場合は、USBデバッグ を有効にしたAndroidデバイスをMacに接続

③プロジェクトの作成
	•	New Project で Empty Activity などを選択
	•	Kotlin または Java を選択し、プロジェクトを作成
	•	コードを書いて、エミュレーターまたは実機で動作確認

まだ環境を作っただけで何のしていないので、これからがんばろうと思います。
オンプレ環境でAPIを構築する際に気をつけたポイント

API（アプリケーションプログラミングインターフェース）は、システム同士をつなぐ重要な役割を果たします。
今回は、オンプレ環境でAPIを構築した際に気をつけたポイントをいくつか紹介します。

# なぜオンプレ環境でAPIを構築したのか？

今回のAPIは、社内のセキュリティポリシー上、外部クラウドへのデータ保存が制限されており、また運用コストを抑えるために既存のサーバーリソースを活用する方針を採りました。そのため、クラウド環境と同等の使い勝手を実現しながら、オンプレ環境での最適なAPI設計を目指しました。

# どんな環境で構築したのか？

以下のようなサーバー構成、運用ツールでAPIを構築しました。

- サーバー構成
  - APIサーバー：Spring Boot（Java）
  - DBサーバー：Oracle Database 19c
- 運用ツール
  - 監視ツール：Prometheus, Grafana
  - CI/CD：GitLab Runner
    （社内のセキュリティポリシー上、GitLabサーバから開発環境・検証環境・本番環境のサーバへのアクセスが制限されていたため、CI/CDではリリースモジュールの作成までを実施）

# API構築時に気をつけたポイント

1. RESTful設計を心がける
API設計を行う際、利用者が実装しやすくなるように適切な設計を心がけました。以下の点を特に重視しています。
    - HTTPメソッドの適切な使用
      APIでは、リソースに対する操作をHTTPメソッドで表現します。
      具体的には、以下のように使い分けました
        - GET: データ取得
        - POST: 新規データ作成
        - PUT: データ更新
        - DELETE: データ削除
    - リソースを明確に定義
      エンドポイントのURLは直感的に理解できるように設計しました。例えば、ユーザー情報のエンドポイントは/user、予約情報のエンドポイントは /reservations といった具合です。
      これにより、API利用者が迷わず利用できるようにしました。
    - ステータスコードを適切に使用
      レスポンスで使用するHTTPステータスコードは、クライアントが結果を正しく理解できるように適切に使用しました。
      例えば：
        - 200: 成功
        - 400: リクエストエラー（例：パラメータ不足）
        - 500: サーバエラー
      詳細なステータスコードは[こちら](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)を参考にしました。

2. 適切なエラーハンドリング
エラーが発生した場合、API利用者が適切に処理できるよう、一貫したエラーハンドリングを行いました。
    - 一貫性のあるエラー形式
    エラーレスポンスは統一された形式で返すことで、開発者が扱いやすくしました。
    以下はエラーレスポンスの例です：
    ```
    {
      "errors": [
        {
          "field": "user_id",
          "code": "E0001"
        },
        {
          "field": "start_date",
          "code": "E0002"
        },
        {
          "field": "end_date",
          "code": "E0002"
        },
        {
          "field": "",
          "code": "E9999"
        }
      ]
    }
    ```

    - エラーメッセージの変更対応
      画面項目の文言が変更された場合、エラーメッセージも更新する必要があります。
      そのため、エラーレスポンスには直接的なメッセージは含めず、エラーコードを中心に構成しました。

3. APIのバージョン管理
APIのメンテナンス中に後方互換性を保つため、バージョン管理が重要です。
新しいバージョンをリリースしても、既存のユーザーに影響を与えないようにしました。
    - バージョン番号をURLに追加
    APIのURLにバージョン番号を含めることで、バージョン間の差異を明確にし、クライアントが新しいバージョンに切り替える際の混乱を避けました。
    例えば、/v1/reservations、/v2/reservations といった形で実装しました。

4. ドキュメンテーションを整備する
    API利用者がスムーズに使えるよう、以下の内容をドキュメントに盛り込みました：
    - API利用ガイド
    ユースケースごとにAPIの呼び出し手順や流れを説明しました。
    これにより、利用者はどのAPIを使うべきかを簡単に理解できます。
    - API仕様書
    APIの詳細な仕様書を作成しました
        - エンドポイント: HTTPメソッドとURLを記載（例：POST /v2/reservations）
        - API概要: 各APIが提供する機能を簡潔に説明
        - リクエスト: 必須フィールドやフィールドの説明、エラーコードのリスト
        - エラー一覧: エラーコードとその説明
        - 使用例: 各エンドポイントのリクエストとレスポンスの例を記載
    
    これにより、API利用者がすぐに使えるようになりました。

5. ログを追跡できるようにする
ユーザーからの問い合わせに迅速に対応できるよう、ログの追跡機能を実装しました。
これにより、問題が発生した場合でも迅速に原因を特定できます。

    - トレースIDをログに出力
    アクセスログ、アプリケーションログ、エラーログにトレースIDを含めることで、リクエストがどのコンポーネントを通過したかを追跡できるようにしました。
    - 問い合わせ番号としてトレースIDを使用
    レスポンスヘッダにトレースIDを返却することで、ユーザーからの問い合わせにトレースIDを使用して問題解決を迅速化しました。
    これにより、問い合わせ番号としてトレースIDが利用できるようになりました。

    （参考: [AWS X-Ray ドキュメント](https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/aws-xray.html)）

# まとめ

オンプレ環境でAPIを構築する際は、システムが健全に動作し、ユーザーが簡単に使えるように設計することが大切です。
RESTfulな設計を心がけ、適切なエラーハンドリングやバージョン管理、詳細なドキュメントの整備を行うことで、API利用者の利便性が大きく向上します。
また、ログの追跡機能を充実させることで、問題解決の迅速化を実現できました。

これらのポイントを抑えてAPIを構築することで、システムの信頼性と保守性を高めることができました。
ServiceNowのCreated(sys_created_on)に任意の時間を設定する

Version: WasigntonDC

::::note info
試したのはCreated(sys_created_on)だけですが同じ手段で他のSystem Field(sys_created_by, sys_updated_on, sys_updated_by)にも値は入れられるのではと思います
::::
# 動機
100日前に作成されたユーザーをinActiveにするといった処理をテストするとして

ユーザーテーブルの作成日(sys_user.sys_created_on)に100日前(任意)の時間を入れられないかと考えました

# 作ったもの

ここのCommunityのScriptを

[Can i update sys_created_on field value ]
https://www.servicenow.com/community/developer-forum/can-i-update-sys-created-on-field-value/td-p/1380126

少し修正して以下にしましたATFのStepなどで汎用的に使えるように実行した時間の100日前の値を設定するようにしていますupdate()は事故防止でコメントにしていますので必要に応じて外して使ってください肝はupdate()の行の上2つの行で自動でSystem Fieldに値が設定されないようにしてその他のBusiness Ruleが動かない設定にしています

```
var gdt = new GlideDateTime();
gdt.addDays(-100); // 100 days ago !!!!
gs.info("******** Let's get party started!!! " + gdt.getDate());

var gr = new GlideRecord("sys_user");
gr.addQuery('user_nameLIKEマグロ');
gr.query();
while (gr.next()){
  gs.info(gr.name + " before:" +  gr.sys_created_on);
  gr.sys_created_on = gdt;
  gr.autoSysFields(false); // Do not update sys_updated_by, sys_updated_on, sys_mod_count, sys_created_by, and sys_created_on
  gr.setWorkflow(false); // Do not run any other business rules
//  gr.update(); // ******** if u need, uncomment ********
  gs.info(gr.name + " after:" +  gr.sys_created_on);
}
```

# 実行結果

Scripts - Backgroundで上記Scriptを実行します

User IDにマグロを含むユーザー7人のCreatedを

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/2249ee61-530f-0cf6-37ac-38580e2d3b3e.png)

100日前にしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/17bd981f-0252-626e-3651-42eb3934765c.png)

# XMLのExport/Importでもできた

更新対象のユーザーのレコードをXMLでExportしてテキストエディタでsys_created_onの値を編集してImportしても出来ました毎回決まった時間に戻したいときはXMLを使ってもいいかもです
ゲームプログラミングコード整理術

複雑になりがちなゲーム開発におけるソースコード。この記事では、ゲーム開発でどんなことを意識すればきれいに書けるのかをまとめている。

1.ECS(Entity Component System)
・オブジェクト指向のクラス継承の問題（肥大化・依存関係の強化）を解決するための設計。
・エンティティ（Entity） に コンポーネント（Component） を追加する形で機能を拡張。
・データと処理を分離 することで、パフォーマンスと柔軟性を向上させる。
（TODO：まだよくわかっていないので、今後Updateする）
2.State Pattern
・キャラクターの動作（歩く・ジャンプ・攻撃など）を状態ごとに分ける設計。
・if や switch で大量の条件分岐を書くより、状態ごとにクラスを分けることで可読性を向上
3.Magic Number をなくす
4.早期リターン
if文がネストされる場合、順番を入れ替えて、
if (state) {return;}
を活用することで見やすくなる。
5.コルーチン
TODO：まだよくわかっていないのでのちにUpdateする。
個人的備忘録：環境変数を一元管理できる .env ファイルを実際に使って簡単なハンズオンをしてみた

## はじめに

アプリケーションを開発する際、環境ごとに異なる設定を管理する方法が必要になります。特に、データベースの接続情報や API キーなどの機密情報を安全に扱うことは重要です。  

:::note info
そのために便利なのが `.env` ファイルです。`.env` を使えば、環境変数を一元管理でき、開発や運用がスムーズになります。
:::

今回は、実際に `.env` ファイルを作成し、Python、Node.js、Docker でどのように活用できるのかを試してみます。

## 書こうと思ったきっかけ

プロジェクトを進める中で、環境ごとの設定を管理する方法に悩むことがありました。  

開発環境、本番環境で異なる設定を適用する際に、直接コード内に設定を書き込むと、管理が煩雑になり、誤って機密情報を Git にコミットしてしまうリスクもあります。  

そんな中、`.env` ファイルを活用すると、設定を分かりやすく整理し、安全に管理できると知り、実際に試してみることにしました。

## `.env`ファイルを実際に使ってみた

### 1. `.env` ファイルを作成

まずは、プロジェクトのルートディレクトリに `.env` ファイルを作成します。

```sh
vi .env
```

中身を編集して、環境変数を定義します。

```sh
DATABASE_URL=mysql://user:password@localhost:3306/db_name
SECRET_KEY=mysecret
DEBUG=True
```

### 2. Python で環境変数を読み込む
`.env` ファイルを Python で読み込むには、`python-dotenv` をインストールします。

```sh
pip install python-dotenv
```

次に、スクリプトを作成して環境変数を取得します。

```py
from dotenv import load_dotenv
import os

load_dotenv()  # .env を読み込む

db_url = os.getenv("DATABASE_URL")
secret_key = os.getenv("SECRET_KEY")
debug = os.getenv("DEBUG")

print(f"DB URL: {db_url}")
print(f"Secret Key: {secret_key}")
print(f"Debug Mode: {debug}")
```

実行すると、`.env` の値が出力されます。

```sh
python test.py
```

**実際の実行画面**

![Screenshot 2025-02-11 at 11.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9f1df274-0c9f-936e-82c1-771ed932ecd9.png)

## まとめ

`.env` ファイルを導入することで、環境変数の管理が簡単になり、開発やデプロイの負担を減らすことができました。  

:::note info
特に、環境ごとに `.env` ファイルを切り替えたり、`.gitignore` に `.env` を追加してセキュリティを強化することで、より安全に運用できると感じました。
:::

また、Python や Node.js ではライブラリを使うだけで簡単に `.env` を読み込めるため、導入もスムーズです。  

プロジェクトで環境ごとの設定を整理したい場合は、ぜひ `.env` を活用してみてください！
【GitHub】ローカルで作成したプロジェクトをリモートリポジトリにプッシュする


##  環境
- **Git**：インストール済み
- **GitHubアカウント**：作成済み
- **VSCode（任意）**：ターミナルからGitを操作する場合に便利


## 手順

**1. GitHub上にリモートリポジトリを作成**
**2. ローカルリポジトリを作成**
プロジェクトのディレクトリに移動して、Gitを初期化します。
(VsCodeでそのフォルダを開いてターミナルから実行するでも可)
```
git init
```

**3. リポジトリURLをGitHubからコピーし、以下のコマンドを実行**

```
git remote add origin リポジトリURL
```

**4. コミット・プッシュができるようになるので、初回コミットして終了**
🚀 Google Apps Script（GAS）でスプレッドシートのデータをJSON化するカスタム関数を作成

## 📝 概要
Google スプレッドシート上で **指定した範囲のデータを JSON に変換** するカスタム関数を作成します！  
例えば、以下のような表を **JSON 文字列** に変換できます。

| A列 (キー) | B列 (値) |
|------------|------------|
| 名前 | 山田 |
| 年齢 | 30 |
| 性別 | 男性 |
| 出身地 | `#N/A` (エラー) |
| 職業 | エンジニア |

👇 これをスプレッドシートの **セル関数** で一発変換！

```json
{"名前":"山田","年齢":30,"性別":"男性","出身地":"エラー","職業":"エンジニア"}
```

これにより、スプレッドシートで管理しているデータを **API や Web アプリで使いやすい形** に整形できます。

---

## 🎯 実装する関数の仕様
- `=convertToJSON(A1:A5, B1:B5)`
  - **範囲A（キー）** → JSON の「キー」になる  
  - **範囲B（値）** → JSON の「値」になる
  - **エラー値（`#N/A` など）** → `"エラー"` に変換
  - **JSON 文字列 (`JSON.stringify`)** を返す
  - **キーが空の場合は無視する**

---

## 💻 Google Apps Script（GAS）のコード
Google スプレッドシートの **スクリプトエディタ** に以下のコードを貼り付けてください。

### **📌 コード**
```javascript
function convertToJSON(keysRange, valuesRange) {
  try {
    // キーと値の配列を取得
    var keys = keysRange.flat();    // 二次元配列を一次元に変換
    var values = valuesRange.flat();
    
    // JSON オブジェクト作成
    var jsonObject = {};
    
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      var value = values[i];

      if (key !== "" && key !== null && key !== undefined) { // 空キーは無視
        if (typeof value === "object" && value !== null) {  // エラー処理
          jsonObject[key] = "エラー";
        } else {
          jsonObject[key] = value;
        }
      }
    }
    
    // JSON 文字列として返す
    return JSON.stringify(jsonObject);
  } catch (e) {
    return "エラー: " + e.message;
  }
}
```

---

## 🛠 使い方
1. **スプレッドシートを開く**
2. **「拡張機能」 > 「Apps Script」** を開く
3. **スクリプトエディタに上記コードを貼り付け**
4. スプレッドシートで関数を実行！  
   `=convertToJSON(A1:A5, B1:B5)`

---

## ✅ 実行例
### **📌 入力**
| A列 (キー) | B列 (値) |
|------------|------------|
| 名前 | 山田 |
| 年齢 | 30 |
| 性別 | 男性 |
| 出身地 | `#N/A` (エラー) |
| 職業 | エンジニア |

### **📌 出力**
```json
{"名前":"山田","年齢":30,"性別":"男性","出身地":"エラー","職業":"エンジニア"}
```

### **📌 ポイント**
- キーが空のセルは **スキップ**
- エラー (`#N/A`, `#DIV/0!` など) は `"エラー"` に変換
- そのまま JSON API で使えるフォーマット

---

## 🎉 まとめ
✅ **Google スプレッドシート + GAS で JSON を簡単に生成！**  
✅ **セル関数で JSON に変換できるので、誰でも使いやすい！**  
✅ **エラー処理付きで安全に動作！**  

この関数を使えば、スプレッドシートで管理しているデータを **JSON として扱いやすくなります** 🚀  
データの整形や API 連携にも役立つので、ぜひ試してみてください！ 💡

---

### **📢 参考**
- [Google Apps Script 公式ドキュメント](https://developers.google.com/apps-script/)  
- [Google スプレッドシート 関数一覧](https://support.google.com/docs/table/25273?hl=ja)
【Rails】`Date.today`、`Date.current`、`Date.tomorrow`、`Date.yesterday`の実行結果の違いについて

Railsでは日付を扱う際に、`Date.today`、`Date.current`、`Date.tomorrow`、`Date.yesterday`といったメソッドを使用できます。それぞれの違いを理解していないと、タイムゾーンの違いや意図しない挙動に悩まされることがあります。

この記事では、これらのメソッドの違いについてまとめます。

## 1. `Date.today`

```ruby
Date.today
```

- **戻り値**: `2025-02-04`（現在の日付）
- **基準タイムゾーン**: サーバーのシステムタイムゾーン
- **詳細**:
  - Rubyのメソッド。
  - `Date.today`は、サーバーのシステム時刻を基に現在の日付を返します。
  - Railsの`config.time_zone`の設定とは無関係であり、デフォルトのタイムゾーンを考慮しません。
  - タイムゾーンの影響を受ける環境では、期待と異なる日付が返る可能性があります。

## 2. `Date.current`

```ruby
Date.current
```

- **戻り値**: `2025-02-04`（現在の日付）
- **基準タイムゾーン**: Railsの`config.time_zone`で設定されたアプリのタイムゾーン
- **詳細**:
  - `Date.current`は、Railsアプリのタイムゾーン設定を考慮した上で現在の日付を取得します。
  - `config.time_zone = 'Asia/Tokyo'` の場合、東京時間での今日の日付が取得されます。
  - Railsアプリケーション内で使用する場合は、`Date.today`よりも`Date.current`を使用する方が適切です。

## 3. `Date.tomorrow`

```ruby
Date.tomorrow
```

- **戻り値**: `2025-02-05`（明日の日付）
- **基準タイムゾーン**: Railsの`config.time_zone`の設定を考慮
- **詳細**:
  - `Date.tomorrow`は、Railsのタイムゾーン設定に基づき、現在の日付の翌日を取得します。
  - `Date.current + 1.day` と同じ動作をします。

```ruby
Date.current + 1.day == Date.tomorrow  # => true
```

- **注意点**:
  - `Date.today + 1` とは異なり、Railsのタイムゾーンを考慮するため、アプリの設定に沿った正確な日付が得られます。

## 4. `Date.yesterday`

```ruby
Date.yesterday
```

- **戻り値**: `2025-02-03`（昨日の日付）
- **基準タイムゾーン**: Railsの`config.time_zone`の設定を考慮
- **詳細**:
  - `Date.yesterday`は、Railsのタイムゾーン設定を考慮し、現在の日付の前日を取得します。
  - `Date.current - 1.day` と同じ動作をします。

```ruby
Date.current - 1.day == Date.yesterday  # => true
```

## まとめ

| メソッド          | 戻り値の例       | タイムゾーンの考慮 | 備考 |
|------------------|----------------|------------------|------|
| `Date.today`     | `2025-02-04`    | なし（システム依存） | システムのローカルタイムで今日の日付を取得 |
| `Date.current`   | `2025-02-04`    | あり（Railsの設定） | Railsの`config.time_zone`を考慮した今日の日付 |
| `Date.tomorrow`  | `2025-02-05`    | あり（Railsの設定） | `Date.current + 1.day`と同じ |
| `Date.yesterday` | `2025-02-03`    | あり（Railsの設定） | `Date.current - 1.day`と同じ |

Railsアプリケーション内では、`Date.today`の代わりに`Date.current`を使うことで、Railsのタイムゾーン設定に沿った正しい日付を取得できます。

## 参考
https://qiita.com/YumaInaura/items/b7f938f3b2ae1b4b9bd0
【VRChat】+Headアバターを少年化する

![スクリーンショット 2025-02-11 午前10.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/6ff9889d-e2ae-55c0-50b4-4cecba2dd728.png)

# はじめに

+Headアバターを少年化するための手順を説明します。マニュアルで全て操作する必要があります。大変ですが頑張ってやるか、何かしらツールを作ってみたいものですね。

:::note warn
FBXのImport SettingsでRigを編集する必要があります。

**Unityのプロジェクトを完全に分離して作業を行なってください。**
:::

# 手順

## 概要

### 0. Unityプロジェクトを分離・バックアップする。

今回は **アバターのFBXに破壊的な変更を加えます。必ずUnityプロジェクトを分離またはバックアップしてください。**

### 1. アーマチュアのトランスフォームを編集する。

ボーンのトランスフォームを一つずつ、下記 `ボーンの差分リスト`セクションのポジションの差分値を足し、スケール値を適用してください。

**ここで、お好みで調整した際は、その調整差分値をメモしておいてください**
   
![スクリーンショット 2025-02-11 午前10.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/c451b97a-157b-213f-c7b4-5f6ca40c8fc7.png)

### 2. リグを編集する

ヒューマノイドボーンのポジションの値を編集したため、VRChatに持っていった時にアニメーションの設定がおかしくなってっしまいます。そのためFBXのリグにも調整した値を適用します。

+HeadアバターのFBXの Import Settingsから、`Rig`タブを開き、 `Configure`を押してHumanoidボーンのトランスフォームを編集します。
![スクリーンショット 2025-02-11 午前10.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/bb801e5f-b662-78fe-884c-dfd761f0b435.png)

アーマチュアのボーンと全く同じトランスフォームを入力してください。

![スクリーンショット 2025-02-11 午前10.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/00eff3dc-6995-756c-96a9-0039f6a1b54e.png)
   


### 3. View Positionを調整する。

このままではVRChat上での視点の位置が更新されていないため、 `VRC Avaar Descriptor`から  `View Position`を適当な位置に配置します。眉間のあたりにすると良いでしょう。

![スクリーンショット 2025-02-11 午前10.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/574c675c-d769-8a15-8192-370457b20f6b.png)

### 4. 衣装を調整し、VRChatにアップロードする。

Armatureを大きくいじったため、既存の服や身体のメッシュが貫通してしまう場合があります。
適宜Blend Shapeを調整してください。

そして、VRChatにアップロードすれば完了です。

### +Headの対応衣装について

同様の手順でアーマチュアのボーントランスフォームを編集すれば基本は着れます。
衣服はRigの設定がいらないので比較的楽でしょう。

## ボーンの差分リスト
:::note info
あくまで私好みのものとなりますので、ご自身で調整ください。
:::
:::note warn
**今から提示するボーンの順序に従って値を編集してください！**
アーマチュアは木構造になっているため、先に枝葉を編集すると意図しない結果となる場合があります。
:::


### Hips

pos z:
```
-0.19000
```
scale:
```
0.95581
```

### Spine
pos y:
```
-0.0151
```
pos z:
```
-0.00200
```
scale:
```
0.90000
```

### Chest

pos y:
```
+0.00834
```

### UpperChest
pos y:
```
+0.00775
```

### Head
pos y:
```
+0.00790
```
scale:
```
1.22222
```

### Shoulder L
pos x:
```
+0.00851
```
pos y:
```
+0.01205
```
pos z:
```
-0.00024
```

scale:
```
0.90197
```

### Upper Arm L
pos y:
```
+0.01915
```
scale:
```
1.16655
```

### Lower Arm L
scale:
```
0.94697
```

### Shoulder R
pos x:
```
-0.00851
```
pos y:
```
+0.01205
```
pos z:
```
-0.00024
```
scale:
```
0.90197
```
### Upper & Lower Arm R

Lと同様に編集します。

### Upper Leg L
pos y:
```
+0.01389
```
scale:
```
0.91349
```

### Lower Leg L
pos y:
```
-0.04
```

### Upper & Lower Leg R

Lと同様に編集します。

# 謝辞

今回は アバターサンプルに [VERMILION.Studio](https://kv2.booth.pm/)様の [【 ガルッピ 】オリジナル3Dモデル [Melody of the Mana]](https://booth.pm/ja/items/5230685)を使用させていただきました。

また、少年の身体の形状は[Xelevia_Industry](https://xelevia.booth.pm)様の、[オリジナル3Dモデル『ルナト』](https://xelevia.booth.pm/items/4284866)を参考にさせていただきました。

誠にありがとうございました。 :bow:
古いmacbookにUbuntuをインストールし再利用する

<h1>はじめに</h1>
どうも皆さん、こんにちは。
私はMacBookが好きでメインの端末として利用しています。
その中で定期的にマシンの更新をしているのですが、過去のマシンが余ってしまいもったいなかったので再利用の一環としてUbuntuをインストールした際の備忘録を残しておきます。

この記事の中では
```
$ <- 一般ユーザー
# <- ルートユーザー
```
になります

<h1>検証環境</H1>
今回のマシンのスペックは下記のようです。<br>
Apple Macbook pro Early 2011<br>
cpu : intel core i5 2415M<br>
mem : 16gb<br>
ssd : 256GB
OS  : Ubuntu 24.04LTS
<h1>まずはおまじない</h1>
Ubuntuのインストールはいろんな方がイントールされているのでその記事を参考にしてください。<br>
私はインストール後からのお話を書きます。<br>
インストール時に行ったこととしては、あえてLANに接続せずインストールしました<br>
こうすることでHomeディレクトリなどが日本語化されずに英語のままになります。

さて、まずはいつものおまじないということで本体のアップデートを行います。

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install vim
```
大体いつもトラブルになる前、おまじないとしてやっておきます。

<h1>日本語入力環境の構築</h1>
多くの方は日本語環境構築の前にWaylandからXorgへ切り替えてますが私はWaylandのままで動くのでそのままにします。
<br>
<h4>キーボード配列の変更</h4>

```
$sudo dpkg-reconfigure keyboard-configuration
```
選択肢の中から
>Apple Aluminium（JIS）> Japanese > Japanese > 切り替えなし >
>一時切り替えなし > キーボード配置のデフォルト > コンポーズキーなし >いいえ
の順番で選択する

<h3>重要！ここで必ず再起動してください</h3>



今回はFcitxではなくFcitx5をインプットメソッドにします。


```
$sudo apt install fcitx5-mozc
```
インストールできたらfcitx5の設定を開きます。

![Screenshot from 2025-02-11 10-18-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373257/2781c2c7-327d-27ed-5e37-6d9e72256129.png)
<br>
設定画面の中から「グローバルオプション」のタブを開来ます。
![Screenshot from 2025-02-11 10-18-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373257/ad24ee9d-2fe4-bcc3-a9b5-b42956d4487a.png)

ホットキーの中から入力メソッドの切り替えを「Control+スペース」以外を「ー」を押して消します。

「入力メソッドを有効にする」の右側のアイコンを二回クリックしてキーボードの「かな」をクリックして「ハングル」に変わったことを確認します。<br>
「入力メソッドをオフにする」の右側のアイコンを二回クリックして「英数」のキーを押して「ハングルHanja」に変わったことを確認します。

<h1>command＋Cでコピーできるようにする</h1>
今のままでも日本語入力として問題ないんですがコピペなどを普段のMacに少し近づけます。

tweaksのインストール

```
$sudo apt install gnome-tweaks
```

起動したらtweaksを起動します。
すると下の画像のような画面が出るので「Keyboard」をクリック

![Screenshot from 2025-02-11 10-47-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373257/f626cb9d-858a-1232-ac16-09c245273e4c.png)

画面が切り替わるので「Addtional Layout Options」を押す

![Screenshot from 2025-02-11 10-47-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373257/a532a594-c5a0-2f3e-6e6f-45f00c83057b.png)

別ウィンドウが立ち上がるのでドロップダウンリストの中から「Alt and Win behaviaor」をクリック。

![Screenshot from 2025-02-11 10-47-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373257/30a77e2d-3696-2bd1-3e70-a91248be0b4c.png)

「Default」から「Ctrl is mapped to Win and the usual Ctrl」に切り替えてtweeks閉じる。

<h1>終わりに</h1>
ここまでで、とりあえず日本語入力とCommandキーでのコピペなどができるようになりました。
まだ、Facetimeカメラなどの設定はありますが今回はここまで
気が向いたら続きを書きます。
【初心者向け】Laravelでよく使うコマンドをまとめてみた

## 勉強内容をまとめてました！

初心者だからか、
「あのコマンドってどんな感じで書けばいいんだっけ...」となることが頻繁にあるので、
個人的にまとめてみました。

勉強するたびに更新していく予定です！

## コマンド一覧

### PHPのバージョンを確認

``` 
php -v
```

### Composerのバージョン確認

```
composer -V
```
- composer create-project
composer（PHPのパッケージ管理ツール）を使って、新しい Laravel プロジェクトを作成するコマンド。
- laravel/laravel=9.*
Laravel 9.x の最新バージョンを指定してインストール。

### プロジェクト作成

```
composer create-project "laravel/laravel=9.*" プロジェクト名
```

### 現在インストールされている Laravel のバージョンを確認

```
php artisan -V
```

### モデルとマイグレーションを作成

```
php artisan make:model モデル名 -m
```
Eloquent モデル と マイグレーションファイル を同時に作成するためのコマンド

### マイグレーションを実行

```
php artisan migrate
```
### シーダーを作成
```
php artisan make:seeder シーダー名
```
シーダーは、ダミーデータや必要になる基礎データなどをまとめて作成することができるもの

### シーダーを実行してデータを作成
```
php artisan db:seed --class=シーダーm
```
visual studio 2022でVSLink.classが使えない

※独学でプログラムを始めたばかりなので間違っている可能性があります※



JRAから提供されているデータ取得のためのAPI的なものであるJVLinkを使おうとVisualStudio2022で始めて見たが、ツールボックスアイテムにJVLink.classが表示されない



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007790/2a8736c7-ca23-76e6-a4f7-8d71ed88e112.png)
↑本来はこれが表示されているはず




調べたところVisualStudio2022は64ビット版しかないので、JVLink.classが使えない。

VisualStudio2019以前のものがいるがMicrosoft公式ではダウンロードできず困った。




いろいろ探したところ下記のサイトでダウンロードができるようだ。

https://www.techspot.com/downloads/7241-visual-studio-2019.html

いったん解決
JavaScript基本まとめ（制御構文）

### 制御構文
文法が頭に入っていない時の覚書にご利用ください。だいたいの構文の覚書になっています。各解説はまたいずれまとめたいと思います
- 条件分岐
```js
// if文
if (条件) {
    // 条件が true の時に実行
} else if (別の条件) {
    // 最初の条件が false で、別の条件が true の時に実行
} else {
    // どの条件も false の時に実行
}

// switch文
switch (値) {
    case 値1:
        // 値が値1の時に実行
        break;
    case 値2:
        // 値が値2の時に実行
        break;
    default:
        // どのcaseにも当てはまらない時に実行
}
```

### ループ
```js
// for文
for (let i = 0; i < 5; i++) {
    // 5回繰り返し実行
}

// while文
while (条件) {
    // 条件が true の間、繰り返し実行
}

// do-while文
do {
    // 最低1回は実行され、その後条件が true の間繰り返し実行
} while (条件);

// for...of文（配列やイテラブルオブジェクトの要素に対して繰り返し）
const array = [1, 2, 3];
for (const element of array) {
    console.log(element);
}

// for...in文（オブジェクトのプロパティに対して繰り返し）
const obj = { a: 1, b: 2 };
for (const key in obj) {
    console.log(key, obj[key]);
}
```

### 関数宣言
```js
// 通常の関数宣言
function greet(name) {
    return `Hello, ${name}!`;
}

// アロー関数
const greetArrow = (name) => {
    return `Hello, ${name}!`;
};

// 省略記法（1行の場合）
const greetShort = name => `Hello, ${name}!`;
```

### コールバック関数
```js
function doSomething(callback) {
    // 処理
    callback();
}

// 使用例
doSomething(() => {
    console.log("コールバック実行");
});
```

### オブジェクト
```js
// オブジェクトの作成
const person = {
    name: "山田太郎",
    age: 30,
    greet() {
        return `私は${this.name}です`;
    }
};

// 通常のプロパティアクセス
console.log(person.name);      // "山田太郎"
console.log(person["name"]);   // "山田太郎"

// 分割代入
const { name, age } = person;  // オブジェクトのプロパティを個別の変数として取り出す
console.log(name);  // "山田太郎"
console.log(age);   // 30

// 分割代入で別名をつける場合
const { name: fullName, age: personAge } = person;
console.log(fullName);   // "山田太郎"
console.log(personAge);  // 30

// 配列の分割代入
const numbers = [1, 2, 3];
const [first, second] = numbers;
console.log(first);   // 1
console.log(second);  // 2

// 関数の引数での分割代入
function printUserInfo({ name, age }) {
    console.log(`${name}さんは${age}歳です`);
}
printUserInfo(person);  // "山田太郎さんは30歳です"
```

### 配列
```js
// 配列の作成
const fruits = ["りんご", "バナナ", "オレンジ"];

// 配列操作
fruits.push("ぶどう");     // 末尾に追加
fruits.pop();              // 末尾から削除
fruits.unshift("いちご");  // 先頭に追加
fruits.shift();           // 先頭から削除

// 配列のメソッド
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num => num * 2);    // 各要素を2倍
const evenNumbers = numbers.filter(num => num % 2 === 0);  // 偶数のみ抽出
const hasThree = numbers.includes(3);  // 要素の存在確認: true
const firstBigNumber = numbers.find(num => num > 3);  // 最初の該当要素: 4
```

### 例外処理
```js
try {
    // エラーが発生する可能性のあるコード
    throw new Error("エラーが発生しました");
} catch (error) {
    // エラー処理
    console.error(error.message);
} finally {
    // 必ず実行される処理
}
```
NEXT.js+Auth.jsでユーザー情報を更新時にsessionのユーザー情報も更新する

NEXT.js+Auth.jsでwebアプリを作っていて
ユーザー情報を更新し時に、sessionのuserの情報も更新する処理を実装するのに
なかなか答えに辿りつけず困ったので備忘録を書き残します。

## 前提条件
私は、Credentialでのログイン方式を採用していたので、
それ以外の方式では参考にならないかもしれません。

## auth.tsにsessionが更新された時の処理を加える
callbacksに、次の処理を加えてください

```typescript:auth.ts
 callbacks: {

    async session({ session, token }) {
      //他の処理//
    
        //sessionの更新処理
        //バックエンドからユーザー情報を取得する関数(プロジェクトに応じて書き換えてください)
        const userDBPromise = fetchUser();
        const userDB = await userDBPromise;
        //DBの最新の情報に上書き
        session.user = { ...session.user, ...userDB };
      
      return session
    },
},
```
## sessinoの更新

```typescript:page.tsx

import { useSession } from "next-auth/react";

export default function MyProfileUpadate() {

    //session更新のためupdateを呼び出し
    const {data:session,update} = useSession();

    async function onSubmit(){
        //ユーザー情報を更新する処理
        const res = update();
        if(res){
            //ここでupdateを実行するとsessionのuser情報が更新されます
            update();
        }
    }
    
    return(
        <form>
            //省略
            <button onClick={onSubmit()}>更新<button>
        <form>
    )
}
```

以上です。
ワークフロー改善におけるPowerShellの活用(初心者向け生成AI活用環境としてのObsidianの利用のススメ)

## はじめに
生成AIを活用する際の初心者向けプラットフォームとして、Obsidianを選択しました。CursorやVSCodeと比較した結果、Obsidianが最適であると判断しています。特に、Obsidian Web Clipperを使用することで、生成AIで要約した情報を簡単に取り込むことができます。また、Markmap記法を用いたマインドマップ表示や、Gemini Chat/Gemini Scribeを活用することで、生成AIと対話しながらコードの生成や修正が可能になります。さらに、Marpスライド（.mdファイル）を生成し、Canvaで作成した図解やストック写真を埋め込むこともできます。

## スクリプトの目的
今回のスクリプトは、Obsidian Web Clipperによって生成されるファイル名を指定された形式に変更することを目的としています。このようなツールは今後も作成する予定があるため、知見としてまとめておくことが重要です。

## スクリプトの概要
以下は、Markdownファイルのファイル名を指定された形式に変更するPowerShellスクリプトの一部です。

```powershell
try {
    Set-Location $PSScriptRoot
}
catch {
    Write-Host "初期設定エラーが発生しました: $_"
    Write-Host "エラー詳細:"
    $_ | Get-Error | Format-List
    pause
    return
}

# デバッグフラグ: ログファイル出力をデバッグ目的で行いたい場合は $true に設定してください。
$enableLogOutput = $false

# ログファイルはユーザーのホームディレクトリに出力されます。
if ($enableLogOutput) {
    $logFilePath = Join-Path -Path $HOME -ChildPath "rename_log.txt"
    Start-Transcript -Path $logFilePath
}
```

### スクリプトのポイント
- **ショートカットの作成**: スクリプトをショートカットとして作成し、`-NoExit`オプションを使用してPowerShellを起動することで、エラーメッセージや出力を確認しやすくします。
- **エラーハンドリング**: 初期設定時にエラーが発生した場合、詳細なエラーメッセージを表示し、スクリプトの実行を中断します。
- **ログ出力**: デバッグ目的でログファイルを出力するオプションを用意し、エクスプローラから起動した場合でもログの出力先が明確になります。

## まとめ
このスクリプトは、Obsidian Web Clipperのファイル名を改善するためのものであり、今後も同様のツールを作成する際の基盤となります。PowerShellを活用することで、ワークフローの改善が図れることを実感しています。生成AIとの連携を強化し、より効率的な作業環境を構築していきましょう。

---

この内容を基にQiita記事を作成することで、読者にとって有益な情報を提供できると思います。必要に応じて、具体的なコードや手順を追加して、より詳細な説明を行うこともできます。
WSL2環境におけるext4.vhdxの管理と運用ルール

## はじめに

Microsoft Windows 11 Home環境でWSL2を使用し、Ubuntu-24.04を利用する際、ext4.vhdxファイルのサイズ管理は重要な課題です。特に、ローカルLLM（大規模言語モデル）の検証を行う場合、大きなファイルを扱うことが多く、ストレージの効率的な管理が求められます。本記事では、ext4.vhdxの無駄な拡大を防ぐための運用ルールを提案します。

## 運用ルール

1. **大きなファイルを一時的に扱うタスクでは、/mnt/c/Users/<username> 配下での作業**
   - **理由**: ext4.vhdxのサイズが無駄に増大するのを防ぐため、大きなファイルを扱う際はWindowsのNTFSファイルシステムを利用します。これにより、WSL2の仮想ディスクの肥大化を避けることができます。NTFSはI/Oパフォーマンスが低下する可能性がありますが、大きなファイルの一時的な作業には影響が少ないと考えられます。

2. **こまめに不要ファイルは消しておく**
   - **理由**: 不要ファイルの定期的な削除は、ストレージの効率的な管理において非常に重要です。特にDockerを使用している場合、未使用のコンテナやイメージを削除することで、ext4.vhdxのサイズを抑えることができます。以下のコマンドを定期的に実行することを推奨します。

   ```bash
   docker system prune -a
   ```

3. **定期的に ext4.vhdx の縮小タスクを実行する**
   - **理由**: ext4.vhdxのサイズを管理するために、定期的に縮小タスクを実行することは非常に良い考えです。以下の手順で圧縮を行います。

   ```powershell
   wsl --shutdown
   diskpart
   select vdisk file="C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
   attach vdisk readonly
   compact vdisk
   detach vdisk
   exit
   ```

   - **注意点**: 縮小作業を行う際は、必ずWSLをシャットダウンしてから実行します。また、操作ミスによるデータ損失を避けるために、事前にバックアップを取ることをお勧めします。

## 結論

これらの運用ルールを遵守することで、WSL2環境でのext4.vhdxの無駄な拡大を防ぎ、ストレージの効率を最大化することができます。特にローカルLLMの検証を行う際には、これらのルールを実践することで、快適な作業環境を維持できるでしょう。
VisualStudio2022でReleaseビルドするときにpdbファイルを出力しないようにする(VC++版)

### 前提
VisualStudio2022のC++(VC++)のReleaseビルド後にpdbファイルが出力されない手順を以下記載します。

### 参考サイト
* [ビルド (C#、C++、Visual Basic、F#) のシンボル (.pdb) ファイルを生成する](https://learn.microsoft.com/ja-jp/visualstudio/debugger/how-to-set-debug-and-release-configurations?view=vs-2022#BKMK_symbols_release)
* (C#の無効化手順)[VisualStudio2022でReleaseビルドするときにpdbファイルを出力しないようにする](https://qiita.com/yusuke-sasaki/items/a05e68ef855cea1165c2)

### 手順
1. 上部メニューバーから、[プロパティ] を選択します。
2. [構成] ボックスの一覧を[リリース]に変更します。
3. サイド ペインで、[リンカー] > [デバッグ] を選択し、[デバッグ情報の生成] のオプションを選択します。
4. [デバッグ情報を生成] の既定値で[いいえ]を選択します。
5. 下段の[適用]を押下します
6. [リリース]でビルドを行い、フォルダ[x64\Release]で、".pdbファイル"が作成されていないことを確認します。

以上
三角関数の2倍角の公式の使用例と円の軌跡についての有名問題

# はじめに
三角関数は、奥が深い。三角比のsinとcosは兄弟のような関係をしているように思えるが、tanだけ仲間外れのような関係である。なので、受験の定石上では、tanはあまり使わずsinとcosの対称関係を用いるのが主流である。しかし、tanを用いると、sinとcosの2変数関数を1変数関数とみなせる場合があるなどのメリットも存在する。
そこで、今回は、$t=\tan \frac{\theta}{2} $とおいたとき、
```math
\sin \theta =\frac{2t}{1+t^2}
```


```math
\cos \theta =\frac{1-t^2}{1+t^2}
```


と表されるという有名事項を用いた証明問題を2題行うことで、二次関数や軌跡の分野領域を復習する。
# 2倍角の公式の導入
2倍角の公式を少し変形した式は以下のように与えられる。

```math
\sin \theta =2\sin\frac{\theta}{2} \cos\frac{\theta}{2}
```

```math
\cos \theta =2{\cos}^2 \frac{\theta}{2}-1
```

この式は、すぐに書けるよう証明も含めて覚えておこう。

# 正接の関係式
一方で、忘れやすいのが三角関数の相互関係の$\tan$の場合である。一応導出方法を軽く紹介する。
有名な$\sin,\cos$の相互関係の式をまずは考える。

```math
\sin^2\theta+\cos^2\theta=1
```

この式の両辺を$\cos^2\theta$で割ると$\tan^2\theta$がでてくるので、そのことだけ覚えておく。

```math
\frac{\sin^2\theta}{\cos^2\theta}+\frac{\cos^2\theta}{\cos^2\theta}=\frac{1}{\cos^2\theta}
```

したがって、


```math
\tan^2\theta+1=\frac{1}{\cos^2\theta}
```
このことは、意外と盲点になりやすく文系理系関わらず覚えておくと便利である。（数３の積分などで使用する）

# 三角比の媒介変数表示
さて、本題である。
```math
t=\tan \frac{\theta}{2}
```

とおくと、


```math
\sin \theta =2\sin\frac{\theta}{2}\cos\frac{\theta}{2}=2\tan\frac{\theta}{2}\cos^2\frac{\theta}{2}=2\tan\frac{\theta}{2}(1+\tan^2\frac{\theta}{2})^{-1}=\frac{2t}{1+t^2}
```

となる。一方で、


```math
\cos \theta =2\cos^2 \frac{\theta}{2}-1=2(1+\tan^2\frac{\theta}{2})^{-1}-1=\frac{2}{1+t^2}-1=\frac{1-t^2}{1+t^2}
```

# 二次関数の最小最大値問題
さて、上記の式を用いて以下の式を証明しよう。

```math
-1\le sin\theta,\cos\theta \le 1
```
## 余弦の場合
まずは簡単な$\cos\theta$からである。


```math
\cos \theta =\frac{2}{1+t^2}-1
```

なので、$1+t^2\ge1$より、

```math
0\le \frac{2}{1+t^2}\le1
```

が成立する。したがって、

```math
-1 \le\cos \theta \le1
```

## 正弦の場合

微積分を用いてもいいのだが、逆像法（受験数学では逆手流？）を用いる。つまり実数解の存在条件を用いる。

```math
\sin \theta =\frac{2t}{1+t^2}
```

ゆえに、$(1+t^2)>0$より分母を払い整理すると以下のようになる。

```math
(\sin\theta) t^2-2t+\sin\theta=0

```

これは、$t$の二次方程式とみなすことができる。そこで、$t$が実数解を持つような条件を調べる。判別式を$D/4$とおくと、

```math
D/4=1-\sin^2\theta\ge 0

```

ゆえに、

```math
-1\le sin\theta \le 1
```

となる。（ちなみに、受験とは関係ないが上記の考察から、$t$の範囲を実数から複素数に拡張すれば、上記の範囲を逸脱することができる。）




# 円の軌跡の問題
## 問題
以下の媒介変数$t$によって描かれる軌跡を求めよ。
```math
\begin{equation}
\left\{ \,
    \begin{aligned}
    & x = \frac{1-t^2}{1+t^2} \\
    & y = \frac{2t}{1+t^2} \\
    \end{aligned}
\right.
\end{equation}
```

ただし、大人の都合上$x>-1$とする。つまり、$t\le \infty$とする。


まずは、無難に$x$の式を変形する。

```math
t^2=\frac{1-x}{1+x}
```

これを$y$の式に代入して整理すると以下のようになる。


```math
y=t(1+x)
```

両辺を二乗すると、

```math
y^2=t^2(1+x)^2
```

となるので、$t^2=\frac{1-x}{1+x}$を代入して整理すると、


```math
y^2=(1-x)(1+x)
```

より、円の軌跡である

```math
x^2+y^2=1 
```

を描く。ただし、$x>-1$となる。

## プログラム
補足としてプログラムを書いた。

```python circle_par.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
n=10000

L=100
t=np.linspace(-L,L,n)

x=2*t/(1+t**2)
y=(1-t**2)/(1+t**2)

#縦軸と横軸を等間隔にする
plt.axes().set_aspect("equal")
#補助線を引く
plt.grid()

plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.savefig("円の軌跡.png")
plt.show()
```

![円の軌跡.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/ff1ee8ad-01d6-d608-493a-fe3bd6d1325d.png)


# まとめ

今回は、三角関数の公式と軌跡に関する問題を扱った。これらの融合問題は入試によくでるので、背景を含めてしっかりと理解しておくことをお勧めする。特に実数解の存在条件や軌跡の範囲はよく狙われるので注意することが大切である。
🚀Gitのignore系ファイルを管理するCLIを作ってみた

# 🚀 Git の ignore 系ファイルを管理する CLI を作ってみた
タイトル通り作ってみました。gig という CLI ツールです。リンクは↓より👀
https://github.com/tomatod/gig

Git のトラッキングからファイルを除外するとき、```.gitignore```を使うことが多いと思いますが、そこにも書きたくない場合は```.git/info/exclude```に書くことが時々ありますよね。あと、今更知ったんですが、グローバルつまり全リポジトリから除外したい場合は```$HOME/.config/git/ignore```に書けるとのこと🤔

後者の2つはファイル名を毎回忘れるのと、標準で出回ってるテンプレなんかも使えたらいいなーとか思いまして。日曜は奥さん外出で暇だったのもあり、ガーっと作ることにした次第です🔥

# 📝 どんなことができるの？
シンプルに以下のようなことができます。コマンド実行すると編集のためにエディタが起動します。使うエディタは editor (-e) オプションで任意に指定できますが、デフォルトでは ```git config core.edit```の値 > ```$EDITOR```の値 > ```vi``` の順で選択されます⏩️

## スコープに応じた Git 除外ファイルの編集 (-s scope)
```shell
# .gitignore の編集 (-s file)
$ gig

# .git/info/exclude の編集 (-s local)
$ gig -s local

# $HOME/.config/git/ignore の編集 (-s global)
$ gig -s global
```

## エディタの指定 (-e editor)
デフォルトでは ```git config core.edit```の値 > ```$EDITOR```の値 > ```vi``` の順で選択されますが、明示的に指定する場合は editor (-e) オプションで指定します。
```shell
# vim で .gitignore を編集
$ gig -e vim

# nano で .git/info/excludeを編集
$ gig -e nano -s local
```

## カレントなレポジトリで除外されるファイルの一覧を表示
mode (-m) オプションでアクションの種類を指定します。デフォルトは edit で、list とすると Git で除外されるファイルの一覧がスコープ毎に表示されます。
オプションじゃなくてサブコマンドにしたほうがスマートな気はしたのですが、ぶっちゃけ早く完成させたく🚀

```shell
$ gig -m list
--- global: /home/tarou/.config/git/ignore 
hoge

--- local: /home/tarou/gig/.git/info/exclude
bar
boo

--- file: /home/tarou/gig/.gitignore 
aiueo
```

## テンプレートから.gitignoreを作成 (-t template)
[github.com/github/gitignore](https://github.com/github/gitignore) からテンプレートをカレントなレポジトリに .gitignore としてコピーして編集することができます。

```shell
# Go 用のテンプレートで .gitignore を作成
gig -t community/Golang/Go.AllowList.gitignore

# Python 用の Jupyter Notebook 用テンプレートで .gitignore を作成
gig -t community/Python/JupyterNotebooks.gitignore
```

仕組みとしては、同レポジトリを ```$HOME/.config/gig/gitignore``` にクローンしてきて、カレントなレポジトリに対象テンプレートをコピーしてるだけです。template (-t) オプションの引数は [github.com/github/gitignore](https://github.com/github/gitignore) からの相対パスです。GitHub で当該レポジトリを開き、使いたいテンプレートを探して開き、以下のように画像中央あたりのコピーアイコンをクリックするとクリップボードにコピーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903359/6a34dd13-f3a5-41f2-e70a-0dff7791cd28.png)

# 🔽 最後にインストール方法
最後まで読んでいただきありがとうございました。興味あれば使ってやってください。インストール方法は [README](https://github.com/tomatod/gig?tab=readme-ov-file#install) に書いていますが、以下のとおりです。意外と使えるなと思ったので、もうちょっと改造するかもしれません。適宜コマンドの説明は```gig -h```か README のほうで確認いただければと思います🙏

## Goユーザの方
```shell
go install github.com/tomatod/gig@latest
```

## 実行バイナリだけ欲しい方
[リリース](https://github.com/tomatod/gig/releases)からバイナリをダウンロードできます。そこに書いていますが、OS や CPU アーキテクチャ毎に違うのでご注意を。なお、Windows では動作確認してないです🧟
LPIC101_3 GNUとUnixコマンド(主題103) よくわからないところをAIに聞いてみた

 LPIC101_1のわからないところをAIに聞いてみた。

 
過去の記事はこちら。
システムアーキテクチャ(主題101)

https://qiita.com/Riba_Quita/items/baae59480fdb32439d62

Linuxのインストールとパッケージ管理(主題102)

https://qiita.com/Riba_Quita/items/aaf2ac83b8bb95064d10


# GNUとUnixコマンド(主題103)
※ストリーム、パイプ、リダイレクトの使用
ファイルの基本的な編集　なし

## GNU（Gnu's Not Unix）
フリーソフトウェアを開発するためのプロジェクト。
そのプロジェクトによって開発されたオペレーティングシステム。

## コマンドラインでの作業
### man コマンド
- `man -k <キーワード>` / `apropos <キーワード>` → キーワードを含むマニュアルページの一覧を表示
- `whatis <コマンド>` / `man -f <コマンド>` → 指定したコマンドやプログラムの簡潔な説明を表示

### システム情報取得
- `uname`（Unix Name） → カーネル名を表示
- `printenv`（Print Environment） → 環境変数の表示
- `env`（Environment） → 環境変数の表示・設定
- `set` → 環境変数・シェル変数の表示・設定・シェルのオプション管理
- `unset <変数名>` → シェル変数の削除

### コマンド履歴管理
- `HISTSIZE` → メモリ上で保持されるコマンド履歴の最大件数
- `HISTFILESIZE` → `HISTFILE` に保存されるコマンド履歴の最大件数
- `HISTFILE` → コマンド履歴を保存するファイルのパスを指定する環境変数

### ディレクトリ移動
- `cd ~<ユーザー名>` → 指定したユーザーのホームディレクトリに移動
- `cd ~` または `cd` → 自分のホームディレクトリに移動
- `cd ~/test` → ホームディレクトリ配下の `test` ディレクトリに移動
- `cd test` → カレントディレクトリ配下の `test` ディレクトリに移動

### man コマンドのセクション
- `man 5` → 特定のファイル形式や構造についての情報
- `man 8` → システム管理コマンド

### クオートの違い
- `' '`（シングルクオート） → 文字列として扱う（変数展開やコマンド置換なし）
- `" "`（ダブルクオート） → 変数展開やコマンド置換を行う
- `` ` ` ``（バッククオート） → コマンドを実行し、その結果を取得

## フィルターを使用したテキストストリーム処理
- `od`（Octal Dump） → バイナリ形式で表示（`-t` オプションでフォーマット指定）
- `cat`（Concatenate） → ファイル内容表示・結合（`-n` 空行含めて行番号付与、`-b` 空行除外）
- `nl`（Number Lines） → 行番号付与（`-b` で方式指定）
- `head` / `tail -c <バイト数>` → バイト単位で出力
- `cut -c <範囲>` → 文字単位で抜き出し
- `sort -n -t <区切り文字> -k <キー>` → 指定フィールドで数値ソート
- `tr -d <文字>` → 指定文字削除 / `-s <文字>` → 連続文字圧縮
- `uniq`（Unique） → 重複行を除去

## 基本的なファイル管理
- `zip`（Zipper） → 圧縮アーカイブ作成
- `unzip`（Unzip） → 圧縮アーカイブ展開
- `tar`（Tape Archive） → 複数ファイルのアーカイブ作成・展開
- `gzip -d` / `gunzip`（GNU Zip） → 解凍
- `bzip2` / `xz` → 高圧縮率方式
- `cpio -o`（Copy In and Out） → アーカイブ作成 / `-i` → 展開
- `dd if=<入力ファイル> of=<出力ファイル>`（Data Duplicator） → データコピー・変換

## プロセス管理
- `top` → プロセスのリソース使用状況を監視
- `uptime` → システムの稼働時間、負荷状況確認
- `free` → メモリ・スワップ使用状況表示
- `ps -p <PID>` → 特定プロセス情報表示
- `ps -f` → プロセス親子関係表示
- `ps -x` → コントロール端末なしプロセス表示
- `ps -e` → 全プロセス表示
- `kill [-シグナル] <PID>` → プロセス終了
- `killall [-シグナル] <プロセス名>` → 名前指定でプロセス終了
- `pgrep -U <ユーザー>` / `-u <権限>` → プロセスID検索
- `ctrl+z` → プロセス一時停止
- `watch -n <秒数> <コマンド>` → 指定間隔でコマンド実行
- `screen` / `tmux` → 仮想端末管理

### プロセス実行優先度変更
- `nice -n <ナイス値> <コマンド>` → 指定値で実行
- `renice <ナイス値> -p <PID>` → 既存プロセスのナイス値変更

## 正規表現を使用したテキスト検索
- `grep -v <パターン>` → 検索結果を反転
- `grep -c <パターン>` → マッチした行数表示
- `grep -i <パターン>` → 大文字小文字区別なし
- `fgrep <パターン>`（Fixed Grep） → 文字列そのまま検索（正規表現非対応）
- `sed -e 's/<検索>/<置換>/g'`（Stream Editor） → テキストストリームの編集