すべての投稿
Cocoding AI で Golang バックエンド開発をマスターする:数分で本番対応 API を構築

Cocoding AI で Golang バックエンド開発をマスターする:数分で本番対応 API を構築

Cocoding チーム

Cocoding AI で Golang バックエンド開発をマスターする:数分で本番対応 API を構築

🎯 エグゼクティブサマリー

Golang は現代のバックエンド開発の基盤として登場し、Google、Uber、Docker などの企業を支えています。しかし、適切なアーキテクチャ、ミドルウェア、データベース接続を備えた堅牢な Golang API の構築は時間がかかる場合があります。ほとんどの AI コーディングツールが Vite.js や React などのフレームワークを使用したフロントエンド開発のみに焦点を当てている一方で、Cocoding AI は高度な Golang バックエンド生成を含む包括的なフルスタック開発機能を提供することで際立っています

この包括的なガイドでは、Cocoding AI が Golang 開発をどのように変革し、インテリジェントなプロンプティング技術を通じて Gin、Fiber、Beego などのフレームワークで本番対応の API を構築できるようにするかを探ります。

📚 目次

Cocoding AI Golang Development Hero Banner

なぜバックエンド開発に Golang を選ぶのか?

Golang は、パフォーマンス、シンプルさ、並行性機能の独特な組み合わせにより、バックエンド開発の言語として選ばれるようになりました:

モダンなテックスタックを持つ Go Gopher

🚀 パフォーマンスの優秀性

  • コンパイル言語:Go はネイティブマシンコードにコンパイルされ、卓越したパフォーマンスを提供
  • 効率的なメモリ管理:低レイテンシアプリケーション向けに最適化されたガベージコレクタ
  • 高速起動時間:マイクロサービスやコンテナ化アプリケーションに最適

⚡ 簡素化された並行性

  • ゴルーチン:並行プログラミングを直感的にする軽量スレッド
  • チャネル:安全なデータ共有のための組み込み通信プリミティブ
  • Select 文:複数のチャネル操作のエレガントな処理

🏗️ 本番対応機能

  • 強力な標準ライブラリ:包括的な HTTP、JSON、ネットワーキングサポート
  • クロスプラットフォーム:依存関係なしでどこでもデプロイ可能
  • Docker 統合:公式 Go イメージと優れたコンテナサポート
本番デプロイメントの図解

フルスタック AI の利点

🎭 フロントエンドのみの問題

市場のほとんどの AI コーディングアシスタントとツールは、重要な制限に悩まされています:フロントエンド開発でのみ優秀であるということです。人気のある競合他社の特定の問題を検証しましょう:

Lovable.dev:Vite.js フロントエンドと shadcn/ui コンポーネントを使用した事前構築テンプレートで React を使用します。しかし、彼らはバックエンドソリューションとして Supabase に依存しており、いくつかの重要な問題を引き起こします:

  • セキュリティの脆弱性:インターネットへの直接データベース公開
  • 限定的なカスタマイズ:Supabase のアーキテクチャ決定にロックイン
  • ベンダーロックイン:カスタムバックエンドソリューションへの移行不可
  • パフォーマンスのボトルネック:すべてのリクエストが Supabase のインフラを通過

Bolt.new:WebContainer テクノロジーを使用して動作し、これが根本的に Vite.js または React によるフロントエンドのみの開発に制限します。バックエンド機能が必要な場合、同じ制限を継承して Supabase に接続します:

  • WebContainer の制限:真のバックエンドサーバーを実行できない
  • カスタム API なし:Supabase の汎用 API レイヤーの使用を強制
  • 限定的なデータベース制御:カスタムデータベーススキーマや最適化を実装できない

** Vercel V0**:これらのツールは Next.js フルスタック開発に焦点を当てていますが、重要なアーキテクチャ問題に悩まされます:

  • 貧弱なエラーハンドリング:生成されたコードに本番グレードのエラー管理がない
  • 重く、肥大化したコード:パフォーマンスを犠牲にする過剰エンジニアリングソリューション
  • 単一フレームワーク依存:Next.js エコシステムのみにロックイン
  • スケーラビリティの問題:エンタープライズレベルのバックエンド要件を処理できない
Frontend-Only AI Tools Problem Illustration

🌟 Cocoding AI の優れたフルスタックソリューション

Cocoding AI はこれらの障壁を打ち破り、真にプロフェッショナルな開発アプローチを提供します:

複数フレームワークサポート:フロントエンド用 React、Vue.js、Svelte + バックエンド用 Gin、Fiber、Beego
カスタム PostgreSQL データベース:最適化されたスキーマでデータレイヤーを完全制御
本番グレードセキュリティ:Nginx アップストリームサーバーで保護されたバックエンド、インターネットに決して公開されない
軽量でクリーンなコード:不要な肥大化のない最適化されたコード
真の関心の分離:独立してスケーラブルなサービスとして開発されたフロントエンドとバックエンド
エンタープライズ対応アーキテクチャ:スケール、セキュリティ、保守性のために構築

あなたを限定されたエコシステムに強制する競合他社とは異なり、Cocoding AI は Netflix、Spotify、Airbnb などの企業が使用する適切なアーキテクチャパターンを持つプロフェッショナルグレードアプリケーションを生成します。

Full-Stack vs Frontend-Only AI Tools

Cocoding AI がサポートする Golang フレームワーク

1. Gin フレームワーク 🍸

最適用途:高性能 API、RESTful サービス、マイクロサービス

// Cocoding AI が最適化された Gin アプリケーションを生成
func SetupGinRouter() *gin.Engine {
    r := gin.New()
    r.Use(gin.Logger())
    r.use(gin.Recovery())
    
    // 自動ミドルウェア設定
    r.Use(cors.New(cors.Config{
        AllowOrigins:     []string{"*"},
        AllowMethods:     []string{"GET", "POST", "PUT", "DELETE"},
        AllowHeaders:     []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
        ExposeHeaders:    []string{"Content-Length"},
        AllowCredentials: true,
    }))
    
    return r
}

強み

  • 最小限のオーバーヘッドと最大のパフォーマンス
  • 優れたミドルウェアエコシステム
  • 組み込み JSON バインディングと検証
  • 包括的なテストサポート

2. Fiber フレームワーク 🚀

最適用途:Express.js のような構文、迅速な開発、高スループットアプリケーション

// Cocoding AI が最適な設定で Fiber アプリを作成
func SetupFiberApp() *fiber.App {
    app := fiber.New(fiber.Config{
        ErrorHandler: errorHandler,
        JSONEncoder:  json.Marshal,
        JSONDecoder:  json.Unmarshal,
    })
    
    // 自動ミドルウェア設定
    app.Use(cors.New())
    app.Use(logger.New())
    app.Use(recover.New())
    
    return app
}

強み

  • 馴染みのある Express.js のような API
  • 優れたパフォーマンスのため Fasthttp 上に構築
  • 豊富なミドルウェアエコシステム
  • すぐに使える WebSocket サポート

3. Beego フレームワーク 🐝

最適用途:フルスタック Web アプリケーション、MVC アーキテクチャ、迅速なプロトタイピング

// Cocoding AI がベストプラクティスで Beego アプリケーションを生成
type ProductController struct {
    beego.Controller
}

func (c *ProductController) Get() {
    // 自動 ORM 統合
    products := []models.Product{}
    orm.NewOrm().QueryTable("product").All(&products)
    
    c.Data["json"] = map[string]interface{}{
        "products": products,
        "status":   "success",
    }
    c.ServeJSON()
}

強み

  • 組み込み ORM(オブジェクトリレーショナルマッピング)
  • 自動 API ドキュメンテーション
  • セッション管理とキャッシング
  • 組み込み管理インターフェース
Golang Frameworks Comparison

Golang 開発のためのスマートプロンプティング戦略

🎨 効果的なプロンプティングの技術

Cocoding AI の全潜在能力を活用する鍵は戦略的プロンプティングにあります。実際の例で実証された技術をご紹介します:

1. 完全なスタックを指定する

悪いプロンプト:"製品カタログを構築"

良いプロンプト:"React フロントエンドと Gin (Golang) バックエンドでビタミンストアを構築し、製品カタログ、ショッピングカート、ユーザー認証を含める"

2. アーキテクチャ詳細を含める

基本プロンプト:"REST API を作成"

高度プロンプト:"PostgreSQL データベース、JWT 認証、Redis キャッシング、Swagger ドキュメンテーションを備えた Gin フレームワークを使用してビタミン e コマースプラットフォーム用の RESTful API を作成"

3. ビジネスロジックを指定する

曖昧なプロンプト:"ユーザーシステムを作成"

詳細プロンプト:"Fiber フレームワークを使用して、役割ベースアクセス制御(顧客、管理者、スーパー管理者)、メール確認、パスワードリセット、ユーザープロファイル管理を備えたユーザー管理システムを構築"

🔧 フレームワーク固有のプロンプティング

Gin アプリケーション用:

"Gin フレームワークを使用して[ビジネスドメイン] API を構築:
- PostgreSQL/MongoDB データベース
- JWT 認証ミドルウェア
- CORS 設定
- 入力検証
- エラーハンドリングミドルウェア
- Swagger API ドキュメンテーション
- Docker デプロイメント設定"

Fiber アプリケーション用:

"Fiber フレームワークで[ビジネスドメイン]バックエンドを作成、含む:
- Fasthttp 最適化
- WebSocket リアルタイム機能
- Redis セッション管理
- ファイルアップロード処理
- レート制限ミドルウェア
- 包括的ログ記録"

Beego アプリケーション用:

"Beego を使用して[ビジネスドメイン] Web アプリケーションを開発:
- データモデリング用組み込み ORM
- 管理パネルインターフェース
- セッションベース認証
- テンプレートエンジン統合
- 自動化テストスイート
- 設定管理"

📸 Cocoding AI プラットフォームからの実例

これらのプロンプティング戦略を使用すると何が起こるかをご覧ください:

Real Cocoding AI Prompt and Generated Code Screenshot

実世界の例:完全なアプリケーションの構築

例1:E コマースビタミンストア

プロンプト:

"React フロントエンドと Gin (Golang) バックエンドを使用して完全なビタミン e コマースストアを構築。カテゴリ付き製品カタログ、ショッピングカート、ユーザー認証、注文管理、管理パネル、Stripe 支払い統合、在庫管理、メール通知を含める。"

Cocoding AI が生成するもの

Real E-commerce Code Generated by Cocoding AI

バックエンド構造(Gin):

vitamin-store-backend/
├── cmd/server/main.go
├── internal/
│   ├── handlers/
│   ├── middleware/
│   ├── models/
│   ├── services/
│   └── database/
├── pkg/
├── migrations/
├── docker-compose.yml
└── Dockerfile

生成された主要機能:

  • 認証システム:リフレッシュトークンと役割ベースアクセスを備えた JWT ベース
  • 製品管理:画像アップロードとカテゴリ管理を備えた CRUD 操作
  • 注文処理:ステータス追跡を備えた完全な注文ライフサイクル
  • 支払い統合:ウェブフック処理を備えた Stripe 支払い処理
  • 管理ダッシュボード:在庫とユーザー管理のための包括的バックエンド API
  • メールサービス:自動注文確認とステータス更新

例2:タスク管理システム

プロンプト

"Next.js フロントエンドと Fiber (Golang) バックエンドを使用して、Trello のような協調タスク管理システムを作成。WebSocket による リアルタイム更新、プロジェクトボード、タスク割り当て、ファイル添付、チーム協力、通知、進捗追跡を含む。"

生成された機能

  • リアルタイム WebSocket 管理:接続されたすべてのクライアント間でのライブ更新
  • ボード&タスクシステム:データベース永続性を備えたドラッグアンドドロップ機能
  • ファイルアップロードサービス:AWS S3 統合による安全なファイル処理
  • チーム協力:ユーザー役割、権限、アクティビティフィード
  • 通知システム:タスク更新のリアルタイム&メール通知

例3:リアルタイムチャットアプリケーション

プロンプト

"Vue.js フロントエンドと Beego バックエンドを使用してリアルタイムチャットアプリケーションを構築。複数チャットルーム、プライベートメッセージング、ファイル共有、ユーザープレゼンスインジケーター、メッセージ履歴、絵文字リアクション、プッシュ通知を含む。"

生成されたアーキテクチャ機能

  • WebSocket 管理:接続プーリングによる効率的なリアルタイムメッセージ配信
  • ルームベースチャット:ユーザープレゼンス追跡付きスケーラブルマルチルームアーキテクチャ
  • メッセージ永続性:メッセージ履歴と検索機能付き MongoDB ストレージ
  • ファイル共有:ウイルススキャンとサイズ制限付き安全ファイルアップロード

Cocoding AI を使った高度なバックエンドパターン

🏗️ マイクロサービスアーキテクチャ

Cocoding AI は適切なサービス分離と通信パターンでマイクロサービスベースのバックエンドを生成することに優れています:

プロンプト

"ユーザー管理(Gin)、コースコンテンツ(Fiber)、支払い処理(Gin)、通知(Beego)の個別サービスを持つ e ラーニングプラットフォーム用の Golang マイクロサービスアーキテクチャを作成。API ゲートウェイ、サービス発見、サービス間通信を含む。"
Golang マイクロサービスアーキテクチャ

生成されたサービス

ユーザーサービス(Gin):

// 依存性注入による クリーンアーキテクチャ
type UserHandler struct {
    userService services.UserService
    authService services.AuthService
}

func NewUserHandler(us services.UserService, as services.AuthService) *UserHandler {
    return &UserHandler{
        userService: us,
        authService: as,
    }
}

func (h *UserHandler) RegisterRoutes(r *gin.Engine) {
    userGroup := r.Group("/api/v1/users")
    userGroup.Use(middleware.AuthRequired())
    
    userGroup.GET("/profile", h.GetProfile)
    userGroup.PUT("/profile", h.UpdateProfile)
    userGroup.POST("/change-password", h.ChangePassword)
}

コースサービス(Fiber):

// 高性能コンテンツ配信
func (h *CourseHandler) GetCourse(c *fiber.Ctx) error {
    courseID := c.Params("id")
    
    // より良いパフォーマンスのためのキャッシングの実装
    if cached := cache.Get("course:" + courseID); cached != nil {
        return c.JSON(cached)
    }
    
    course, err := h.courseService.GetCourseWithLessons(courseID)
    if err != nil {
        return c.Status(404).JSON(fiber.Map{"error": "Course not found"})
    }
    
    // 結果をキャッシュ
    cache.Set("course:"+courseID, course, 15*time.Minute)
    
    return c.JSON(course)
}

🔄 イベントドリブンアーキテクチャ

プロンプト

"API レイヤー用 Gin、イベントストリーミング用 NATS、在庫、支払い、出荷用の個別サービスを使用して Golang でイベントドリブン注文処理システムを構築。イベントソーシングと CQRS パターンを含む。"

生成されたイベントシステム

// イベントストア実装
type EventStore struct {
    nats *nats.Conn
    db   *sql.DB
}

func (es *EventStore) PublishEvent(event Event) error {
    eventData, _ := json.Marshal(event)
    
    // イベントを永続化
    if err := es.storeEvent(event); err != nil {
        return err
    }
    
    // イベントストリームに公開
    return es.nats.Publish(event.Topic, eventData)
}

// 注文集約
type OrderAggregate struct {
    ID     string
    Events []Event
}

func (oa *OrderAggregate) ProcessPayment(amount float64) error {
    event := PaymentProcessedEvent{
        OrderID: oa.ID,
        Amount:  amount,
        Time:    time.Now(),
    }
    
    oa.Events = append(oa.Events, event)
    return nil
}

パフォーマンスと本番環境の考慮事項

🚀 パフォーマンス最適化

Cocoding AI は組み込みパフォーマンス最適化を持つ Golang バックエンドを生成します:

1. 接続プーリング

// 自動設定されたデータベースプール
func SetupDatabase() *sql.DB {
    db, err := sql.Open("postgres", connectionString)
    if err != nil {
        log.Fatal(err)
    }
    
    // 最適化された接続プール設定
    db.SetMaxOpenConns(25)
    db.SetMaxIdleConns(5)
    db.SetConnMaxLifetime(5 * time.Minute)
    
    return db
}

2. キャッシング戦略

// Redis キャッシング実装
type CacheService struct {
    client *redis.Client
}

func (cs *CacheService) GetOrSet(key string, fetcher func() (interface{}, error), ttl time.Duration) (interface{}, error) {
    // まずキャッシュを試行
    if cached := cs.client.Get(key).Val(); cached != "" {
        var result interface{}
        json.Unmarshal([]byte(cached), &result)
        return result, nil
    }
    
    // ソースから取得
    data, err := fetcher()
    if err != nil {
        return nil, err
    }
    
    // 結果をキャッシュ
    dataJSON, _ := json.Marshal(data)
    cs.client.Set(key, dataJSON, ttl)
    
    return data, nil
}

3. レート制限

// 本番対応レート制限
func RateLimitMiddleware() gin.HandlerFunc {
    limiter := rate.NewLimiter(rate.Limit(100), 200) // 100 req/sec, burst 200
    
    return func(c *gin.Context) {
        if !limiter.Allow() {
            c.JSON(429, gin.H{"error": "Rate limit exceeded"})
            c.Abort()
            return
        }
        c.Next()
    }
}

🛡️ セキュリティベストプラクティス

生成されたアプリケーションには包括的なセキュリティ対策が含まれています:

1. 入力検証

// 自動入力検証
type CreateProductRequest struct {
    Name        string  `json:"name" binding:"required,min=3,max=100"`
    Price       float64 `json:"price" binding:"required,min=0"`
    Category    string  `json:"category" binding:"required"`
    Description string  `json:"description" binding:"required,max=1000"`
}

func CreateProduct(c *gin.Context) {
    var req CreateProductRequest
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    
    // 入力のサニタイズ
    req.Name = html.EscapeString(req.Name)
    req.Description = html.EscapeString(req.Description)
    
    // ビジネスロジックを続行...
}

2. 認証と認可

// リフレッシュトークン付き JWT ミドルウェア
func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        tokenString := c.GetHeader("Authorization")
        if tokenString == "" {
            c.JSON(401, gin.H{"error": "Missing authorization header"})
            c.Abort()
            return
        }
        
        // "Bearer " プレフィックスを削除
        tokenString = strings.TrimPrefix(tokenString, "Bearer ")
        
        token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
            return jwtSecret, nil
        })
        
        if err != nil || !token.Valid {
            c.JSON(401, gin.H{"error": "Invalid token"})
            c.Abort()
            return
        }
        
        claims := token.Claims.(*Claims)
        c.Set("userID", claims.UserID)
        c.Set("role", claims.Role)
        
        c.Next()
    }
}

競合分析:なぜ Cocoding AI がリードするのか

機能Cocoding AILovable.devBolt.newVercel V0
フルスタックサポート✅ 完全❌ Supabase 依存❌ WebContainer 制限⚠️ Next.js のみ
バックエンドセキュリティ✅ Nginx 保護❌ 直接 DB 公開❌ 直接 DB 公開❌ 貧弱なエラーハンドリング
フレームワーク選択✅ 複数(Gin、Fiber、Beego)❌ React + Supabase のみ❌ Vite.js + Supabase のみ⚠️ Next.js のみ
コード品質✅ 軽量&クリーン⚠️ テンプレート制限⚠️ フロントエンドのみ❌ 重量&肥大化
スケーラビリティ✅ エンタープライズ対応❌ ベンダーロックイン❌ ベンダーロックイン❌ モノリシック
カスタムデータベース✅ 完全 PostgreSQL 制御❌ Supabase のみ❌ Supabase のみ⚠️ 制限されたオプション
コード品質比較

📊 数字は嘘をつかない

開発時間の比較

  • 手動開発:基本的な REST API に 2-3 週間
  • 競合ツール:適切なバックエンド+セキュリティ問題にまだ何週間も必要
  • Cocoding AI:完全で安全なフルスタックアプリケーションに 2-3 時間

アーキテクチャ品質

  • セキュリティ:Nginx 保護バックエンド vs. 直接データベース公開
  • パフォーマンス:最適化された Golang vs. 重いフレームワークオーバーヘッド
  • 保守性:関心のクリーンな分離 vs. ベンダーロックイン
開発時間比較チャート Golang パフォーマンスベンチマーク

ベストプラクティスとヒント

🎯 プロンプティングのベストプラクティス

1. 技術スタックについて具体的に

フロントエンドとバックエンドの両方の技術を常に言及:

✅ "Next.js をフロントエンドに、Gin (Golang) をバックエンドに使用してブログプラットフォームを構築"
❌ "ブログプラットフォームを構築"

2. ビジネス要件を含める

必要な正確な機能を指定:

✅ "メニュー管理、オンライン注文、支払い処理、配達追跡を備えたレストラン注文システムを作成"
❌ "レストランアプリを作成"

3. 本番要件に言及

展開とスケーリングの考慮事項を含める:

✅ "Fiber フレームワーク、Redis キャッシング、PostgreSQL データベース、JWT 認証、Docker 展開、メディアストレージ用 AWS S3 統合を備えたソーシャルメディア API を構築"
❌ "ソーシャルメディア API を構築"

🛠️ 開発ワークフローのヒント

1. コア機能から開始

基本機能から始めて反復:

フェーズ 1:"ユーザー認証と基本 CRUD 操作を構築"
フェーズ 2:"支払い処理とメール通知を追加"
フェーズ 3:"リアルタイム機能と管理ダッシュボードを実装"

2. 早期頻繁テスト

テスト実装を要求:

"すべての API エンドポイントの単体テストと統合テストを含める"
"ローカル開発環境用 Docker Compose セットアップを追加"

3. API をドキュメント化

常にドキュメンテーションを要求:

"すべてのエンドポイント用 Swagger/OpenAPI ドキュメンテーションを生成"
"API テスト用 Postman コレクションを含める"

🚀 パフォーマンス最適化のヒント

1. Cocoding AI のキャッシング戦略を活用

"頻繁にアクセスされるデータ用 Redis キャッシングを実装"
"適切なインデックスでデータベースクエリ最適化を追加"

2. 監視統合を要求

"Prometheus メトリクスとヘルスチェックエンドポイントを含める"
"リクエストトレーシング付き構造化ログを追加"

3. スケール対応アーキテクチャ

"ステートレスサービスで水平スケーリング用に設計"
"データベースマイグレーションスクリプトと接続プーリングを含める"

結論

Cocoding AI は AI 支援開発におけるパラダイムシフトを表しています。 競合他社がフロントエンドのみのソリューションに制限されているか、Supabase などの問題のあるサードパーティサービスに依存している間、Cocoding AI は開発者が、プロフェッショナルグレードのセキュリティで保護された洗練された Golang バックエンドを持つ完全で本番対応のアプリケーションを構築できるよう支援します。

🎉 重要なポイント

  1. 真のフルスタック優位性:Cocoding AI は適切な分離とセキュリティでフロントエンドとバックエンドの両方のコードを生成

  2. セキュリティファーストアーキテクチャ:Nginx 保護バックエンドサーバー vs. 競合他社の直接データベース公開

  3. フレームワークの自由:複数の Golang フレームワーク(Gin、Fiber、Beego)vs. 競合他社の単一フレームワーク制限

  4. プロフェッショナルコード品質:軽量でクリーンなコード vs. 競合他社の肥大化またはテンプレート制限ソリューション

  5. エンタープライズスケーラビリティ:カスタム PostgreSQL データベースとマイクロサービスアーキテクチャ vs. ベンダーロックインソリューション

🚀 始める準備はできましたか?

Cocoding AI のプロフェッショナルフルスタック機能で今日の開発ワークフローを変革してください:

💡 プロのヒント:Cocoding AI を使用する際は、最適な結果のためにフロントエンドとバックエンドのフレームワークを常に指定してください:

"PostgreSQL データベース、JWT 認証、Stripe 支払い、管理ダッシュボードを備えた React をフロントエンドに、Gin (Golang) をバックエンドに使用してビタミン e コマースストアを構築。"

このアプローチにより、Cocoding AI がプロフェッショナルに構造化された本番対応コードを生成し、フロントエンドとバックエンドを安全かつ効率的に接続することが保証されます。

👉 Cocoding AI を今すぐ試す プロフェッショナルなフルスタック開発の未来を体験してください!


Golang 開発体験を革命的に変える準備はできていますか? Cocoding AI による真のフルスタック AI 支援の力をすでに発見した何千もの開発者に参加してください。

#CocodingAI #Golang #BackendDevelopment #FullStack #AI #Gin #Fiber #Beego #WebDevelopment #ProductionReady

この記事をシェア

今日Cocoding AIを試してみてください