OmniAICreator/Qiita-1.07M huggingface dataset:
VscodeのPowershellで(base)を削除する方法


初投稿です。至らぬ点も多々あると思いますがよろしくお願いします。


>今回の記事作成に当たり、こちらの記事を参考にさせていただきました。書かれている内容を参考にしつつ、筆者の環境ではうまくいかなかった部分を付け加えました。
>> https://qiita.com/rainline00/items/1606d4a6f479df33c408


# そもそも何か
```
(base) PS C:\your\directory
```
anacondaを導入すると、ターミナルの先頭に (base) なるものがデフォルトで表示されてしまいます。これは、anacondaが提供する仮想環境に入っている状態です。.condaとかいろいろ仮想環境を作成すると(vscodeでanacondaにより仮想環境を作ろうとするとデフォルトでこの名前が採用されます)別の仮想環境も使えますが、何もしないと最初から用意されている(base)を使うことになるわけですね。
# どう消すか


### 一時的に消す
コマンドプロンプトであれpowershellであれ、一時的に消す場合は以下のコマンドでこと足ります。
```
conda deactivate
```
activateしたい場合は、
```
conda activate
```
これで(base)から抜け出すことはできますが、新しくコマンドプロンプトやpowershellを開くとまた頭に(base)が出てきてしまいます。

### 恒久的に消す(設定変更)
```
conda config --set auto_activate_base false
```
このコマンドで、condaの自動アクティベーションを無効化できます。
デフォルトで(base)が頭に出てくるように再度設定したい場合は、
```
conda config --set auto_activate_base true
```
と設定すればokです。
コマンドプロンプトやpowershellではこれを実行すれば問題が解決しましたが、筆者はvscodeのpowershellで消すことはできませんでした。

### condaの初期化
```
conda init --reverse
```
これによって、conda init によって変更されたシェルの設定をリセットできます。
続いて、先ほどのコマンド
```
conda config --set auto_activate_base false
```
を実行し、PowerShell を閉じて再度開くと最初から(base)が消えていました！よかったー


# あとがき
筆者のように、普段あんまりanacondaを使わないけどとりあえず入れてるみたいな人は、勝手に出てくる(base)に煩わしさを覚えると思います。使う仮想環境は毎回変わってくるので、anacondaを導入したらとりあえず今回の処置を施しておくといいと思います。
ご精読ありがとうこざいました。
【アジャイル開発・スクラム】アジャイルサムライ ―達人開発者への道

「コツコツ太郎の本紹介ch」で書籍「アジャイルサムライ」の紹介動画を公開しました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/JQbwLTI8dTY?si=Fy0PjDZoVpGhI10P" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
コンテナとはなんなのか

:::note
#### はじめに
自身のDocker(コンテナ)の理解をアウトプットするために書いております。
生暖かく見守ってください。
:::

# 仮想化技術の概要

1台の物理サーバー上で複数の仮想サーバーを動作させ、リソースを効率化し、サーバー運用コストを削減する。

また、複数の物理リソースに ***同一の環境***を構築可能。

---

> ## なぜ仮想化技術が必要なのか？

1. **物理リソースの有効活用**
    - 従来の物理サーバーでは、リソースが固定的で多くの無駄が生じていた。仮想化により複数の仮想サーバーを動作させることでリソース利用率を向上できる。
2. **コスト削減**
    - 複数の物理サーバーを減らし、電力、冷却、スペースの削減が可能になる。
3. **環境の分離**
    - 開発・テスト・本番環境を1台の物理サーバー内に構築可能。環境ごとの干渉を防ぎ、安定性が向上。
4. **柔軟性とスケーラビリティ**
    - 必要に応じて仮想サーバーを追加・削除でき、ビジネスニーズに即座に対応できる。
5. **ディザスタリカバリ**
    - 仮想マシンのバックアップと復元が容易で、障害時のリカバリが迅速に行える。

:::note info
仮想化技術は、物理リソース(CPU、メモリ、ストレージなど)の効率化や環境の分離により、サーバー運用を最適化します。
:::

---

> ## ハイパーバイザーの種類

1. **ベアメタルハイパーバイザー**
    - ホストOSを必要とせず、ハードウェア上で直接動作する。
        **例**: VMware ESXi、Microsoft Hyper-V。
        
2. **ホスト型ハイパーバイザー**
    - ホストOS上で仮想化ソフトウェアが動作し、その上にゲストOSを配置。
        **例**: VirtualBox、VMware Workstation。
        
3. **コンテナ技術**または**OSレベル仮想化**
    - ゲストOSを仮想化せず、ホストOSのカーネルを共有。
        **例**: Docker、LXC。
        
---

# Docker（コンテナ）について

> ## Docker（コンテナ）の特徴

1. **ポータビリティ**
    - 環境依存の問題を解消し、どの環境でも同じ動作を実現。
2. **軽量で高速**
    - 仮想マシンよりも高速に起動可能。
3. **アプリケーションに特化**
    - アプリケーションと依存関係だけをパッケージ化。

:::note info
**コンテナ技術**は仮想化技術の派生として、軽量で環境の再現性が非常に高い特徴を持っています。
開発環境の構築や、スケールアウトなどに非常に適しており、迅速なデプロイが可能です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862039/7761eb6f-f14c-ed00-e511-1f510bbd8db0.png)
---

> ## Dockerが実現できる技術 一例

1. **ポートフォワーディング**
    - ホストマシンの特定のポートをコンテナに転送し、外部からコンテナ内のアプリケーションにアクセス可能にします。
        
        **例**: コンテナの80番ポートをホストの8080番ポートにフォワーディング。
        
        ```bash
        docker run -p 8080:80 <image_name>
        ```
        
2. **ボリュームマウント**
    - ホストマシンのディレクトリをコンテナにマウントして、データの永続化や共有を実現。
        
        ```bash
        docker run -v /path/on/host:/path/in/container <image_name>
        ```
        
3. **ネットワークの分離と構築**
    - Dockerは仮想ネットワークを作成し、コンテナ間の通信を独立させることが可能。
        
        ```bash
        docker network create <network_name>
        docker network connect <network_name> <container_name>
        ```
        
4. **マルチステージビルド**
    - イメージ作成時に複数のステージを使用し、軽量なイメージを効率的に作成可能。
    - **用途**: ビルド環境と実行環境を分離。
5. **クロスプラットフォームの動作**
    - 異なるOS環境（例: Windows、Linux）間で同一のアプリケーションを実行。

> ## 基本的なコマンド一覧

```bash
# 現在稼働中のコンテナを一覧表示します。の基本コマンドを調べてみました。
docker ps

# ローカルに保存されているDockerイメージを一覧表示します。
docker images

# 指定したイメージから新しいコンテナを作成し、実行します。
docker run** -it <image_name>

# 実行中のコンテナを停止します。
docker stop

# 停止したコンテナを削除します。
docker rm

# ローカルに保存されたイメージを削除します。
docker rmi

# 実行中のコンテナ内でコマンドを実行します。
docker exec** -it <container_id> bash
```
[Rails] superclass mismatch for class エラーの原因と解決策

## **はじめに**
Railsアプリケーションを開発していると、以下のようなエラーに遭遇することがあります：

```plaintext
TypeError - superclass mismatch for class AIRequest:
  app/models/ai_request.rb:1:in `<main>'
  app/views/documents/show.html.erb:7
```

このエラーは、クラス定義で名前の大文字・小文字や命名規則が原因で起こることが多いです。本記事では、このエラーの原因と解決策について解説します。

## **エラーの発生背景**

Railsでは、モデル名が**クラス名**と**ファイル名**の規約に従っている必要があります。この規約を無視してしまうと、Railsのオートローダーが正しくクラスを解釈できず、`superclass mismatch for class`エラーが発生します。

以下はエラーが発生した際のコード例です。

### **誤ったコード例**
#### **`app/models/ai_request.rb`**
```ruby
class AIRequest < ApplicationRecord 
  belongs_to :user, optional: true
  belongs_to :document, optional: true

  validates :input_text, presence: true
end
```

- モデル名は **`AIRequest`** としていますが、ファイル名は **`ai_request.rb`**。
- Railsのオートローダーは、クラス名とファイル名の対応が「スネークケース（`snake_case`）」に基づいているため、**`AIRequest`** を解釈できません。


## **原因**
Railsでは、クラス名とファイル名の命名規則が以下のように対応しています：

| **クラス名（CamelCase）** | **ファイル名（snake_case）** |
|---------------------------|-----------------------------|
| `User`                    | `user.rb`                  |
| `Document`                | `document.rb`              |
| `AiRequest`               | `ai_request.rb`            |

**`AIRequest`** のように、**すべて大文字を含むクラス名**を使用すると、Railsが正しい対応を見つけられなくなります。


## **解決策**
### **1. クラス名を変更する**
Railsの規約に合わせてクラス名を修正しましょう。

#### **修正後のコード**
```ruby
class AiRequest < ApplicationRecord 
  belongs_to :user, optional: true
  belongs_to :document, optional: true

  validates :input_text, presence: true
end
```

- **`AIRequest`** を **`AiRequest`** に変更。
- クラス名がファイル名と一致するようになります。


### **2. テーブル名は変更不要**
Railsはクラス名とテーブル名を自動的に関連付けます。例えば、クラス名が`AiRequest`であれば、Railsはテーブル名として`ai_requests`を自動的に推測するので、マイグレーションファイルやデータベースの変更は不要です。


## **補足: AIやAPIなどの命名**
もし、`AIRequest`や`APIRequest`などの命名をどうしても使いたい場合、以下のように`class_name`オプションで明示的にモデルを指定することも可能です。

#### **例: `Document`モデルに関連付ける場合**
```ruby
class Document < ApplicationRecord
  has_many :ai_requests, class_name: 'AiRequest'
end
```

ただし、Railsの命名規約を尊重する方がシンプルでエラーが少なくなります。

---

## **まとめ**

### **エラーの原因**
- クラス名（`AIRequest`）とファイル名（`ai_request.rb`）の対応がRailsの命名規則に合っていなかった。

### **解決策**
- クラス名を`AiRequest`に変更し、命名規則に従う。

### **ポイント**
- Railsでは、**クラス名はCamelCase**、**ファイル名はsnake_case**という規則を守る。
- 特殊なケースでどうしても命名規則を変更したい場合は、`class_name`オプションで調整可能。
ソフトウェアエンジニアにこそハードウェアの知識が必要な理由

**～ただコードを書くだけで満足していませんか？～**  

こんにちは、しゅんです。今回は初めてポエムを書きます。（秋田のホテルで2時間かけて書きました）  
最後まで読んでいただけると嬉しいです。よろしくお願いします！  

## はじめに  

日本に来てから、私は「ソフトウェアエンジニアにもハードウェアの知識が必要だ」とよく話しています。しかし、この話をするたびに、周りの人たちは「またその話か…」という反応をし、なんとなく避けられているように感じることがありました。  

確かに、現代のソフトウェア開発は高レベルなフレームワークやクラウドサービスが整備され、ハードウェアを直接意識せずにアプリケーションを作ることができます。しかし、それだけで本当に十分でしょうか？  

私は、**ソフトウェアエンジニアにとっても、ハードウェアの最低限の知識は不可欠**だと考えています。本記事では、その理由を詳しく説明し、なぜハードウェアを学ぶことがソフトウェアエンジニアとしての成長に繋がるのかを探ります。  

---

## 1. 「コードが書ければいい」は本当か？  

多くのエンジニアは、次のように考えがちです。  

- **「コードが動けばいい。ハードウェアのことは関係ない。」**  
- **「仕様書どおりに作れば問題ない。」**  
- **「ハードウェアの問題は別の専門家に任せればいい。」**  

この考えが間違いとは言いませんが、問題の本質を理解せずにコードを書いていると、以下のような問題に直面することになります。  

### よくある誤解とそのリスク  

| 誤解 | 実際のリスク |
|---|---|
| CPUとGPUの違いを知らなくてもAI開発できる | 適切なハードウェア選定ができず、非効率な処理になる |
| メモリ管理はOSに任せればOK | メモリリークやパフォーマンス低下の原因を特定できない |
| I/Oボトルネックは後から最適化できる | ハードウェア制約を考慮しない設計では根本的な改善が困難 |

---

## 2. ハードウェアの基本を知るべき理由  

ソフトウェアエンジニアとしても、最低限以下のハードウェアの知識は必要です。  

### (1) プログラムの実行の流れを理解する  

プログラムがどのように実行されるかを理解することは、バグの特定や最適化に役立ちます。  

例えば、次のプロセスについて理解していますか？  

1. **ソースコード** → コンパイル（コンパイラ）  
2. **アセンブリコード** → マシン語（CPUが直接実行）  
3. **命令実行** → レジスタ、キャッシュ、メモリの活用  

こうした知識があることで、コードの動作が遅い場合の原因をハードウェアレベルで分析し、解決策を見つけやすくなります。  

---

### (2) CPUとGPUの役割の違いを知る  

AI・ゲーム開発の現場では、GPUが重要な役割を担っています。では、なぜGPUが必要なのかを説明できますか？  

- **CPU** → 直列処理が得意（1コアあたりの性能が高い）  
- **GPU** → 並列処理が得意（数千のコアで一括処理）  

たとえば、ディープラーニングの学習時には、GPUの並列計算能力を活用することで、処理速度が数十倍に向上します。しかし、メモリ転送のボトルネックを知らなければ、GPUの力を最大限に発揮できません。  

---

### (3) メモリ管理の基本を理解する  

メモリには、以下の種類があります：  

| 種類 | 役割 | 特徴 |
|---|---|---|
| RAM | 一時データの格納 | アクセス速度が速いが揮発性 |
| VRAM | GPU専用のメモリ | グラフィック・AI計算に最適化 |
| スワップメモリ | 仮想メモリの補助 | 低速だがメモリ不足時に使用 |

プログラムのパフォーマンスを向上させるためには、これらのメモリの違いを理解し、適切に利用することが重要です。

---

## 3. 現場で役立つハードウェア知識  

実際のプロジェクトでは、ソフトウェアの知識だけでは解決できない問題が発生します。  

**実際にあった事例:**  

- **データベースの遅延** → I/Oスループット不足が原因だった（SSDとHDDの違いを理解）  
- **リアルタイム処理の不安定さ** → CPUのサーマルスロットリングが発生（冷却対策）  
- **ディープラーニングの推論が遅い** → GPUメモリの最適な利用方法を知らなかった  

このような問題を解決するためには、ソフトウェアとハードウェアの両面からアプローチできる力が求められます。

---

## 4. ハードウェアの知識がエンジニアとしての価値を高める  

プログラミングのスキルに加えて、ハードウェアの知識を持つことで、以下のようなキャリアの選択肢が広がります。

- 組み込みシステム開発（IoTデバイス）  
- AIの効率化（エッジデバイス最適化）  
- サーバーサイドの最適化（クラウドアーキテクチャ設計）

どの分野に進むにしても、基礎的なハードウェアの知識は必ず役に立ちます。

---

## まとめ  

ソフトウェアエンジニアとして、次のハードウェア知識を身につけるべきです。  

1. プログラムの実行の流れ（コンパイル、リンク、実行）  
2. CPU、GPU、メモリの基本的な違い  
3. I/O処理やネットワークの制約  
4. パフォーマンス最適化のためのハードウェア考慮点  

**ソフトウェアはハードウェアの上で動く。だからこそ、両方を理解することで、より良いエンジニアになれるはずです。**  

# 最後に
この文章は、まず私自身の考えをGPTで正しいかどうかを確認した上で、GPTの助けを借りて作成しました。もちろんここで書いてた知識はそれだけではないあくまで例です。最後まで読んでいただきありがとうございました！
Google Places APIを利用してお店情報を返すrailsのAPIサーバーを立てる。

# 実装した内容
- アクセスすると、クエリパラメータで指定した位置（緯度、経度）から500mの範囲内にあるお店を１０件返すAPIの作成。

# 手順

- Google APIの準備
    - https://console.cloud.google.com/ にアクセスし、新規プロジェクトを作成
    - Places API(新規)を有効化する
    - APIキーを発行する
- railsアプリケーションの作成し、プロジェクト内に移動する
    
    ```bash
    rails new yonaka --api
    cd yonaka
    ```
    
- Gemfileに以下を追記
    
    ```
    gem 'httparty' # HTTPリクエストを送るため
    gem 'dotenv-rails' # 環境変数管理
    ```
    
- 追加したgemのインストール
    
    ```bash
    bundle install
    ```
    
- .envファイルをプロジェクト(yonaka)配下に作成しAPIキーを環境変数として定義する
    
    ```
    GOOGLE_MAPS_API_KEY=your_google_maps_api_key
    ```
    
- コントローラーの作成
    
    ```
    rails generate controller Shops index
    ```
    
- 作成された `app/controllers/shops_controller.rb`に以下を記述
    
    ```ruby
    require 'httparty'
    
    class ShopsController < ApplicationController
      def index
        # リクエストボディの作成
        request_body = {
          includedTypes: ["restaurant"],
          maxResultCount: 10,
          locationRestriction: {
            circle: {
              center: {
                latitude: params[:latitude].to_f,
                longitude: params[:longitude].to_f
              },
              radius: 500.0
            }
          }
        }
    
        # APIキーを環境変数から取得
        api_key = ENV['GOOGLE_MAPS_API_KEY']
    
        # HTTPリクエストヘッダーの設定
        headers = {
          "Content-Type" => "application/json",
          "X-Goog-Api-Key" => api_key,
          "X-Goog-FieldMask" => "places.id"
        }
    
        # APIエンドポイント
        url = "https://places.googleapis.com/v1/places:searchNearby"
    
        # HTTPartyでPOSTリクエストを送信
        response = HTTParty.post(
          url,
          body: request_body.to_json,
          headers: headers
        )
    
        places = response.parsed_response["places"]
    
        result = []
    
        places.each do |place|
          result << fetch_place_details(place["id"], api_key)
        end
    
        render json: result
      end
    
      private
    
      # Place Details APIを呼び出して詳細情報を取得
      def fetch_place_details(place_id, api_key)
        # Google Places APIのエンドポイント
        url = "https://places.googleapis.com/v1/places/#{place_id}"
    
        # リクエストヘッダー
        headers = {
          "Content-Type" => "application/json",
          "X-Goog-Api-Key" => api_key,
          "X-Goog-FieldMask" => "*"
        }
    
        # GETリクエストを送信
        response = HTTParty.get(url, headers: headers)
        return nil unless response.code == 200
    
        response.parsed_response
      end
    end
    
    ```
    
- ルーティングの設定
    
    ```ruby
    Rails.application.routes.draw do
      resources :shops, only: [:index]
    end
    ```
    
- サーバーを起動して動作確認
    
    ```bash
    rails server
    ```
    
- [http://localhost:3000/shops?latitude=35.658034&longitude=139.701636](http://localhost:3000/shops?latitude=35.658034&longitude=139.701636)　にアクセス
VsCodeにPlantUMLをインストールする

# はじめに
VsCode に 拡張機能 'PlantUML' をインストールし、PlantUMLサーバーを使わずに ローカル コンピューター内で PlantUML図を描写する設定を行う。

# 環境構築

1. VsCodeをインストールする
2. [Microsoft Build of OpenJDKをインストールする](https://qiita.com/elu_jaune/items/89a28579f6e16a6dc71f)
3. [Graphvizをインストールする](https://qiita.com/elu_jaune/items/ebb3dbadd529618418c9)

# 拡張機能をインストールする

① VsCode を実行する。

② Extensions を選択し、 "plantuml" を検索する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/f4353f07-76f3-e647-5c86-a742b8bdeada.png)


③ jebbs氏が提供する "PlantUML"を選択し、"Install" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/643b0bfd-2428-31c0-de12-61517821e0d6.png)


# サンプルを作る
ドキュメント フォルダに "sample.pu"を作成し、プレビューしてみる。

```
@startuml
title test

' class diagrams
class Class {
  +string field1
  +void method1()
}

@enduml
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/8becc1a8-8a32-5ef4-0681-ade989bb39e1.png)


# ローカルでレンダーする設定を行う。

① "File" - "Preferences" - "Settings" の順に操作し、設定画面を表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/4e57507f-fcd7-12d0-5710-e59ec9c38e96.png)

② "plantuml" で検索し、"Planutuml: Render" を "Local" にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/9a604ca1-82a5-99f1-6327-6e9d121fc92c.png)
データベースのインデックスって何がすごいの？1,000,000件の中から特定のデータを探す例で解説

データベースを扱っていると必ず出てくる「**インデックス**」という概念。よく「検索を高速化する」と聞くけど、具体的にどんな仕組みで速くなるのかピンとこない人も多いんじゃないでしょうか？

この記事では、**1,000,000件のレコードから特定のIDを検索する場合**を例に、「インデックスがある場合」と「ない場合」の違いを具体的に解説します。

---

## **1. 前提条件**
- **テーブルサイズ**: 1,000,000件のレコード
- **検索条件**: `id = 5421` のデータを探す

---

## **2. インデックスがない場合**

まず、インデックスがない場合の検索動作を考えてみます。

### **動作イメージ**
データベースはすべてのレコードを**1行ずつ**チェックして、条件に一致するデータを探します。SQLクエリにすると次のようになります：

```sql
SELECT * FROM documents WHERE id = 5421;
```

しかし、インデックスがない場合、このクエリは実質「全件スキャン」になります。

### **アルゴリズム: 線形探索（O(n))**
全件スキャンでは、最悪の場合すべての行を確認しなければならないため、データが増えれば増えるほど処理時間も増加します。

- **処理フロー**（最悪のケース）:
  1. レコードID=1をチェック → 不一致
  2. レコードID=2をチェック → 不一致
  3. ・・・
  4. レコードID=5421をチェック → 一致！
  5. 処理終了（最大1,000,000件確認）

---

## **3. インデックスがある場合**

インデックスを設定するとどうなるでしょうか？

### **インデックスの仕組み**
インデックスはデータベースが検索を効率化するために用意する「データ構造」です。多くの場合、**B-Tree**（バランス木）というアルゴリズムが使用されます。

- **B-Treeの特徴**:
  - 階層構造でデータを整理。
  - 各ノードに「範囲情報」を持たせて、効率的に絞り込み。
  - データをソートして管理。

---

### **B-Treeを使った検索の動作**
インデックスが有効な場合、以下のような階層的な探索が行われます。

#### **例: `id = 5421` を探す場合**
1. ルートノード：範囲 `1〜500,000` と `500,001〜1,000,000` → 範囲 `1〜500,000` へ進む。
2. 次のノード：範囲 `1〜250,000` と `250,001〜500,000` → 範囲 `1〜250,000` へ進む。
3. さらに分割：範囲 `1〜125,000` → `1〜62,500` → `1〜31,250` → `1〜15,625` → `1〜7,812` → 範囲 `1〜5,421`。
4. リーフノードに到達してデータを取得。

---

### **アルゴリズム: 二分探索（O(log n))**
インデックスを使用すると、探索対象を毎回半分に絞るため、非常に高速です。

- **探索回数の例**（1,000,000件の場合）:
  - 最大20回の比較で目的のデータに到達（`log2(1,000,000) ≈ 20`）。

---

## **4. インデックス有無の比較**

| 特性                    | インデックスなし（全件スキャン） | インデックスあり（B-Tree） |
|-------------------------|---------------------------------|---------------------------|
| **アルゴリズム**         | 線形探索（O(n)）               | 二分探索（O(log n)）      |
| **比較回数（1,000,000件）** | 最大1,000,000回               | 最大20回                  |
| **データ増加の影響**      | 増えるほど遅くなる             | 増えても比較的高速         |

---

## **5. 注意点**

インデックスにはメリットだけでなく、以下のようなデメリットもあります：

### **5.1 デメリット**
1. **ストレージ消費**:
   - インデックス自体が追加のストレージを使用します。

2. **データ変更時のコスト**:
   - データの挿入、更新、削除時にインデックスも更新されるため、パフォーマンスに影響します。

3. **インデックス設計が重要**:
   - 不必要に多くのインデックスを作成すると、更新処理が遅くなる可能性があります。

---

## **6. インデックスを適切に設計するには？**

### **6.1 必要なカラムに絞る**
検索頻度の高いカラム（例: `id`や`user_id`）にインデックスを設定する。

### **6.2 複合インデックス**
複数のカラムを同時に検索する場合、複合インデックスが有効です。

#### **例: `user_id` と `id`**
```ruby
add_index :documents, [:user_id, :id]
```

---

## **7. 結論**

インデックスを使用すると、特に**大規模データ**での検索パフォーマンスが大幅に向上します！

- **1,000,000件の中から特定のIDを探す場合**:
  - インデックスなし → 最大1,000,000回チェック
  - インデックスあり → 最大20回チェック

適切なインデックス設計で、アプリケーションのパフォーマンスを劇的に改善できるので、ぜひ活用してみてください。
vSphere 基本のキ 用語まとめ

# 投稿した経緯
vSphereについて調べたことを自分なりにまとめてみました。
本記事を軸として、今後はそれぞれの機能で出来ることや検証した内容などを
記事にまとめようと思います。

内容の正確性には気をつけていますが、
勉強中のため、誤りなどありましたら教えていただけると幸いです。

# VMware
Broadcomの仮想化ソリューションのブランド名。

https://ict-miraiz.com/vmware-subscription-impact/

かつてはVMware社が販売していたが、
2023年11月にVMwareはBroadcomによって買収された。

# ESXi
仮想OSを実行するためのハイパーバイザのこと。

ESXiはESXの後継製品である。

他のハイパーバイザにはHyper-V(Microsoft)、KVM(Linux)などがある。

### ESXi Host Clientの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585627/acdc1846-b5c0-276a-1fbc-def1b7dfce8e.png)
画像：VMware Japan Blogより


ESXiにはこのようなWeb GUIが用意される。

### ESXiのCLI画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585627/b3538242-f865-e378-5a4b-114b30227f15.png)
画像：VMware Japan Blogより


特徴的なデザインのCLIが用意される。


### ESXとESXiの違い
>VMware ESXは有償であるのに対し、VMware ESXiは無償で入手して利用することができる。

:::note warn
2024年2月頃 無償版ESXiの提供は終了しました。
:::
vSphereは現在、サブスクリプション形態でサービスを提供しています。

>基本機能は同じだが、VMware ESXはマシンのインターフェースとしてLinuxベースのコンソール・オペレーティング・システム（COS）を動作させているのに対し、VMware ESXiでは必要な管理機能をVMkernelに直接実装しCOSを排除しCOSに依存しないアーキテクチャとなっている。

ESXはLinuxベースでマネジメントコンソールが実装されているが、ESXiはkernelに直接マネジメントコンソールが実装されている。

https://noizz.co.jp/content/glossary/cloud/vmware-esxesxi.html#:~:text=VMware%20ESX/ESXiとは,が推奨している%E3%80%82

# vSphere
VMware仮想化ソリューションの総称で下記の要素で構成される。
- ESXi(ハイパーバイザー)
- vCenter Server(管理用のサーバー)

# vCenter
vCenter Serverのことを指す。
ESXi上に立てられている仮想マシンを、管理するためのサーバー。
仮想マシン上にvCenter Serverを立てることで、複数の物理サーバーで稼働する仮想マシンを
一つの画面で管理することができる。
クラスタリングやマイグレーションなどgできる。

vCenter Serverには2つの種類が提供されている。
- Apliance版(VCSAとも言う)←現在はこちらが推奨されている。
- Windows版（vCenter 7.0から廃止）

### vSphere Web Clientの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585627/f19c5ac3-fb7c-1274-3497-fb4a7844bf32.png)
画像：カゴヤのサーバー研究室より

vCenter Serverを立てるとこのようなWeb GUIが用意される。

https://qiita.com/hedgehog-genki/items/b2d577f2b671c87cc112

https://zenn.dev/yud/articles/7887ce2b65c469

https://www.kagoya.jp/howto/engineer/vm/vsphere-client/
Graphvizをインストールする

# はじめに
PlantUML を Local で Rendorできる環境を作るため、Graphviz をインストールすることにした。

# インストーラを入手する

① Graphviz の Webサイトにアクセスする。

https://graphviz.org/download/

② Exe形式のインストーラのリンク "graphviz-12.2.1 (64-bit) EXE installer" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/533c23c2-b5af-f3e8-c6aa-a1fb4a32efde.png)

# インストールする

① ダウンロードした "windows_10_cmake_Release_graphviz-install-12.2.1-win4.exe" を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/90404d07-a3c6-e282-b734-666738ceb295.png)

※環境によってユーザーアカウント制御画面が表示される。これが表示された場合は "はい" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/fbb48947-e10b-038f-73f3-fd1f1ddba2dc.png)

② "次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/8da71906-46d7-975f-6c4b-2ed38704148b.png)

③ "同意する" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/7eaf9bd8-8d1d-d110-2e0b-09c1135db950.png)

④ "Add Graphviz to the system PATH for all users" を選択し、"次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/0c18f7a3-d532-7e9c-df3d-5fd401104411.png)

⑤ "次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/7a600057-8d74-91a3-7e6b-15418fbd8256.png)

⑥ "インストール" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/f7fe9716-1bf4-e218-9775-628d72501224.png)

⑦ "完了" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/3760e7c1-0878-acbb-ee17-9d18d1535585.png)

⑧ インストールに伴う環境変数設定を完了させるため、コンピュータを再起動する。

# 動作確認

① "コマンド プロンプト" を実行する。

② dotのバージョン情報を表示するコマンドを実行する。

```
prompt > dot -v
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/c80be358-90f8-fc4c-ba33-c97db81b4116.png)

バージョンを確認できたら Ctrl + C でキャンセルし、コマンド プロンプトを閉じる。
@document = current_user.documents.new に関する質問と比較

## 概要
Railsで`@document = current_user.documents.new`の書き方を使う際の疑問や注意点を深掘りし、`Document.new`との違いを明確にします。これにより、どちらの書き方を選ぶべきかが判断しやすくなります。

## @document = current_user.documents.new の動作原理
この書き方は、**ActiveRecordの関連付け**を活用して、新しい`Document`オブジェクトを作成し、その関連先として`current_user`を自動的に設定します。

- **動作**:
  - `current_user.documents`は、`has_many :documents`関連付けに基づいています。
  - `current_user.documents.new`は、新しい`Document`インスタンスを生成し、`user_id`に`current_user.id`を自動で設定します。

- **実際のSQLクエリ**:
  ```sql
  SELECT * FROM documents WHERE user_id = [current_user.id] LIMIT 1;
  ```
  - クエリは全件を取得せず、新しいインスタンス生成時には`user_id`のみが設定されます。

## 1億件のデータがある場合の挙動

### 質問: `current_user.documents.new`は非効率になるのか？
結論として、この書き方でも**1億件をすべて読み込むことはありません**。ActiveRecordの遅延読み込み（Lazy Loading）によって、必要なデータのみを扱います。

### 具体的な動作
- **通常の操作**:
  - `current_user.documents.new`は、関連付けを通じて新しいオブジェクトを作成するだけであり、データベースからすべての関連レコードを取得するわけではありません。

- **全件読み込みが発生するケース**:
  - `@document.valid?`など、関連付けのデータに依存する操作を行うと、関連する全データがメモリにロードされる可能性があります。

### `Document.new`との比較

| 特徴                               | `current_user.documents.new`          | `Document.new`                     |
|-----------------------------------|--------------------------------------|-----------------------------------|
| **関連付けの自動設定**              | `user_id`が自動的に`current_user.id`に設定される | 手動で`user_id`を設定する必要がある |
| **データベースクエリ**              | 必要な場合のみ発行（遅延読み込み）     | クエリは発行されない               |
| **大量データに対するパフォーマンス** | 全件ロードは発生しないが慎重な設計が必要 | パフォーマンスには影響しない       |
| **使いやすさ**                     | 簡潔で安全                           | 手動設定が必要                     |

## この書き方のメリットとデメリット

### メリット
1. **関連付けの自動化**:
   - `user_id`を明示的に設定する必要がなく、コードが簡潔になる。

2. **セキュリティ**:
   - 他のユーザーの`user_id`を誤って設定するリスクを防げる。

3. **Railsの慣習に沿った設計**:
   - ActiveRecordの関連付けを活用することで、可読性と一貫性が向上。

### デメリット
1. **データ量が多い場合の注意**:
   - 大量データが関連付けられている場合、一部の操作（例: バリデーションや関連付けの読み込み）でパフォーマンスに影響が出る可能性がある。

2. **意図しない関連付けの利用**:
   - データが複雑な場合、関連付けが誤った動作を引き起こすリスクがある。

3. **カスタマイズ性の制限**:
   - 手動での柔軟な設定が難しい。

##*実際にどちらを使うべきか？

### `current_user.documents.new`を使うべきケース
- ログイン中のユーザー固有のデータを作成する場合。
- セキュリティや関連付けの一貫性を重視する場合。
- 大量データを扱う場合でも、慎重に操作が制御されている環境。

### `Document.new`を使うべきケース
- `user_id`との関連付けが不要な場合。
- 後で関連付けを手動で設定する必要がある場合。
- パフォーマンスを徹底的に最適化したい場合。

## まとめ: 注意点とベストプラクティス

### 注意点
- **関連付けの確認**:
  - `User`モデルと`Document`モデルで正しい関連付けを設定すること。

- **SQLクエリの発行に注意**:
  - 必要に応じて`includes`や`select`を活用し、関連データの過剰なロードを防ぐ。

- **大量データ時の設計**:
  - データが1億件以上ある場合でも、Lazy Loadingを活用して最小限のデータ操作を心がける。

### ベストプラクティス
1. **`before_action`でログイン必須を設定**:
   - ログインしていない場合のエラーを防ぐ。

2. **関連付けの活用**:
   - `current_user.documents.new`を使うことで、関連付けの自動化と安全性を確保。

3. **必要なデータだけを取得**:
   - 大量データの場合、必要なデータに絞る。
DockerでGoプロジェクトにホットリロード機能を追加する方法

この記事では、GoプロジェクトにAirとDockerを利用してホットリロード機能を追加する手順を具体的に解説します。

## 1. プロジェクトの初期化

まずは、Goのプロジェクトを初期化します。

```bash
go mod init golang-backend
```

このコマンドを実行すると、`go.mod`ファイルが作成され、モジュールが初期化されます。次に、エントリポイントとなる `main.go` ファイルを作成します。

```bash
touch main.go
```

ファイルを作成したら、以下のように簡単なコードを記述してください。

```go
package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "This is golang-backend!")
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

```

動作確認をしましょう。

` go run main.go`の入力後
`curl localhost:8080`を叩くと
`This is golang-backend!`という文字列が出力されれば成功です。

これでGoプロジェクトの初期化は完了です。

---

## 2. Dockerのセットアップ

### Dockerfileの作成

Dockerを使用してGoの開発環境を構築するために、以下のような `Dockerfile` を用意します。

```dockerfile
FROM golang:1.23.1

WORKDIR /app

# ホットリロードツール Air をインストール
RUN go install github.com/cosmtrek/air@latest

# Air を使ってアプリケーションを起動
CMD ["air"]
```

### Docker Compose ファイルの作成

次に、`docker-compose.yml` または `compose.yaml` を作成し、サービスを定義します。

```yaml
services:
  go:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/app
```

---

## 3. Dockerのビルドと実行

以下のコマンドでDockerイメージをビルドし、コンテナを起動します。

```bash
docker compose up --build
```

しかし、この時点でホットリロードツール `Air` のインストール時にエラーが発生しました。

```
go: github.com/cosmtrek/air@latest: version constraints conflict
```

これは、`Air` のモジュール名が新しいバージョンで変更されたことによるエラーです。

---

## 4. エラーの解決

エラーを解決するために、`Air` の特定バージョンをインストールするように変更しました。

```dockerfile
RUN go install github.com/cosmtrek/air@v1.40.4
```

変更後、再度Dockerイメージをビルドします。

```bash
docker compose up --build
```

これで、無事にホットリロード機能が動作するコンテナが起動しました。

# 実際に変更を加えた場合の動作確認

ホットリロード環境が正しく動作しているかを確認するために、以下の手順を実施します。

## 1. `main.go` ファイルに変更を加える

以下のように、`main.go` ファイルの内容を変更します。

```go
package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Go with Hot Reload!")
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Server started at :8080")
    http.ListenAndServe(":8080", nil)
}
```

このコードは、HTTPサーバーを起動し、`/` エンドポイントにアクセスするとメッセージを返す簡単なAPIです。

---

## 2. コンテナの再起動は不要

ホットリロード環境では、変更を加えた後に保存するだけで、`Air` が自動的に変更を検知して再ビルドと再起動を行います。

---

## 3. 動作確認（curlコマンド）

変更が反映されていることを確認するために、別のターミナルから `curl` コマンドを実行します。

```bash
curl http://localhost:8080
```

### 正常時のレスポンス

以下のレスポンスが返ってくれば、変更が正しく反映されていることを確認できます。

```
Hello, Go with Hot Reload!
```

---

## 4. 再度変更して確認

例えば、以下のようにレスポンスの内容をさらに変更します。

```go
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Go with Hot Reload! Updated!")
}
```

保存後、再び `curl` コマンドを実行します。

```bash
curl http://localhost:8080
```

### 更新後のレスポンス

以下のように更新後のメッセージが反映されていれば、ホットリロードが正常に動作していることを確認できます。

```
Hello, Go with Hot Reload! Updated!
```

---

## まとめ

以上の手順で、ホットリロードが正しく動作し、コード変更が即座に反映されることを確認しました。これにより、Goの開発効率を大幅に向上させることができます。Dockerを活用したホットリロード環境を、ぜひ活用してみてください！
最初の投稿

ポリモーフィズム（仮）です。
メーカー系IT企業に入社し、1年目が終わろうとしています。
これまで学んだことや、現在学んでいることを記事としてまとめていきます。

内容は
・業務周辺の知識
・資格取得に関する内容
・読んだ技術書のサマリー
をメインに書いていこうと思います。

アウトプットは苦手ですが、これを機に上達しようｔ思います。
データを縦並びにする（UNPIVOT、CROSS APPLY）

# はじめに
SQLServerで横並びを縦並びにするクエリ「UNPIVOT」と「CROSS APPLY」のサンプルを纏めておきます。
横並びから縦並びへの変換では「UNION」を使いがちですが、カラム数が多い場合は「UNPIVOT」や「CROSS APPLY」が有効です。

縦並びから横並びへの変換クエリは以下の記事に書いています。

https://qiita.com/masayasu_t/items/284a929f0fc6fa027570

# サンプル
### テーブル構成
<table>
<thead><tr><th>学籍番号</th><th>学年</th><th>組</th><th>国語</th><th>数学</th><th>英語</th><th>社会</th><th>理科</th></tr></thead>
<tr><td>20220101</td><td>1</td><td>A</td><td>83</td><td>65</td><td>30</td><td>57</td><td>22</td></tr>
<tr><td>20220102</td><td>1</td><td>A</td><td>78</td><td>30</td><td>95</td><td>35</td><td>59</td></tr>
<tr><td>20220103</td><td>1</td><td>A</td><td>31</td><td>65</td><td>51</td><td>34</td><td>83</td></tr>
<tr><td colspan="8">…</td></tr>
</table>

## UNPIVOT
```sql
SELECT [学籍番号]
     , [学年]
     , [組]
     , [科目]
     , [点数]
  FROM [v_student_score]
UNPIVOT ([点数] FOR [科目] IN ([国語], [数学], [英語], [社会], [理科])) AS T
```
結果
<table>
<thead><tr><th>学籍番号</th><th>学年</th><th>組</th><th>科目</th><th>点数</th></tr></thead>
<tr><td>20220101</td><td>1</td><td>A</td><td>国語</td><td>83</td></tr>
<tr><td>20220101</td><td>1</td><td>A</td><td>数学</td><td>65</td></tr>
<tr><td>20220101</td><td>1</td><td>A</td><td>英語</td><td>30</td></tr>
<tr><td>20220101</td><td>1</td><td>A</td><td>社会</td><td>57</td></tr>
<tr><td>20220101</td><td>1</td><td>A</td><td>理科</td><td>22</td></tr>
<tr><td>20220102</td><td>1</td><td>A</td><td>国語</td><td>78</td></tr>
<tr><td>20220102</td><td>1</td><td>A</td><td>数学</td><td>30</td></tr>
<tr><td colspan="5">…</td></tr>
</table>


## CROSS APPLY
```sql
SELECT [学籍番号]
     , [学年]
     , [組]
     , [科目]
     , [点数]
  FROM [v_student_score]
 CROSS APPLY (VALUES ('国語', [国語])
                   , ('数学', [数学])
                   , ('英語', [英語])
                   , ('社会', [社会])
                   , ('理科', [理科])
             ) V(科目,点数)
 ORDER BY [学年]
        , [組]
        , [学籍番号]
```
結果は「UNPIVOT」と同じです。
2Dキャラクターのアニメーションを作成する



# 2Dのキャラクターのアニメーションを作成する


### 目次

- Animation Controllerの作成
- Animationの作成
- スクリプトからパラメータを制御する

## はじめに
今回の記事は[前回の記事](https://qiita.com/kenshin_8799/items/dee5d918c41d45392637)で作成したキャラクターにアニメーションをつけることを記録として残したものです。

## Animation Controllerの作成
- まずはProjectビューで**Create->Animation Controller**でAnimation Controllerを作成します。
<br></br>
こんな感じ⇩になっていたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/c13a6f16-f2e5-19fa-ee9c-97914ab95011.png)


## Animationを作成
### Idleアニメーションを作成
- 今回はキャラクターが何もしないで立っている状態のアニメーションを例にとってAnimationの作り方を説明します。
Animationは**Create->Animation**から作成できます。

下記の画像のように基本的には**Loop Time**を有効にします。こうすることでアニメーションが1回実行されて終了するのではなく、継続的にアニメーションを実行してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/0f285d45-c8c8-beca-3fc2-d11e54c4e03b.png)

これを先ほど作成したAnimation Controllerにドラドロすることでノードをつなぐ形にできました。
⇩こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/56012383-154c-4df5-5d1c-26798621193b.png)

**そしてこのAnimation ControllerをBoneを持ったキャラクターにアタッチすることでAnimationの作成をすることができます**。

:::note warn
逆に言えば、Animation ControllerをBoneを持ったキャラクターにアタッチしない限りはAnimationの作成ができないので注意！
:::

今回はキャラクターの動きを制御します。
![スクリーンショット 2025-01-22 233219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/aa3580b1-6cfa-ac03-d99a-12565d39088d.png)
<br></br>
Animationタブの録画ボタンを押します。
するとAnimationタブの背景が若干赤くなります。**これは現在録画状態であることを表しています。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/b35e47af-c6d4-3336-afb8-ee518a156420.png)

この状態でSceneビューのboneを動かすとboneの状態を記録してくれます。
<br></br>
そして頑張って作った結果がこれ⇩
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/5455bef8-eb9c-8779-98f9-1c68dd6a0c14.png)
途中で再生ボタンを使用しながらどんな感じ化を確認するとやりやすいです。

:::note info
今回は動きだけを制御しましたがこのAnimationのこのタイミングで**関数を呼び出す**なんてこともできます。
:::

## スクリプトからパラメータを制御する
- 例ではIdle Animationしか作成していませんがRun AnimationやJump Animationも作成してAnimation ControllerにアタッチしてTransitionも編集したのが下記の写真です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/8ff668ee-8dc8-22e5-33f8-6048840c930f.png)

ここで写真の右側にパラメータが映っていると思います。これはTransitionが作動するかどうかを制御しているパラメータです。

下記の写真はJump Animationですが「isJumping」パラメータがtrueになったときのみ作動するように赤い部分で制御しています。

![スクリーンショット 2025-01-22 234434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/b702e6c3-512f-bdd5-2f82-18adf372357c.png)

これらのパラメータはスクリプトから変更させます。
下記のコードがAnimation Controllerのパラメータを制御している部分を抜粋したコードです。
```c#:PlayerMovements.cs
    void Awake()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        isGrounded = Physics2D.Raycast(transform.position, Vector2.down, groundLine, groundLayer);

        if (animator != null)
        {
            animator.SetBool("isJumping", !isGrounded);
            float horizontalSpeed = Mathf.Abs(rb.velocity.x);
            animator.SetFloat("Speed", horizontalSpeed);
        }
    }

```

上記のコードのようにAniamtion Controllerで設定したパラメータの名前を指定してあげることでそのパラメータの値を操作することができます。

## おわり
msvcrt.dllに依存しない実行ファイル（HelloWorld）を作る

msvcrt.dllに依存しない実行ファイルを作ることにあまり意味はないですが、気になったためやってみました。

```c:hello.c
void WriteFile(void *, void *, int, void *, void *);
void *GetStdHandle(int);
void f() { WriteFile(GetStdHandle(-11), "Hello,World!", 12, 0, 0); }
```
これがHelloWorldを表示するコードです。main関数がありませんが、その代わりにf関数から実行開始します。

```console
$ clang hello.c -e f -nostartfiles -nostdlib -lkernel32
```
コンパイル時にはf関数から実行開始することを指定します。また、C言語の標準ライブラリを使用しないことを指定し、kernel32.dllを使用することを指定します。

```console
$ ./a.exe
Hello,World!
```
作成された実行ファイル(a.exe)を実行すると　”Hello,World!”　が表示されます。

```
$ objdump -d a.exe

a.exe:     file format pei-x86-64


Disassembly of section .text:

0000000140001000 <f>:
   140001000:   48 83 ec 28             sub    $0x28,%rsp
   140001004:   b9 f5 ff ff ff          mov    $0xfffffff5,%ecx
   140001009:   e8 32 00 00 00          call   140001040 <GetStdHandle>
   14000100e:   48 89 c1                mov    %rax,%rcx
   140001011:   48 8d 15 e8 0f 00 00    lea    0xfe8(%rip),%rdx        # 140002000 <__data_end__>
   140001018:   41 b8 0c 00 00 00       mov    $0xc,%r8d
   14000101e:   31 c0                   xor    %eax,%eax
   140001020:   41 89 c1                mov    %eax,%r9d
   140001023:   48 c7 44 24 20 00 00    movq   $0x0,0x20(%rsp)
   14000102a:   00 00
   14000102c:   e8 07 00 00 00          call   140001038 <WriteFile>
   140001031:   90                      nop
   140001032:   48 83 c4 28             add    $0x28,%rsp
   140001036:   c3                      ret
   140001037:   90                      nop

0000000140001038 <WriteFile>:
   140001038:   ff 25 0a 40 00 00       jmp    *0x400a(%rip)        # 140005048 <__imp_WriteFile>
   14000103e:   90                      nop
   14000103f:   90                      nop

0000000140001040 <GetStdHandle>:
   140001040:   ff 25 fa 3f 00 00       jmp    *0x3ffa(%rip)        # 140005040 <__IAT_start__>
   140001046:   90                      nop
   140001047:   90                      nop
   140001048:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
   14000104f:   00
```
実行ファイルの機械語は余計なコードがなく非常にシンプルです。


```console
$ objdump -p a.exe | grep -i -E "\.dll"
        DLL Name: KERNEL32.dll
```
動的リンクしているDLLを確認すると、kernel32.dllのみリンクしています。
msvcrt.dllはリンクしていません。

```console
$ strip -s a.exe
```
stripコマンドで実行ファイル(a.exe)から余計な情報を削除します。
そうすることで、実行ファイルは4kB程度の小さなものとなります。


WinAPIのWriteFile関数、ReadFile関数など使えば、printfやscanfなどの入出力機能、fopenやfread,fwriteなどのファイル入出力機能を実装することが可能です（浮動小数点数を文字列を変換するためにはRyuアルゴリズムなどを実装することが必要です。）
また、VirtualAllocEx関数、VirtualFreeEx関数など使えばmallocやfreeなどのメモリアロケーターを実装することが可能です（VirtualAllocEx関数である程度大きなメモリ領域を確保し、そのメモリ領域をglibcのmalloc/freeのような高速なアルゴリズムで管理するコードを自力で書く必要があります。）

頑張れば低レベルなWinAPIのみを使ってC言語標準ライブラリにある関数を自作することは可能ですが、車輪の再発明も甚だしいですね。素直にmsvcrt.dllを使えばいいと思います。
ActiveStorageでhas_many_attachedにdependent: :destroyと同様の挙動を実現する方法（S3対応可）

ActiveStorageを使ったアプリケーションで、複数ファイルを添付できる`has_many_attached`に`dependent: :destroy`を設定したい場合があります。特にS3などの外部ストレージを使っていると、不要なファイルや関連情報が残らないように管理することが重要です。

この記事では、`dependent: :destroy`を設定できない理由と、それを補完する方法を紹介します。

---

## **問題: `has_many_attached`では`dependent: :destroy`を設定できない**

`has_many_attached`は、ActiveStorageが内部で`active_storage_attachments`テーブルを通じてモデルとファイルを関連付けています。この仕組みは通常のActiveRecordの関連付けとは異なるため、`dependent: :destroy`を直接設定することはできません。

また、S3のようなリモートストレージを使っている場合、ストレージ上の実ファイルも適切に削除する必要があります。

---

## **解決策: コールバックを使う**

`dependent: :destroy`が使えない代わりに、モデルの`before_destroy`や`after_destroy`コールバックを利用して、関連付けられたファイルとそのメタデータ（`active_storage_blobs`や`active_storage_attachments`）を削除できます。

---

### **1. コールバックを使ったファイル削除**

以下のように、`before_destroy`コールバックでファイルを削除します。

```ruby
class Document < ApplicationRecord
  has_many_attached :files

  before_destroy :purge_attached_files

  private

  # ファイルとその関連情報を削除
  def purge_attached_files
    files.each(&:purge_later) # 非同期で削除
  end
end
```

#### **ポイント**
- **`purge_later`**: ファイルを非同期で削除します（推奨）。S3などのリモートストレージを使用している場合でもパフォーマンスに優れています。
- **`purge`**: 同期的に削除しますが、大量のファイル削除時には時間がかかる可能性があります。

#### **削除される内容**
- ストレージ上の実ファイル。
- `active_storage_attachments`の関連情報。
- `active_storage_blobs`のメタデータ。

---

### **2. ActiveStorageの関連情報だけを削除**

ファイル自体を削除せず、ActiveStorageの関連情報（`active_storage_attachments`）だけを削除したい場合は、以下のように実装します。

```ruby
class Document < ApplicationRecord
  has_many_attached :files

  before_destroy :remove_active_storage_attachments

  private

  # ActiveStorageの関連情報を削除
  def remove_active_storage_attachments
    files.attachments.each(&:destroy) # attachments情報のみ削除
  end
end
```

この方法では、`active_storage_blobs`や実際のファイルは削除されないため、手動でクリーニングが必要です。

---

### **3. ActiveStorageの残データを定期的に削除**

万が一、削除漏れが発生した場合に備えて、ActiveStorageが提供する以下のタスクでデータをクリーンアップできます。

```bash
rails active_storage:clean              # 未使用のファイルを削除
rails active_storage:purge_unattached   # 関連付けられていないBlobsを削除
```

これらをCronやスケジュールジョブ（Sidekiqなど）で定期実行すると、ストレージを効率的に管理できます。

---

## **まとめ**

`has_many_attached`では`dependent: :destroy`を直接使用できませんが、以下の方法で同様の動作を実現できます。

1. **コールバックで`purge_later`を使う**（推奨）
   - ファイル本体と関連データを削除。
2. **`attachments.each(&:destroy)`で関連データのみ削除**
   - ファイル本体は削除せず、柔軟なカスタマイズが可能。
3. **定期的にクリーンアップタスクを実行**
   - 削除漏れやストレージの膨張を防止。

用途や要件に応じて、適切な方法を選択してください。特にS3のような外部ストレージを使用している場合は、`purge_later`を活用するのがおすすめです。
DeepSeek-R1 + Roo Code (旧Roo Cline) + VSCodeでAIエージェントを試してみる

# はじめに
AIエージェントをコスパよく使ってみようと思い、当初はRoo Code + Github Copilot Proの裏技的構成を検討しました。
しかし、XでGithubからアカウント停止されたとの情報を見つけ、思いとどまりました。

そんな中で、中華生成AIのDeepSeek-R1がコスパ最強らしいとの噂を聞き、導入してみることにしました。

# 環境セットアップ
## DeepSeek R1
###  DeepSeek account作成
https://platform.deepseek.com/sign_up
必要事項を入力し、"Send code"をクリック。
メールでcodeが届くので、入力し、チェックを入れて"Sign up"。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/78cab0f5-73cc-cd24-480f-843f2ee6e38d.png)

### APIキーの発行
https://platform.deepseek.com/api_keys
"Create new API key"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/ebe9ab08-dcb8-a95b-2c9d-445a707eb2d6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/502d142e-6346-0660-6b06-572d168e3dea.png)
APIキーは一度しか表示されないので、コピーして適切に保存しておく。

### トークン購入
https://platform.deepseek.com/top_up
お試しなので最安の$2.12をPayPal経由のクレカで購入。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/126b628c-84db-c979-c4bc-2c95fddf9137.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/04a98998-806e-5693-21f9-0e83ffbc6d8a.png)

## Roo Code
### VSCodeにRoo Code拡張機能をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/d0b4e0a9-6637-f22f-9932-81865064b9df.png)

### DeepSeek API keyの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228338/e4f65b19-cfbe-b431-be4f-2dc8656d4a07.png)

# 使い方
tbd
【XAMPPでデータベースの環境構築】

# phpMyadminとは

phpMyAdminは、MySQLをブラウザ上で視覚的に操作できるWebアプリ。
phpMyadminを使用することで簡単にデータベースやテーブルを作成できる
使用するにはXAMPPのインストールが必要

phpMyadminでできることは以下の通り

・データベースとテーブルの作成、変更、削除
・データの挿入、更新、削除
・SQLクエリの実行と結果の表示
・ユーザー管理と権限設定
・データベースのインポートとエクスポート

# XAMPPとは
MySQLを含むweb開発環境をローカル上で簡単にセットアップするためのソフトウェア

# XAMPPの起動方法
phpMyadminでMySQLを操作するためにXAMPPであらかじめwebサーバーとMySQLを起動する必要がある

①XAMPPコントロールパネルを開く
➡xampp-control.exeをダブルクリック

②WebサーバーとMySQLの起動
➡XAMPPのコントロールパネルが開いたら、ApacheとMySQLの「Start」ボタンをクリック
「Apache」と「MySQL」の文字が緑色で塗りつぶされる
この状態になると、phpMyAdminでデータベースを操作できるようになる
  
③phpMyAdminの動作確認
➡MySQLが起動すると、以下のようにMySQLの「Admin」ボタンがクリックできるようになるのでクリックする

④・WebサーバーとMySQLの停止
➡もう一度同じ場所の「Stop」をクリックすれば、WebサーバーとMySQLを停止できる
Microsoft Build OpenJDK をインストールする

# はじめに

PlantUML を Local で Rendorできる環境を作るため、Microsoft Build of OpenJDKをインストールすることにした。

# インストーラを入手する

① Microsoft Build of OpenJDK の Webサイトにアクセスする。

https://learn.microsoft.com/ja-jp/java/openjdk/download

② msi形式のインストーラ "microsoft-jdk-21.0.5-windows-x64.msi" のリンクをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/a8cf47ea-3d59-66a1-8ac7-8f6eae1b33a8.png)


# インストールする

① ダウンロードした "microsoft-jdk-21.0.5-windows-x64.msi" を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/9f5c2b2f-948b-de0a-8e41-bca96a736611.png)

② "次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/342aad1d-d6e2-c371-d3b0-eeca9354c2e7.png)

③ "使用許諾書に同意します" を有効にし、"次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/b30b07f8-3451-08c0-f1db-bb39451ac2da.png)

④ "次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/f0504170-dee7-c1f1-30f5-16e75db9095c.png)

⑤ "Microsoft Build of OpenJDK" に含まれるすべての機能をインストール対象にして、"次へ" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/a5d0db30-360d-9ec6-31e1-d86804172b2d.png)

⑥ "インストール" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/b7218a3a-b324-1fa7-824a-561b03669161.png)

※環境によってユーザーアカウント制御画面が表示される。これが表示された場合は "はい" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/4d3eb977-1ee3-d37d-b30a-083aa22c3f5e.png)

⑦ "完了" をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/258c712f-093f-07b2-1ded-d75e12d2014d.png)

⑧ インストールに伴う環境変数設定を完了させるため、コンピュータを再起動する。

# 動作確認

① "コマンド プロンプト" を実行する。

② javaのバージョン情報を表示するコマンドを実行する。

```
prompt > java --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/b5661fbf-9601-8703-bd51-87c61d34a0c6.png)
WHERE 句のサブクエリはガバナ制限にカウントされるのか検証してみた

# 結論

カウントされない。

# 検証

以下の2パターンのガバナ制限情報を比較する。
もし WHERE 句のサブクエリがガバナ制限としてカウントされるなら、この2つは同じ結果になるはず。

- WHERE 句のサブクエリを使用して取得
- サブクエリを使用せず、2回の SOQL に分けて取得

## WHERE 句のサブクエリを使用して取得

1. 開発者コンソールから Apex を実行
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/ba14eebc-0e0b-9f50-1782-0197da820c87.png)
2. 出力されたログを確認
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/0da9283b-ac14-c422-f441-6c53db2959af.png)
    - 2行目：発行される SOQL クエリの合計数：**1回**（上限100回）
    - 3行目：SOQL クエリによって取得されるレコードの合計数：**7件**（上限50000件）

## サブクエリを使用せず、2回の SOQL に分けて取得

1. 開発者コンソールから Apex を実行
    ![{757E2E8F-73EE-4111-9AAA-1D1581491F12}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/9c6018d3-1164-a965-6bdc-94442b53d91c.png)
2. 出力されたログを確認
    ![{4A2F9483-F986-4A83-AD39-16B526EF8DA2}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950738/e45b3a4b-2c6f-2584-f445-07a7389bfc67.png)
    - 2行目：発行される SOQL クエリの合計数：**2回**（上限100回）
    - 3行目：SOQL クエリによって取得されるレコードの合計数：**21件**（上限50000件）

## 比較

上記2パターンを比較すると、WHERE 句のサブクエリはガバナ制限にカウントされていないことが分かる。

| 制限の種類 | WHERE 句のサブクエリを使用して取得 | サブクエリを使用せず、2回の SOQL に分けて取得 |
| - | - | - |
| 発行される SOQL クエリの合計数 | 1回 | 2回 |
| SOQL クエリによって取得されるレコードの合計数 | 7件 | 21件 |

# 参考資料

- [Apex ガバナ制限 | Salesforce Developer の制限および割り当てクイックリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm)
- [SOQL Tips #Salesforce - Qiita](https://qiita.com/TaaaZyyy/items/5bb62217f3cb1779aed1)
【リーダブルコード】初心者エンジニアが読み解く「美しいコード」の書き方 - 第4章

こんばんは！マル太です。

前回は、リーダブルコードの第3章「誤解されない名前」についてまとめました。

今回は、第4章「美しさ」の内容について、アウトプットしていきたいと思います。
<br>

# 美しいコードを書くことの重要性
第4章では、コードの美しさについて解説されています。

美しいコードとは、単に見た目が整っているだけではありません。
論理的にも整理され、理解しやすく、読みやすいコードこそ、美しいコードだと著者は述べています。

美しいコードを書くことで、
・コードが読みやすくなる
・バグを見つけやすくなる
・修正しやすくなる
といったメリットがあります。
<br>

# 美しいコードを書くための具体的なテクニック
4章では、美しいコードを書くための具体的なテクニックとして、以下の点が挙げられています。
<br>

**一貫性のあるレイアウト**
・コードのレイアウトを一貫させることで、コードの構造を視覚的に把握しやすくなり、可読性が向上します。
・具体的には、インデントや空白、改行などを統一することで、コード全体に秩序を持たせることができます。
<br>

**適切な改行**
・適切な場所で改行することで、コードの各部分が明確に区切られ、読みやすくなります。
・特に、長い処理や複雑な条件式は、複数の行に分割することで、理解しやすくなります。
<br>

**空白行を効果的に使う**
・空白行を効果的に使うことで、コードの各セクションを視覚的に区切り、コードの構造を明確にすることができます。
・関連性の高いコードはまとめて記述し、セクション間には空白行を挿入することで、コードの可読性を高めることができます。
<br>


**縦の線をまっすぐにする**
・関連性の高いコードを縦に揃えることで、コードの構造を視覚的に表現し、理解しやすくすることができます。
・例えば、変数宣言や関数の引数を縦に揃えることで、コードの可読性が向上します。

※例えばこんな感じ⤵️
```ruby:【悪い例】Java
int  age = 20;
String name = "田中太郎";
boolean  is_adult = true;
```

```ruby:【良い例】Java
int      age       = 20;
String   name      = "田中太郎";
boolean  is_adult  = true;
```
<br>

**似たコードは近くに置く**
・類似した処理を行うコードは、近くに配置することで、コードの関連性を明確にし、コードが読み易くなります。
・また、コードの重複を避けることができ、保守性も向上します。
<br>

**変数は使う直前に宣言する**
・変数は、使う直前に宣言することで、変数のスコープ（有効範囲）を限定し、コードの可読性を高めることができます。
・また、変数の値が変更される場所が分かりやすくなるため、バグの発生を抑制することができます。

※例えばこんな感じ⤵️
```ruby:【悪い例】Java
int value = 10;

// 他の処理... (value はここで使われていない)

// value を使う処理...
value = value + 5;
```

```ruby:【良い例】Java
// 他の処理...

// value を使う処理...
int value = 10;  // value を使う直前に宣言
value = value + 5;
```

良い例では、`value` を使う直前に宣言しています。
こうすることで、`value` がどこで使われているのか、値がどこで変更されるのかが、より明確になります。

<br>

**関連する関数を近くに置く**
・関連する関数は、近くに配置することで、コードの関連性を明確にし、理解しやすくすることができます。
・また、関数の呼び出し関係が分かりやすくなるため、コードの追跡が容易になります。
<br>

# まとめ
今回は、「リーダブルコード」第4章「美しさ」の内容をまとめました。

美しいコードを書くことは、コードの可読性、保守性を高める上で非常に重要です。

4章で紹介されているテクニックを参考に、美しいコードを書くことを心がけていきたいですね。

次回は、第5章「コメントすべきことを知る」についてまとめます。
D1をローカルにエクスポートする


sqlファイルとしてダウンロード

```
$ npx wrangler d1 export prod-d1-tutorial --remote --output export.sql
```

ローカルのSQLiteに投入

```
$ sqlite3 example.db < export.sql
```

リモートにインポート
https://developers.cloudflare.com/d1/best-practices/import-export-data/

```
$ npx wrangler d1 execute example-db --remote --file=users_export.sql
```
Raspberry Pi Zero 2購入とOS導入

# 1. はじめに
■最終目標
ビデオキャプチャでディスプレイの映像をカメラ情報として入力
画面に変化がない時にアクション（ビープ音やLINE通知等）

先人の知恵とChatGPTを使用してまずは動くようにする。その後PythonやらOS上のモジュール等で学習が必要になった部分について記事にし、シリーズとして投稿していく（予定）。


# 2. ハード選定
記事題名になっている「Raspberry Pi Zero 2」を選定している。理由は以下3つ。
選定理由①：価格
選定理由②：性能
選定理由③：たまたま

### 選定理由①：価格
以下表の価格情報は記事投稿時のDigiKey若しくはMOUSERより。
実使用上でスペック差がどの程度影響するか分かっていないものの、Raspberry Pi Zeroシリーズの約2500円は他ボードに比べ安いと感じる。
| 名称                    | 価格（モデル内最安） |
|-------------------------|--------------------|
| Raspberry Pi 5          | 8,196円           |
| Raspberry Pi 4 Model B  | 7,376円           |
| Raspberry Pi 3 Model A+ | 4,125円           |
| Raspberry Pi 3 Model B+ | 5,737円           |
| Raspberry Pi 3 Model B  | 5,737円           |
| Raspberry Pi 1 Model A+ | 3,300円           |
| Raspberry Pi 1 Model B+ | 4,098円           |
| Raspberry Pi Zero 2 W   | 2,459円           |
| Raspberry Pi Zero W     | 2,459円           |
| Raspberry Pi Pico 2 W   | 820円             |
| Raspberry Pi Pico       | 656円             |

### 選定理由②：性能
まず[参考サイト](https://qiita.com/hase-k0x01/items/acd0d9159a9001ebfbd3)に似たことをやりたい。
OSを扱える事が前提となるのでRaspberry Pi Picoシリーズは除外する。
参考サイトではRaspberry Pi 3 Model B+を使用している。
どの程度スペック必要か感覚的に分からないので、あえて最低スペックで挑む事とする。
処理能力が足りない場合はボード変更をする予定。

価格でほぼ差がないRaspberry Pi Zeroシリーズの差は以下の通り。
|                  | Zero               | Zero 2 W              |
|------------------|--------------------|-----------------------|
| SoC              | Broadcom製 BCM2835 | Broadcom製 BCM2710A1  |
| CPUアーキテクチャ | ARM11              | Arm Cortex-A53        |
| CPUコア数        | シングルコア        | クアッドコア           |
| CPUビット数      | 32-bit             | 64-bit                |


### 選定理由③：たまたま
2025正月前に秋葉原の千石電商に立ち寄った。
その時にふとRaspberry Piを買おうと思い立ち購入に至った。
単純にお店に頑張ってほしいというのもある。


# 3. OSインストール
以下の公式サイトに書かれている通り。
[公式：Raspberry Pi OS](https://www.raspberrypi.com/software/)
Raspberry Pi OSを使う場合は、全てお膳立てされているのでOSメディアを作ること自体は特に難しいことはない。
今回OSを選ぶ基準は以下で「Raspberry Pi OS (64-bit)」を使用している。
・GUIのRaspberry Pi OS
・できれば低容量
・動作が高速

Raspberry Pi ImagerでRaspberry Pi Zero 2 Wを選択すると
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/9680e0ab-a1c6-adb4-4538-f3ef5763b328.png">
このようなOSの候補が出てくる
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/1c0215e8-f043-0086-1668-526d0452ad72.png">

上から
Raspberry Pi OS (64-bit)
Raspberry Pi OS (32-bit)
Raspberry Pi OS (Legacy,32-bit)
Raspberry Pi OS (other)
とある。other内にも色々OSがあり、各名称内の単語には
「Lite」... CUI（必要最小限にしたのでデスクトップ環境もなし）
「Legacy」... 安定版OS（サーバに使うのかも？Raspberry Pi OSじゃなくていい気が）
「Full」... 推奨されるソフト全部のせ
「xx-bit」... OSのbit
の意味があり、今回の基準からすると
「Lite」と「Full」が無く、「64-bit」が付くOSなら何でも良いということになるので「Raspberry Pi OS (64-bit)」を使用することにした。


# 4. おわりに
初Qiita記事でした。
次回は参考サイトの動作をお試しでやってみます。
【Mac】manよりわかりやすいマニュアルを表示する方法

`tldr`コマンドを使用すると`man`コマンドよりわかりやすいマニュアルが表示されます。

https://github.com/tldr-pages/tldr

## インストール

以下のコマンドでHomebrewを使用してインストールします。

```terminal
brew install tlrc
```

## マニュアルを表示する

`ls`のマニュアルを表示するには以下のように実行します。

```terminal
$ tldr ls
  ls

  List directory contents.
  More information: https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html.

  List files one per line:

    ls -1

  List [a]ll files, including hidden files:

    ls -a

  List files with a trailing symbol to indicate file type (directory/, symbolic_link@, executable*, ...):

    ls -F

  List [a]ll files in [l]ong format (permissions, ownership, size, and modification date):

    ls -la

  List files in [l]ong format with size displayed using [h]uman-readable units (KiB, MiB, GiB):

    ls -lh

  List files in [l]ong format, sorted by [S]ize (descending) [R]ecursively:

    ls -lSR

  List files in [l]ong format, sorted by [t]ime the file was modified and in [r]everse order (oldest first):

    ls -ltr

  Only list [d]irectories:

    ls -d */
```