水曜日, 5月 7, 2025
ホーム ブログ ページ 1913

最初のバーサーカー:カザン – すべてのユニークなクラフト材料とそれらを取得する方法



あなたが戦利品とクラフトシステムに慣れると 最初のバーサーカー:カザン、ゲーム内の強力なギアセットのほとんどには、ユニークなクラフト素材が必要であることに気付くでしょう。これらの特別な資料は、カザンの旅を通してさまざまな方法で取得でき、途中で個々のボスから耕作できます。ギアセットは、通常、さまざまな地域のランダムな領域に位置するか、ボスを倒してボスから落とすことにより、関連するスクロールを追跡することでロック解除する必要があります。
フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

今月のゲーム:2020年2月



ねえitch.ioファン、それはしばらく経ちましたか?ゲームをプレイせずに高く乾燥させたくありませんでした(YouTubeチャンネルやメールダイジェストをチェックすることもできます)。

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

レグザ初の4Kプロジェクター「V7Rシリーズ」。3色レーザー光源搭載、Dolby Vision/IMAX Enhancedに対応



レグザ初の4Kプロジェクター「V7Rシリーズ」。3色レーザー光源搭載、Dolby Vision/IMAX Enhancedに対応

TVS REGZAは、スタンド一体型の4Kレーザープロジェクター「RLC-V7R MAX」「RLC-V7R」を4月25日から順次発売する。

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

花粉症の根本原因、自然環境のバランスを取り戻せ! : – ASCII STARTUP



花粉症の根本原因、自然環境のバランスを取り戻せ! : - ASCII STARTUP

 毎年春になると、多くの人々が花粉症に悩まされるが、日本の花粉症は杉花粉が主な原因とされている。

 戦後、木材需要を満たすために杉が大量に植樹されたが、需要の減少に伴い伐採が進まず、杉が過密状態となり、花粉の飛散量が増加。近年では、花粉症対策として杉林を伐採しようという取り組みも進められているが、杉を伐採することで土壌の保水力が低下し、洪水や土砂災害のリスクが高まる危険性がある。また、伐採後に適切な植樹が行われない場合、植生の多様性が回復せず、一部の外来種が繁殖してしまうことも懸念される。自然界は繊細なバランスの上に成り立っており、単純に杉林を減らすだけでは、本質的な解決には至らない。

 こうした課題の中、ミドリクNbS株式会社は、自然資本や生物多様性の状態を可視化・診断し、持続可能な森林管理や生態系の回復を支援するデータ基盤を提供している。人工衛星・ドローンや各種LiDAR・AI技術を活用し、取得される森林の3次元データを元に、樹種の判別や炭素固定量の推定を行っており、自治体や研究機関、企業の意思決定を科学的に支えるツールとなっている。

 近年では、花粉症の課題に関連して、森林の樹種構成や高齢化の状況を把握し、将来的な管理方針を検討するうえでの基礎情報として注目されつつある。こうした情報の活用により、地域ごとに適した植生の見直しが検討されることで、花粉症対策を考慮した管理計画の促進にもつながるかもしれない。科学的な知見や地域の合意形成を前提に、大学・自治体・NPOなどとの連携を通じて、森林管理の高度化と環境保全の両立が図られることが期待されている。



フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

米50%関税 中国は徹底抗戦の構え



米50%関税 中国は徹底抗戦の構え

米50%関税 中国は徹底抗戦の構え

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

ChatGPT と外部サービスを接続する GPTs 開発ガイド


ChatGPT で、カスタムの GPTs を試したことがある方は多いと思います。しかし、GPTs に外部サービスとの接続方法を設定するだけでツールを自由に追加できる機能 GPT Actions を試したことがある方はまだまだ少ないのではないでしょうか。

この GPT Actions は、様々な用途で活用できる可能性を持っています。GPT Actions を挟むだけで、すでに存在しているナレッジベースや社内サービスと ChatGPT をつなぐことができます。そして、こうした外部サービスを活用する AI を GPTs をユーザーインタフェースとして ChatGPT ワークスペース内の利用者全員に配布することができます。

先日、近い将来に ChatGPT デスクトップアプリが MCP サーバーとの接続に対応する計画も発表されましたが、MCP との連携という選択肢が増えた後でも GPT Actions が組織内で共有可能な GPTs を拡張するための重要な機能であることは変わりません。

GPT Actions の開発は想像以上に簡単に始められます。この記事では、より多くの方に試していただけるよう、設定方法から実装例までの最新の情報を整理して解説します。

はじめに GPT Actions の概要を改めて説明します。

GPT Actions は GPTs に追加することができるカスタム GPT を拡張するための機能です。何らかの機能を持つ Web API サーバーを公開し、その十分な説明とパラメーター・レスポンス情報を含む OpenAPI の形式(JSON/YAML)の接続先情報を用意して、あとはそれを GPTs のアクション設定画面で読み込むだけで Function Calling の呼び出し先として登録できる、という仕組みです。

GPT Actions の接続先の Web API サーバーでは、制限なく任意のコードを実行することができます。すでに上で述べた通り、ChatGPT と既存のシステム・データベースとつなぐ中間サーバーとして構築すれば、最小の開発コストで ChatGPT との連携を実現することができます。新規開発なら Agents SDK を使ったエージェントを接続しても面白いでしょう(その例も後半で紹介します)。

GPT Actions を動作させるために必要なものは、

  • パラメーターを受け付けることができる公開された URL(認証あり・なしを選択可能)
  • その URL でリクエストを処理する Web API サーバー
  • URL ごとにパラメーター・レスポンスのデータ型を OpenAPI の形式で登録

です。これらの準備をできるだけ効率よく行うための方法を Python と Node.js のコード例とともに解説していきます。

実際に自前のコードを動かす前に、ドキュメントで紹介されている接続例を使って、登録方法と動作を確認しておきましょう。

Getting Started ページにある米国の気象情報を取得する例を使います。Step 1. の “See Full Open API Schema” という箇所をクリックすると、そのまま貼り付けると動作する YAML 設定が表示されるので、これをコピーします。

GPT 編集画面にアクセスします。下までスクロールすると表示される “Actions” の下の “Create new action” ボタンをクリックし、GPT Action の設定画面にある “Schema” のテキストエリアに先ほどコピーした YAML データを貼り付けます。すると、その下の “Available actions” のセクションに getPointDatagetGridpointForecast という二つのアクションが追加されて “Test” ボタンから試せるようになります。

この状態で、右側のプレビュー画面のチャットボックスから Hey, can you tell me today's weather in San Francisco? と質問を投げてみてください。

まず api.weather.gov へアクセスしてよいかを確認されます。

“Allow” をクリックすると API への通信が開始され、結果が以下のように表示されるはずです。

デバッグ出力のところを展開してみると、San Francisco という都市名から緯度・経度のパラメーターが決められ、それを使って api.weather.gov への API リクエストが発生していることが分かります。そして、その応答を元にカスタム GPT の方で、チャットにわかりやすい形式で結果が表示されるという流れになっています。

ユーザーが利用する画面でも同様に api.weather.gov へのアクセスの許可を求め、クリックすると実際どのようなパラメーターを送信したか確認できるようになっています。

なお、ここでの例は誰でもアクセス可能な公開 API なので指定していませんが、Authentication のパートで、Basic 認証、Authorization ヘッダーや OAuth によるアクセス制御・リソースへのアクセス許可を指定することもできます。詳細はこちらのドキュメントを参照してください。この記事でも後半で実例とともに解説します。

GPT Actions で接続する先は、インターネットに公開された URL である必要があります。

ローカルで Web API サーバーを動かしている場合でも、なんらかの方法でアクセス可能な URL を用意する必要があります。一般的には ngrokCloudflare Tunnel などが使われることが多いです。この記事では Cloudflare Tunnel を使った例を紹介します。

最新の情報については Cloudflare のドキュメントを確認するのが確実ですが、この記事投稿時点で macOS の場合、以下のようなコマンドを実行するだけで、簡単にセットアップすることができます。


brew install cloudflared

cloudflared tunnel --url http://localhost:3000

実行してしばらく待つと、以下のような出力が表示されるはずです。

INF Requesting new quick Tunnel on trycloudflare.com...
INF +--------------------------------------------------------------------------------------------+
INF |  Your quick Tunnel has been created! Visit it at (it may take some time to be reachable):  |
INF |  https://notification-mart-radio-admissions.trycloudflare.com                              |
INF +--------------------------------------------------------------------------------------------+
INF Cannot determine default configuration path. No file [config.yml config.yaml] in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared]

この https://***.trycloudflare.com を使って GPT Actions のリクエストをローカルで起動しているアプリに forward することができるようになりました。

このやり方の場合、cloudflared tunnel を起動し直す度、また一定時間経過毎に URL が変わることに注意してください。

それではいよいよ GPT Action を実装して、接続してみましょう。Python、TypeScript + Node.js の例を紹介していきます。

Python 実装例

今回紹介する Web API サーバーアプリは、標準で OpenAPI 形式の出力をサポートしている FastAPI を使って実装していますが、他のツールでも構いません。OpenAPI の JSON/YAML 定義をマニュアルで作成する場合、Web API サーバーの実装方法に特に制限はありません。

依存ライブラリをインストール

Python の環境が準備できている前提で、以下のインストールを実行してください。requirements.txt で管理したり uv や Poetry でセットアップしても OK です。


pip install -U fastapi fastapi-cli uvicorn

単純な GPT Action 例

まずは疎通確認のために非常に単純な GPT Action を動かしてみましょう。「合言葉」を聞かれたときに「AGI」を返すだけのアクションです。***.trycloudflare.com は先ほど Cloudflare Tunnel を起動したときに表示されたものに書き換えてください。

from fastapi import FastAPI

app = FastAPI(
    
    servers=[{"url": "https://***.trycloudflare.com"}],
)

@app.post(
    path="/say-it",
    operation_id="say-it",
    summary="合言葉を聞かれたときに実行されるツール",
)
async def say_it() -> str:
    return "AGI"

このコードを app.py として保存して fastapi dev app.py --port 3000 を実行すると http://localhost:3000/ の Web アプリとして起動します。app.py のコードを書き換えたときにも再起動なしで反映されます。

起動できたら Cloudflare Tunnel で接続されているかを確認するために https://(あなたが使用しているサブドメイン).trycloudflare.com/openapi.json にアクセスしてみてください。JSON データが表示されれば、とりあえずうまくいっています。

この JSON データを表示した URL をコピーして GPT 編集画面にアクセス、”Actions” の下の “Create new action” をクリックして “Import from URL” というボタンから設定します。以下のような感じで Schema が読み込まれるはずです。

そして、”Available actions” の下の “say-it” の “Test” ボタンをクリックすると、上で試した米国の気象情報の例と同様に Web API へのアクセスの許可を求める動作を確認できます。

この GPT Action の設定画面から一つ前の GPTs 編集画面に戻って、普通のチャットのやり取りで動作しているかも確認してみましょう。シンプルに「合言葉を教えてください!」と聞くと、登録した GPT Action を利用して「AGI」だと日本語で応答してくれるでしょう。

ということで、非常に単純な実装ですが、ChatGPT から手元で動いている GPT Action の処理を呼び出すことができました 🎉

パラメーター・レスポンスを定義する例

合言葉を返すだけの実装は、パラメーターを受け取らず、応答も単純な文字列の例でした。もう少し複雑なものを動かしてみましょう。カスタム辞書を考慮して翻訳してくれるエージェントを Agents SDK を使ってつくってみます。

まず OpenAI Agents SDK をインストールしてください。

pip install -U openai-agents

先ほどの FastAPI アプリをこんな感じで書き換えてみましょう。与えられた日本語を日本語から英語への変換ルールを定めた辞書を考慮して翻訳してくれるシンプルなエージェント実装です。

from typing import Annotated
from fastapi import FastAPI, Form
from agents import Agent, Runner
from pydantic import BaseModel
import logging

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

app = FastAPI(
    
    servers=[{"url": "https://***.trycloudflare.com"}],
)


japanese_to_english = {
    "瀬良和弘": "Kaz Sera",
}
examples = "\n".join(
    [
        f"  * {jp} -> {en}"
        for jp, en in japanese_to_english.items()
    ]
)

instructions = f"""
# Role
You are an exceptional translator who understands the nuances of both Japanese and English. Your task is to translate the given Japanese text into English with a professional tone suited to business communications.

# Rules
Ensure that the following words are translated consistently as specified:
{examples}
"""

class Result(BaseModel):
    input: str
    output: str
    additional_notes: str

agent = Agent(
    name="Translator",
    instructions=instructions,
    output_type=Result,
)

@app.post(
    path="/translate",
    operation_id="translate",
    summary="Translate the given text into English",
)
async def translate(original_japanese_text: Annotated[str, Form()]) -> Result:
    run_result = await Runner.run(
        starting_agent=agent,
        input=original_japanese_text,
    )
    logger.info(f"Agent result: {run_result}")
    return run_result.final_output

ソースコードの変更を保存したら、もう一度 /openapi.json のフル URL をコピーして GPT Action の編集画面で “Import from URL” を再度実行してください。画面上で OpenAPI の定義がアップデートされ、”Available actions” のセクションでも “say-it” から “translate” にアクションが変わっていることが確認できるはずです。

生成された JSON データからパラメーターとレスポンスの定義を抜粋してみました。定義が Python コードからうまく生成されていることがわかります。”Import from URL” は都度実行する必要はありますが、二重管理を避けることができ、開発・運用がかなり楽になりそうです。

{
  "openapi": "3.1.0",
  "servers": [],
  "paths": {
    "/translate": {
      "post": {
        "summary": "Translate the given text into English",
        "operationId": "translate",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/Body_translate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Body_translate": {
        "properties": {
          "original_japanese_text": {
            "type": "string",
            "title": "Original Japanese Text"
          }
        },
        "type": "object",
        "required": [
          "original_japanese_text"
        ],
        "title": "Body_translate"
      },
      "Result": {
        "properties": {
          "input": {
            "type": "string",
            "title": "Input"
          },
          "output": {
            "type": "string",
            "title": "Output"
          },
          "additional_notes": {
            "type": "string",
            "title": "Additional Notes"
          }
        },
        "type": "object",
        "required": [
          "input",
          "output",
          "additional_notes"
        ],
        "title": "Result"
      }
    }
  }
}

ここでは “application/x-www-form-urlencoded” の例を使っていますが、”application/json” の方が Python のコードはシンプルになるかもしれません。

なお、ツールの呼び出しの精度が今一つ安定しないときは “summary” やパラメーターの命名などをよりわかりやすいものになるよう工夫してみてください。ここでの Result 型は output 以外使われておらず、デモンストレーション以外の意味はないのですが、もっと実用的なデータ構造を応答する場合には GPTs 側で効果的に利用されます。

安定したツール利用のために GPTs 編集画面で Instructions を以下のような内容に調整します。

You’re tasked to translate the user message text into English. You don’t need to do anything else. For the translation work, you must always use the available actions. When it’s successful, you must respond with only the English translation result. If something went wrong, you can tell what’s happened in Japanese.

変更すると、即座に右上の “Create” ボタンが “更新中” を示す表示になります。その更新が終わったら、右ペインのチャットボックスから「瀬良和弘と申します。」というメッセージを送信してみてください(もし違う例の方がよければ Python コード内の辞書を書き換えて違う言葉でテストしてみてください)。

ツールなしで翻訳した場合は「瀬良和弘」は一貫して「Kazuhiro Sera」と翻訳されますが、ツールを利用していれば「Kaz Sera」になるはずです。

ここで紹介したエージェントはあくまで最小のコードのデモであり、実際のところ Agents SDK を使わなくても実装可能なシンプルなものではありますが、より高度な処理を実装する際のひな形として使えるのではないかと思います。

マルチエージェント、ハンドオフ、ガードレールなど、色々と試してみてください。また、GPTs 側ではデフォルトのものからモデルを切り替えることはできませんが(記事投稿時点)、この Agents SDK を使った実装側では別のモデルを使うことも可能なので「GPT Actions の裏側では用途に合わせて最適なモデルを利用、GPTs 側でその出力を使った処理を行う」といった構成も考えられると思います。

Authentication の追加

この Python アプリに、認証機能を追加してみましょう。上で説明した通り、Basic 認証、Authorization ヘッダー(または任意のヘッダー名)での API キー検証、OAuth 認可のうち、いずれか一つを設定することができます。

ここでは Authorization: Bearer {api_key} ヘッダーの内容でリクエストを受け付けるか判定する処理を追加してみます。GPT Action の設定画面で Authentication の設定を “None” から “API Key” に変更、”Auth Type” は “Bearer” を指定、十分にセキュアな API トークンを生成して設定します。

同じ API キーを FastAPI サーバー側でも環境変数などから読み込むようにして、FastAPI のミドルウェアでチェックするようにします。

import os
from typing import Annotated
from fastapi import FastAPI, Form, Request, Response


api_key = os.environ.get("API_KEY")

app = FastAPI(
    
    servers=[{"url": "https://***.trycloudflare.com"}],
)


@app.middleware("http")
async def verify_api_key(request: Request, call_next):
    if (
        request.url.path != "/openapi.json"
        and request.headers.get("Authorization") != f"Bearer {api_key}"
    ):
        return Response(status_code=401)
    return await call_next(request)

これで、正しい API キーが設定されていない場合 401 エラーで応答されるようになりました。OAuth 認可の方法についても末尾で簡単に解説していますので、ご興味あればお読みください。

TypeScript + Node.js 実装例

上で紹介した Python の実装と同じものを TypeScript でも実装してみましょう。

色々と実装方法を調べてみましたが、tsoa と Express.js を組み合わせる方法が特に簡単だったので、その例を紹介します。

これから説明するアプリのプロジェクト構成はこのようになります。

├── build
│   ├── routes.ts
│   └── swagger.json
├── package-lock.json
├── package.json
├── src
│   ├── controllers.ts
│   └── main.ts
├── tsconfig.json
└── tsoa.json

まず、以下の内容の package.json を配置します。

{
  "name": "gpt-action-example-app",
  "version": "0.1",
  "scripts": {
    "start": "rm -rf build && tsoa routes && tsoa spec && tsx src/main.ts"
  },
  "keywords": [],
  "author": "OpenAI",
  "license": "MIT",
  "type": "commonjs",
  "dependencies": {
    "express": "^5.1.0",
    "tsoa": "^6.6.0"
  },
  "devDependencies": {
    "@types/express": "^5.0.1",
    "@types/node": "^22.14.0",
    "tsx": "^4.19.3",
    "typescript": "^5.8.2"
  }
}

TypeScript 用の tsconfig.json を配置します。細かいところはお好みで OK です。

{
  "compilerOptions": {
    "target": "es2016",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "module": "commonjs",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  }
}

次に tsoa 用の tsoa.json を配置します。Python の例と同様に ***.trycloudflare.com のところは実際の URL に差し替えてください。

{
  "entryFile": "src/controllers.ts",
  "noImplicitAdditionalProperties": "throw-on-extras",
  "controllerPathGlobs": ["src/controllers.ts", "src/**/*Controller.ts"],
  "spec": {
    "outputDirectory": "build",
    "specVersion": 3,
    "spec": {
      "servers": [{ "url": "https://***.trycloudflare.com" }]
    }
  },
  "routes": {
    "routesDir": "build"
  }
}

src/ ディレクトリを作成して、そこに src/controllers.tssrc/main.ts を配置します。


import { Controller, Get, Route } from "tsoa";

@Route("/say-it")
export class SayItController extends Controller {
  
  @Get("")
  public async sayIt(): Promisestring> {
    return "AGI";
  }
}

tsoa が build 配下にソースコードを出力するステップがあるので Controller が定義されているファイルと main のアプリを実行するソースファイルは分ける必要があります。


import express, { json, urlencoded } from "express";
import { RegisterRoutes } from "../build/routes";

export const app = express();

app.use(urlencoded({ extended: true }));
app.use(json());

RegisterRoutes(app);

const port = process.env.PORT || 3000;
app.listen(port, () =>
  console.log(`GPT Action app listening at http://localhost:${port}`)
);

準備完了です!

この状態で npm i && npm start を実行すると、http://localhost:3000 でアプリが起動するはずです。npm start(または npx tsoa spec)を実行すると OpenAPI の定義が build/swagger.json に出力されます。

この出力内容のうち "openapi": "3.0.0", になっているところを GPT Actions がサポートしている “3.1.0” に差し替えた上で GPT Actions の設定画面で貼り付けてください。macOS であれば cat build/swagger.json | sed 's/3.0.0/3.1.0/' | pbcopy でコピーして貼り付けるのが簡単です。

これで最低限の準備ができました。Python の例と同様に機能を追加してみてください。

最後に Authentication で選択できる OAuth の設定方法についても解説しておきます。

外部サービスとの OAuth 連携を行なう GPT Action の場合、OAuth フローで得られた API トークンを次回以降の GPT Actions 実行時で自動的に送信します。

このトークンは ChatGPT のユーザーごとに保持されます。

自分のトークンを破棄したい場合は GPTs の利用画面のメニューから Privacy Settings > Connected Accounts を選択し、表示されているアカウントの “Log out” をクリックすることで無効化できます。

カスタムの OAuth サーバーの例まで紹介すると長くなるので、この記事では Slack アカウントとのシンプルな連携を紹介します。Slack アカウントへのアクセスを許可し、「私の Slack アカウントのメールアドレスは何?」という質問に正しく応答する GPT Action をつくってみます。

Slack アプリの設定

まず、Slack 側の設定を行います。https://api.slack.com/apps にアクセスして、以下の YAML ファイルを使って Slack アプリ(= Slack 連携設定)を作成します。

g-TODO のところは GPTs の設定画面の URL が https://chatgpt.com/gpts/editor/g-67edf41338548191b049979de160719d であれば g-67edf41338548191b049979de160719d を設定してください。

display_information:
  name: My Slack Test GPT
oauth_config:
  redirect_urls:
    - https://chat.openai.com/aip/g-TODO/oauth/callback
  scopes:
    user:
      - openid
      - email
settings:
  org_deploy_enabled: false
  socket_mode_enabled: false
  token_rotation_enabled: false

Slack アプリが作成されたら Settings > Basic Information のページに遷移して、Client ID と Client Secret をコピーしておいてください。

もし上の手順で oauth_config.redirect_urls を変更し忘れた場合は Features > OAuth & Permissions のページに遷移して Redirect URLs のところの設定内容を更新してください。

GPT Actions の設定

GPTs の設定画面に戻って “Create new action” をクリックして GPT Action の設定画面へ遷移し、”None” になっている “Authentication” のところをクリック、”OAuth” に切り替え、以下の内容を入力して保存してください。

  • Client ID: 上の Slack アプリ管理画面に表示されていたもの
  • Client Secret: 同じく上の Slack アプリ管理画面に表示されていたもの
  • Authorization URL: https://slack.com/openid/connect/authorize
  • Token URL: https://slack.com/api/openid.connect.token
  • Scope: openid,email
  • Token Exchange Method: “Basic authorization header” を選択

これを保存したら OpenAPI の Schema は以下の内容を反映します。

openapi: 3.1.0
info:
  title: Slack OpenID Connect - userInfo
  description: Retrieve user information from Slack using OpenID Connect.
  version: 1.0.0

servers:
  - url: https://slack.com/api

paths:
  /openid.connect.userInfo:
    get:
      summary: Retrieve OpenID Connect user information
      operationId: getUserInfo
      description: This endpoint returns the connected user's Slack account information
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Successful user info response
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  sub:
                    type: string
                  name:
                    type: string
                  email:
                    type: string
                    format: email

この内容で保存して「私の Slack アカウントのメールアドレスは何?」と質問すれば slack.com へのアクセスを促され、アカウントが接続されたら、以降は接続した Slack アカウントのメールアドレスを知らせてくれます。

GPTs の “Instructions” を You're tasked with connecting a user's Slack account using the actions and providing the available information upon request. のような内容にして “Conversation starters” にも 私の Slack アカウントのメールアドレスは何? のような定型の質問文を設定しておくとテストがしやすいかもしれません。

動かすまでの手順が Slack の例よりも多いので、この記事では詳しく解説しませんが、Google スプレッドシートとの連携も検証したので簡単に紹介しておきます。GPTs リリース当初は制約があったようですが、この記事投稿時点では以下の設定で接続できるようになっています。利用する OpenAPI の定義は Google の開発者コミュニティの情報をあたってみてください。

  • Authorization URL: https://accounts.google.com/o/oauth2/auth
  • Token URL: https://oauth2.googleapis.com/token
  • Scope: https://www.googleapis.com/auth/spreadsheets

GPT Actions の OAuth の詳細については、こちらのドキュメントも参考にしてください。

GPTs の外部接続を伴う拡張は「何となくとっつきづらそう」というイメージだった方も多いかもしれませんが、想像よりも簡単であることを感じていただけたなら幸いです。

冒頭で MCP サーバーとの連携の計画についても触れた通り、OpenAI のプラットフォームはこれからも進化を続けていきます。アップデートがあり次第、また最新情報をわかりやすく解説していく予定ですので、ぜひご期待ください!

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

より良いCSSアニメーション – Codepen


CSSアニメーションルール。ただ見てください…Codepen lol。

しかし、それが存在しなかった(長い)時間がありました。私の古い仲間のジョナサン・スヌーク 2007年に書いた 彼はアニメーションがCSSに来るという考えがまったく好きではなかったが、持っていた 2009年までに彼の考えを変えました

彼らはそれらの初期から少し進化しました。彼らは現在GPUでアクセラレーションされています。プロパティにはベンダーのプレフィックスは必要ありません。カスタムプロパティの値など、より多くのプロパティをアニメーション化できます(特に それらを入力します)。しかし、彼らは変わっていません それ 多く、それはWebのクールなことの1つです。実際のWebプラットフォームのことは、私たちの足の下で劇的に変化することはなく、その知識が長生きしているため、学習する価値があります。

また、人々がそれらをどのように使用するか、ベストプラクティス、そして発見する必要がある巧妙なトリックがどのように使用するかです。

これが1つです!

ハロルド・クーパーによるブログの投稿を少し前に見て、CSSを使用したスピニング図と呼ばれました。それはそれ以来インターネットから去られましたが、ol ‘アーカイブはそれを捕まえて 私はそれからペンを作りました、後世のためにも。ハロルドは、このような3Dの外観の恩恵を受ける数学的な式を披露していました。

完全にアウトしました そこに、アニメーションGIFを使用しました。しかし、ハロルドはしませんでした:

数人の人々は、紡績図がJavaScriptやアニメーション画像形式を使用していないことに驚きを表明しました。HTMLとCSSだけです。

ハロルドのトリッキーのクールな部分の1つは、1つのアニメーションを使用して物事をスピンすることと、 そしてそれらをスピンします。文字の数字がどのように3Dスペースで移動しているように見えるかに注意してください。 2007年に誰もそれについて考えていませんでした、私はそれを伝えます。

私は最初にこの投稿をRSSで読んだことを覚えています アニメーションはRSSでも機能しました。 おそらくスタイリングが組み込まれたからでしょう blocks that my reader respected. So cool.


Josh Collinsworth wrote Ten tips for better CSS transitions and animations which is full of good practical stuff. Huge fan of #1: “Make them shorter than you think they should be”. I don’t think I’ve ever picked a transition-duration それは、私がそれで遊んだ時間と展開後であっても、それは低下しませんでした。

たくさんの素晴らしい例と現実世界のアドバイス!

「ブラウザのデフォルトを使用しないでください」などのアドバイスの一部は、より多くの特注のものに緩和を置き換える必要があることを意味します。 cublic-bezier 曲線。ジョシュは持っています より詳細な投稿 それについてもそれは非常に役立ちます。私はおそらくブラウザに頼っているのは、このことに関してはデフォルトが多すぎますが、カスタムカーブで再生すると、気分が悪くなることがあります。たぶん、私はちょうどコピロットが私に与えてくれた最初のものをとるべきではありません。実際にそれを理解してください。


聞いたことがないなら 暗くなった後、おそらく飛んでいるトースターのことを聞いたことがあります。それは、1990年代のこの象徴的なスクリーンセーバーであり、ええと、飛んでいるトースターが画面上の3Dのように見えるスペースで飛んでいます。実際、左上から左上まで。

良いニュース、ブライアン・ブラウン CSSでそれをしました、 とともに 暗いスクリーンセーバーの後のすべて

…Annnnnd彼は2014年にそれをしました。 (私はクリックするのが好きです 貢献者 リポジトリのページは、最初のコミットの年を明確に示しています。)このようなCSSのチャンクを見ることで、ヴィンテージの感触を得ることができます。

      -webkit-animation: fly 10s linear infinite;
         -moz-animation: fly 10s linear infinite;
          -ms-animation: fly 10s linear infinite;
           -o-animation: fly 10s linear infinite;
              animation: fly 10s linear infinite;

それがまさに私たちが転がっていた方法です。


非常に新しいことアラート。私はこれについてより深いダイビングをする必要がありますが、今ここで言及する価値があると思います。私はあなたが何を知っていると思います cubic-bezier() それは、私が文字通り上記のJoshの記事にリンクしているからです。

Cubic Bezierには4つのパラメーターがあります。もうない。それ以上。

ここの新しいことはです linear() これは、アニメーションのタイミング値の代替として機能し、任意の数の値をとることができます。 Ollie Williamsには素晴らしい記事があります、そして、私は彼が撮った引用をします。それは素晴らしいクイック要約だからです:

MDN 構文について説明しますlinear(0, 0.25 75%, 1) からの時間の75%をからの移行に費やす線形緩和関数を生成します 0.25 そして、最後の25%はから移行しています .251。」

より現実的な例は次のようになります:

animation-timing-function: linear(0, 0.218 2.1%, 0.862 6.5%, 1.114, 1.296 10.7%, 1.346, 1.37 12.9%, 1.373, 1.364 14.5%, 1.315 16.2%, 1.032 21.8%, 0.941 24%, 0.891 25.9%, 0.877, 0.869 27.8%, 0.87, 0.882 30.7%, 0.907 32.4%, 0.981 36.4%, 1.012 38.3%, 1.036,1.046 42.7% 44.1%, 1.042 45.7%, 0.996 53.3%, 0.988, 0.984 57.5%, 0.985 60.7%,1.001 68.1%, 1.006 72.2%, 0.998 86.7%, 1);

ファンシー!たぶん多分のように、これがあなたのためのツールによって生成される92%の確率があります これです、そして他の人たちが生まれる可能性があります。それを得る?春?

これらすべてのポイントは、それらの間に直線があります。これが、「線形」が名前である理由だと思います。しかし、それはあなたがそれが退屈でまっすぐな「線形」キーワードのように振る舞うだろうと思うので、それは一種のひどい名前です。しかたがない。

おそらく読むべきです CSSで複雑なアニメーション曲線を作成します linear() 緩和機能 Bramusによって。ベン・ホームズが作った 非常にクリックしたボタン クリックしてクリックします。

アダム・アーガイル 1分間の説明 おそらくあなたも正しいでしょう。


CSSネスティングが年齢になっていて、ブラウザのベンダーがこれらすべての世論調査を出して構文に投票できるようになったことを覚えていますか?一人一人が「サスのようなものになれますか?」そして、彼らは「いいえ」のようなもので、それから彼らはちょうどSASSのようにそれを作りました。

とにかく!

それが彼らがやっていたことだと思いました animation-composition ブラマスで 複数のアニメーション効果がどのように複合するかを指定します animation-composition、しかし、彼はそれをどのように使用するかを見せているだけです。

それは本当に雑草に少しですが、それは本当にアニメーションで時々起こるものです。複数のアニメーションが同じプロパティに影響する場合に役立ちます。 transform プロパティは、これを複雑にすることで有名です transform 要素を回転させているかもしれませんが、別の要素は要素を回転させている可能性があります translate それを動かしますが、彼らは過去に互いに上書きするので、要素などをネストする必要があります。今、あなたはできます replaceadd、 または accumulate 値、それは本当にかなりクールです。

私の最初のテストは、これがうまくいくと思うことでした:

button {
  position: relative;
  animation-composition: accumulate;

  &:hover {
    translate: 0 1px;
  }
  &:active {
    translate: 0 1px;
  }
}

しかし、いや、そのような擬似状態は他のものを完全に置き換えると思うので、ボタンはホバリングされていないと同時にアクティブではありませんか?私は知らないよ。正直なところ、とにかくトランジションよりもキーフレームで便利です。


わかりました、最後に約束します。優れたビデオ: アニメーションvs.数学。



フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

【なぜ安定する?】常識を覆す”2本プロペラ”のV字型ドローンが登場


ドローンといえば、プロペラを4つ搭載した「クアッドコプター」が常識とされてきました。

しかし2025年、そんな“常識”を真っ向から覆す新たな存在が現れました。

それが、ZeroZero Robotics社によって開発されたV字型バイコプター『Falcon Mini』です。

この機体は、なんとプロペラを2つしか持たず、それをV字に配置するという奇抜な設計を採用しています。

それでいて、空中で安定飛行し、滑らかな4K撮影までこなしてしまうのです。

2025年3月、クラウドファンディングサイト「Indiegogo」で発表されるやいなや瞬く間に目標金額を超え、世界中のドローンファンや映像制作者たちを驚かせました。

目次

  • 常識を覆すプロペラ2本のバイコプター
  • 驚くほどの安定感と美しい映像撮影

常識を覆すプロペラ2本のバイコプター

従来のクアッドコプターは、ドローン界の「完成された姿」と言われてきました

それもそのはずで、4つのプロペラによる対称設計は抜群の安定性をもたらし、ホバリングや前後左右の移動を高精度で実現できるからです。

一方で、欠点も存在していました。

プロペラが多いために構造が複雑で、故障のリスクも高くなります。

また、サイズが大きくなることで、持ち運びや収納に不便さが伴います。

さらに、動作音が大きいため、静かな撮影環境には不向きでした。

画像
「2本のプロペラ」という新しい挑戦的なスタイル / Credit:ZeroZero Robotics

これらの課題に挑んだのが、ZeroZero Robotics社です。

同社はこれまでにも、プロペラを機体内に格納した「Hover Camera」シリーズで注目を集めてきたスタートアップです。

今回の『Falcon Mini』では、2つのプロペラをV字に配置し、AI制御と可変チルト機構を融合することで、従来の4ローターと同等、あるいはそれ以上の飛行制御を可能にしました。

これにより、機体はわずか249gという超軽量化を達成しています。

画像
2本のプロペラでも自由自在に飛行できる / Credit:ZeroZero Robotics

さらに、折りたたみ式のウィング構造により、スマートフォンとほぼ同じ大きさに収まるコンパクトさも実現しています。

また動作音は62デシベルであり、48分間の充電で34分間の飛行が可能です。

そして何より注目できるのがプロペラが2つしかないとは思えない「抜群の安定感」です。

驚くほどの安定感と美しい映像撮影

画像
驚くほどの安定感を誇る / Credit:ZeroZero Robotics

Falcon Miniがなぜ2枚のプロペラで安定して飛行できるのか、その秘密は高度な制御技術にあります。

各プロペラは可動式で、AIが飛行状況に応じてリアルタイムに角度を微調整し、バランスを保つようになっています。

従来は4つのプロペラで行っていた安定化制御を、たった2つのローターとAIアルゴリズムが完璧に代替しているのです。

この技術により、Falcon Miniは風のある屋外でもぐらつかずに飛び続けることができ、ホバリングも極めて正確です。

画像
抜群の安定感から得られる美しい映像 / Credit:ZeroZero Robotics

そして、この安定性が、Falcon Mini最大の魅力である美しい映像撮影を支えています。

カメラは4K・30fps撮影が可能なジンバル付きカメラを搭載し、ブレのない美麗な映像を提供します。

また、AIによる被写体認識、追尾、構図補正が標準搭載されており、誰でも“プロっぽい”映像を簡単に撮ることができます。

さらに、被写体を追いかけるオートトラッキング機能や、構図を最適化する補助機能も全自動で搭載されています。

画像
撮影をサポートする機能も充実 / Credit:ZeroZero Robotics

ドローンは指示があれば自動的に離着陸することも可能です。

使用者にとって、まるで空飛ぶカメラマンが自分についてきてくれるような感覚でしょう。

ちなみに体価格は約399ドル(約5万8000円)であり、Indiegogoでは、早期購入者向けに249ドル(約3万6000円)という特価プランも登場しています。

全ての画像を見る

参考文献

Quick and efficient bicopter drone could dethrone its quadcopter cousins
https://newatlas.com/drones/zerozero-robotics-falcon-mini-bicopter-drone/

Falcon Mini – First V-Shaped Bi-Copter under 250g
https://www.indiegogo.com/projects/falcon-mini-first-v-shaped-bi-copter-under-250g#/

ライター

大倉康弘: 得意なジャンルはテクノロジー系。機械構造・生物構造・社会構造など構造を把握するのが好き。科学的で不思議なおもちゃにも目がない。趣味は読書で、読み始めたら朝になってるタイプ。

編集者

ナゾロジー 編集部

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

ポケットペア,MythicOwlが開発する配達アドベンチャー「Truckful / トラックフル」のパブリッシング担当に



ポケットペア,MythicOwlが開発する配達アドベンチャー「Truckful / トラックフル」のパブリッシング担当に

 ポケットペアは2025年4月7日,ポーランドのスタジオMythicOwlが開発するアドベンチャーゲーム「Truckful/トラックフル」のパブリッシングを担当すると発表した。本作は,トラックを運転して村人たちの依頼やクエストをこなしつつ,田舎町の謎を解き明かしていく配達アドベンチャーゲームだ。

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

「1億5,000万人の関心を維持したい」―米任天堂社長、スイッチ2発売後もスイッチ新作ソフトをサポートしていくと表明



「1億5,000万人の関心を維持したい」―米任天堂社長、スイッチ2発売後もスイッチ新作ソフトをサポートしていくと表明

「1億5,000万人の関心を維持したい」―米任天堂社長、スイッチ2発売後もスイッチ新作ソフトをサポートしていくと表明

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0