火曜日, 6月 10, 2025
No menu items!
ホーム ブログ ページ 4609

トランプ関税の導入で製造拠点を中国とベトナムに置く任天堂が大打撃を受ける、株価が一時10%近く暴落する事態に – GIGAZINE



メモ


アメリカのドナルド・トランプ大統領は2025年4月2日、世界各国からの輸入品に一律10%の関税をかけたうえで、国や地域ごとに異なる税率を上乗せする「相互関税」をかけることを発表しました。この影響で、発売日や詳細が発表されたばかりのNintendo Switch 2を販売する任天堂の株価も大きく下落しています。

Nintendo and Sony Shares Fall in Tariff-Induced Wipeout for Japan Stocks – Bloomberg
https://www.bloomberg.com/news/articles/2025-04-07/nintendo-plummets-10-in-tariff-induced-wipeout-for-japan-stocks

Trump’s Tariffs Cause Stocks in Japanese Video Game Companies to Collapse | Push Square
https://www.pushsquare.com/news/2025/04/trumps-tariffs-cause-stocks-in-japanese-video-game-companies-to-collapse


Mario enters trade wars as Nintendo readies Switch 2 launch
https://www.ft.com/content/a781c853-3fed-4dfc-b940-4137546180de

Today was a horrendous day for Japanese gaming companies on the stock market – – Gamereactor
https://www.gamereactor.eu/today-was-a-horrendous-day-for-japanese-gaming-companies-on-the-stock-market-1525663/

任天堂は、2017年~2021年の第1次トランプ政権が「世界の貿易システムを変革する」と打ち出して以来、生産拠点の一部を中国から他国へ移しており、調査会社・Bernsteinのアナリストであるロビン・ジュー氏によると、記事作成時点での任天堂のアメリカ向けハードウェアの半分以上はベトナムやカンボジアで製造されたものとのこと。ジュー氏は「東南アジアでの新たな拠点による組み立て能力の増強は、2025年のホリデーシーズンに十分な在庫を確保するための取り組み、ひいてはNintendo Switch 2の成功にとって重要になる可能性があります」と述べています。

しかし、トランプ大統領は中国やベトナム、カンボジアに対してそれぞれ34%、46%、49%と非常に高い関税を課しました。これにより、任天堂が大きな打撃を受けることは避けられません。実際に東京証券取引所プライム市場では、2024年4月4日から4月7日にかけて任天堂の株価は10%以上下落しています。


トランプ大統領は記者団に対し「関税の一時停止は考えていない」と伝えたほか、中国がアメリカの相互関税への対抗措置として「アメリカからのすべての輸入品に同じ34%の追加関税を課す」と発表したことを受け「中国が関税引き上げを撤回しない場合、アメリカは中国に対し4月9日から50%の追加関税を課す」と表明しています。


一方で任天堂はこうした高い関税に対応するため、2025年1月の時点から完成したNintendo Switch 2をベトナムからアメリカ国内の施設に輸送していることが報じられています。MSTファイナンシャルのアナリストであるデビッド・ギブソン氏は「任天堂は1月に完成したNintendo Switch 2をベトナムから5日間で合計38万3000台出荷し、そのすべてがアメリカに送られています。これは、流通システムのテストに加え、関税のリスクを先んじて回避するために行われたのではないかと推測されます。2月から3月にかけて、その出荷台数は大幅に増加するでしょう」と語りました。

なお、アメリカ国内でのNintendo Switch 2の予約注文の受付は2025年4月9日から開始される予定でしたが、任天堂は今回の相互関税の導入を受け、受付開始日時を延期することを発表しています。

任天堂がトランプ政権の関税引き上げを受けNintendo Switch 2の予約注文を延期 – GIGAZINE


今回の相互関税の導入によって大きな打撃を受けているのは任天堂だけでなく、コーエーテクモホールディングスバンダイナムコホールディングスセガサミーホールディングスカプコンスクウェア・エニックス・ホールディングスコナミグループなどの企業も軒並み株価が急落しています。特に、PlayStationなどを手がけるソニーグループの株価は、2025年4月4日から4月7日にかけて約10%の下落を記録しました。

この記事のタイトルとURLをコピーする



Source link

Views: 0

当てはまったら気をつけて…メンタルを疲弊させる「ブラックな職場環境」5選



当てはまったら気をつけて…メンタルを疲弊させる「ブラックな職場環境」5選

メンタルヘルスに悪影響を及ぼすブラックな職場環境や上司、同僚などの特徴を5つ解説します。



Source link

Views: 0

元Teslaの幹部Drew Baglinoの新しいスタートアップは、電気変圧器を再考しています



元Teslaの幹部Drew Baglinoの新しいスタートアップは、電気変圧器を再考しています

元テスラのエグゼクティブドリューバグリノは、電動グリッド用のソリッドステートトランスを開発する新しいスタートアップを持っていますAxios 報告されています

新しい会社、 ヘロンの力報告書によると、シリーズAの3,000万ドルから5,000万ドルを調達しており、山羊座の投資グループはラウンドをリードするために固定されています。

バグリノは、エロン・マスクがCEOを引き継ぐ2年前の2006年に会社で始まったテスラの長年の従業員でした。彼はランクを上げ、パワートレインとエネルギーの上級副社長に指名される前に、最初のモデルSのパワートレインとテスラのバッテリーストレージ製品のリーディングエンジニアリングを設計しました。

バックリーノはテスラを去った 昨年4月同時に、会社がスタッフの10%を解雇しました。

Heron Powerの設立では、Baglinoは1世紀以上にわたってあまり革新を見ていない電気グリッドの一部に取り組んでいます。その時点で変圧器はほとんど変わらず、コモディティ化されてきたため、それらの大半は現在海外で作られています。

固体変圧器は、既存の変圧器よりも能力があり、ソーラーパネルや風力タービンから生じる可能性のある電圧でのディップを調節します。また、はるかにコンパクトで、ある源から別の電源から迅速に移行することができ、積極的に管理し、グリッドの安定性を高めることができます。

ヘロン・パワーは、変圧器市場を揺るがすことを望んでいる唯一のスタートアップではありません。シンガポールに拠点を置くアンペサンドもそうです シリーズaを上げる過程で 閉じた後 1250万ドルのシードラウンド 2024年初頭。ヘロンと同様に、アンペサンドはテスラの卒業生もそのエグゼクティブランクの中で数えています。



Source link

Views: 0

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



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


Source link

Views: 0

今月のゲーム:2020年2月



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



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日から順次発売する。



Source link

Views: 0

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



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

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

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

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

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





Source link

Views: 0

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



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

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



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 のプラットフォームはこれからも進化を続けていきます。アップデートがあり次第、また最新情報をわかりやすく解説していく予定ですので、ぜひご期待ください!



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.数学。





Source link

Views: 0