月曜日, 6月 16, 2025
No menu items!
ホーム ブログ ページ 4876

スマホでサイトやアプリの広告を消し去って通信量節約&ネットライフが快適かつ安全になる「広告ブロッカーPro」を使ってみた – GIGAZINE



広告


スマートフォンでウェブサイトを閲覧したりアプリを使ったりすると、必ずといっていいほど広告が表示されます。しかし、広告の中には過度にセンシティブなものや怪しいものが含まれていたり、強制的に動画が再生されて通信量を消費したりすることもあり、困っている人も多いはず。「広告ブロッカーPro」はiPhoneやAndroidスマートフォンで使える広告ブロッカーで、ウェブサイトに表示される広告表示を削除することで通信量を約70%節約することができてお役立ちとのことで、果たしてどれだけ通信量が減るのかを確かめてみるべく、実際に使ってみました。

広告ブロッカーPro – Google Play のアプリ
https://play.google.com/store/apps/details?id=jp.snowlife01.android.ad_blocker


「広告ブロッカーPro」をApp Storeで
https://apps.apple.com/jp/app/広告ブロッカーpro/id6448680871


◆Android版「広告ブロッカーPro」を導入してみた
「広告ブロッカーPro」はAndroid版とiOS版が用意されています。今回はまずAndroid版を使ってみることにしてみました。Android版はウェブブラウザの広告ブロックが可能で、Google Playストアから500円で購入可能です。


購入してインストールした「広告ブロッカーPro」を起動します。VPN作成の注意書きが表示されるので、「OK」をタップ。


VPN接続のセットアップをリクエストされるので、「OK」をタップします。


「広告ブロッカーPro」の画面はこんな感じ。中央下部にあるボタンをタップすることで、広告ブロックのオン・オフを切り替えることができます。


まずは広告ブロック機能をオフにした状態で、ニュースサイトを閲覧してみました。記事がずらっと並ぶ途中に広告が差し込まれています。


広告ブロッカー機能を初めてオンにした時、広告ブロック機能についての説明が表示されます。Android版は、Google Playストアポリシーの制約があり、削除できるのはウェブブラウザアプリ内に表示される広告となっています。「広告ブロック機能とGoogleポリシーについて理解しました。」をタップします。


「広告ブロッカーPro」下部にあるボタンが緑色に点灯し、広告ブロック機能がオンになりました。


「広告ブロッカーPro」の広告ブロック機能をオンにした状態で、同じページの同じ部分を見てみると、表示されていた3つの広告がすべて削除され、スッキリした見た目に。


今度は広告ブロック機能をオフにした状態で、広告が表示されるゲーム攻略サイトをGoogle Chromeで閲覧してみました。以下は赤い枠で囲った部分に広告が表示されています。広告が画面の大部分を占めたり、スクロールするウェブサイト画面でタッチしやすい右下に表示されたりしており、サイト閲覧の体験はかなり下がってしまいます。


通信量を測定するアプリでチェックしたところ、ページの一番下までスクロールした状態で通信量は35MBでした。


次に、「広告ブロッカーPro」の広告ブロック機能をオンにした状態で、同じようにゲーム攻略サイトにアクセスし、ページの最後までスクロールしてみました。以下の画像のように、かぶさって表示されていた広告が削除され、大型のバナー広告があった場所は空白になっています。


通信量測定アプリをリセットして再測定した結果は7.31MBで、広告を表示した時と比べて約80%削減できた計算になります。


◆Android版広告ブロッカーProは便利な機能が充実
「広告ブロッカーPro」のAndroid版はGoogleのポリシーによる制約で、ウェブブラウザ内の広告のみが削除対象となっています。しかし、Android版には「通知バーへの表示」や「オートスイッチ」といった便利な機能が搭載されています。

通知バーへの表示をオンにするには、「広告ブロッカーPro」の画面から「通知バー設定」をタップします。


初回時は権限の許可を求められるので、画面下部に表示される「通知」をタップ。


通知の送信を許可するかを尋ねられるので、「許可」をタップ。


「広告ブロッカーPro」の画面に戻るので、通知バー設定で「広告ブロック動作中は表示する」をタップします。


すると、広告ブロック機能をオンにした状態であれば、以下のように通知欄に「広告ブロッカーPro」の通知が表示されます。この通知欄ではブロックした広告の数がチェックできるほか、タップすることで広告ブロック機能をオフにすることが可能です。


また、オートスイッチ機能をオンにすることで、指定したブラウザを起動した時に自動で広告ブロック機能をオンにすることができます。「広告ブロッカーPro」の画面から「オートスイッチ」をタップします。


オートスイッチ機能の説明が表示されるので、「理解して有効にする」をタップ。


初回のみ権限の許可を求められるので、「使用状況へのアクセス」をタップ。


使用状況へのアクセス画面が表示されるので、「広告ブロッカーPro」をタップします。


「使用状況へのアクセスを許可」をタップしてオンにします。


「広告ブロッカーPro」の画面に戻り、「オートスイッチ」をタップすることでオートスイッチ機能をオンにできます。


「オートスイッチ設定」では、オートスイッチ機能を有効にするウェブブラウザを選択できます。


オートスイッチ機能を有効にしたいウェブブラウザ名をタップしてスイッチをオンにすればOKです。


◆iOS版広告ブロッカーProを使ってみる
今度はiOS版を使ってみるべく、「広告ブロッカーPro」をApp Storeで購入しました。価格は500円です。


インストールして起動したiOS版「広告ブロッカーPro」の画面はこんな感じ。iOS版には、ウェブブラウザ内の広告表示を削除する「Safari広告ブロック」に加えて、ブラウザ以外のアプリ内に表示される広告を削除する「DNSブロックサーバー」という機能が搭載されています。


「Safari広告ブロック」はまず機能拡張の形式で導入する必要があります。iOSの設定から「アプリ」をタップ。


アプリ一覧から「Safari」をタップ。


「機能拡張」をタップ。


「広告ブロッカーPro」が表示されているので、タップします。


「機能拡張を許可」をタップし、スイッチをオンにします。


広告ブロック機能を確かめるため、「Safari広告ブロック」をオフにした状態で、ゲーム攻略サイトにアクセスしてみました。以下の赤い枠のように、広告が複数表示されています。


「広告ブロッカーPro」の画面で、「Safari広告ブロック」をタップしてスイッチをオンにします。


先ほどアクセスしたゲーム攻略サイトを再読み込みすると、以下のように広告表示がキレイさっぱりと消えていました。


次に、ウェブブラウザ以外のアプリに表示される広告をチェックしてみます。マンガを読めるアプリでは、マンガを1話分読み終わった後に広告が表示されることがあります。


マンガを1話分読み終えてからデータ通信量を測定できるアプリでチェックしたところ、通信量は12MBでした。


そこで、「広告ブロッカーPro」の「DNSブロックサーバー」機能をオンにして、ウェブブラウザ以外のアプリ内に表示される広告を削除してみます。「DNSブロックサーバー」機能をオンにするためには、あらかじめiOSでDNSサーバーの設定を行う必要があります。iOSの設定から「一般」を選択。


「VPNとデバイス管理」をタップします。


DNSの欄に「Ad Blocker Pro」と表示されているのでタップすると、青いチェックマークが表示されました。


「広告ブロッカーPro」の画面で、「DNSブロックサーバー」をオンにします。


マンガアプリを立ち上げて、同じマンガを1話分読んでみたところ、最後に表示される広告が削除されていました。


「DNSブロックサーバー」機能をオンにして広告を削除したところ、通信量は2.9MBに減っていました。


今度は「DNSブロックサーバー」機能をオフにして、ニュースアプリを起動してみました。以下の画像のように、記事と記事の間に広告が差し込まれています。


上から下まで5回スクロールした時点での通信量は19MBでした。


つづいて、「DNSブロックサーバー」機能をオンにしてニュースアプリを表示したところが以下。記事の間に挟まれていた広告が消えています。


「DNSブロックサーバー」機能をオフにした状態での通信量は13MBで、およそ32%の通信量を削減できたことになります。


「広告ブロッカーPro」を使ってみたところ、広告を削除したことで通信量が大きく節約され、快適にウェブサイトを閲覧することができるようになりました。追加課金や煩わしい案内が一切なく、サポートもすべて日本語に対応していて安心して使えるのも、「広告ブロッカーPro」のうれしいポイント。Android版はウェブブラウザ専用で、アプリ内広告はブロックできませんが、さまざまなブラウザアプリに対応している上に「ネット閲覧中の広告を少しでも減らしたい」という人には便利な機能が豊富でおすすめ。一方、iOS版はウェブブラウザに加え、他のアプリ内の広告もブロックできるため、さらに高い効果が期待できます。普段多くのアプリやサイトを使うという人であれば、広告ブロッカーProを使うことで、より快適でスムーズなスマートフォン体験を実感できます。

「広告ブロッカーPro」は買い切り型の有料アプリで、価格は500円。Android版はGoogle Playストアで、iOS版はApp Storeで購入可能です。

広告ブロッカーPro – Google Play のアプリ
https://play.google.com/store/apps/details?id=jp.snowlife01.android.ad_blocker


「広告ブロッカーPro」をApp Storeで
https://apps.apple.com/jp/app/広告ブロッカーpro/id6448680871

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



Source link

Views: 0

OpenAIとAzureAIのSDKを整理する #.NET – Qiita



OpenAIとAzureAIのSDKを整理する #.NET - Qiita

AI アプリを作ろうとすると、沢山の種類のSDKが出てきて混乱します。2025年4月の時点での整理をしたのでメモっておきます。立場上、AzureのAIリソースのSDKについても整理します。

Azure AI Foundry 上にOpenAIのGPT-4o 2024-11-20をデプロイしてあります。基本的にこのGPT-4oへ通信します。(一部異なるバージョンでないと動かないものあり)

Python, TypeScript, C#の3種類について調べています。、ランタイムやVS Codeのプラグインなど各環境に必要なセットアップはご自身で行ってください。

Python

Python

Pythonのバージョンは3.13.2です。
VSCode でコードを格納するフォルダを開きます。フォルダで仮想環境を設定しておくことをお勧めします。venvなどお好きなやり方でどうぞ。

TypeScript

TypeScript

Node.jsのバージョンは23.11.0です。
VSCode でコードを格納するフォルダを開き、次の手順でTypeScript環境を作成します。

1. ターミナルを開き次のコマンドを入力

@type/nodeの後ろの@22は、私のマシンのNode.jsのバージョンに合わせたものです。ご自身の環境に併せて数字を変更してください。

npm init -y
npm install --save-dev typescript @types/node@22
npx tsc --init

2. tsconfig.jsonを修正

次の内容にします。ソースを./srcに配置し、tsファイルをコンパイルした結果を./distに置く設定を追加しています。また、一番下のincludeでコンパイル対象のファイルを、excludeでコンパイル対象外のフォルダを指定しています。ごく一般的な設定だと思います。

tsconfig.json

{
  "compilerOptions": {
    "target": "es2018", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    "module": "commonjs", /* Specify what module code is generated. */
    "rootDir": "./src", /* Specify the root folder within your source files. */
    "outDir": "./dist", /* Specify an output folder for all emitted files. */
    "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
    "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
    "strict": true, /* Enable all strict type-checking options. */
    "skipLibCheck": true /* Skip type checking all .d.ts files. */
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules"
  ]
}

3. package.jsonを編集

コンパイルとビルドを行うためのコマンドを追加します。

package.json

"scripts": {
+    "build": "tsc",
+    "start": "node ./dist/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
}

4. テスト

srcフォルダをプロジェクト(VSCodeで開いたフォルダ)直下に作成し、その中にindex.tsファイルを作成し、次の内容を貼り付けます。

src/index.ts

const greet = (name: string) => {
    console.log("Hello, " + name + "!");
}

greet("World");

ターミナルで次のコマンドを入力します。

プロジェクトにdistフォルダが作成され、中を開くとindex.jsファイルがいると思います。実行します。

Hello World!が表示されれば準備OKです。

が、人によっては毎回ビルドと実行コマンドを叩くのが面倒な方もいるでしょう。その場合はHotReloadできるようにしておくこともできます。

ts-node-dev をインストールします。

npm install --save-dev ts-node-dev  

package.jsonのstartコマンドを変更します。

package.json

  "scripts": {
    "build": "tsc",
    "start": "node ./dist/index.js",
+    "start:dev": "ts-node-dev --respawn --transpile-only src/index.ts",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

次のコマンドを実行します。

実行しっぱなしになると思います。試しにindex.tsファイルを変更し、保存してみてください。すると即時にコンパイルして実行してくれることがわかるかと思います。

C#

C#

.NET のバージョンは .NET 9 を使用しています。.NET8以降であれば問題なく動作すると思います。

このSDKはWebAPIとして公開されているGPT-4oなどのOpenAI社のモデルと通信するためのものです。同じWebAPI仕様を備えている場合はOpenAI社以外のモデルをこのSDKで操作可能な場合もあります。

モデルと直接通信するこのSDKは最初にリリースされたものですが、これから新規アプリケーションを作成する場合は後述のOpenAI Response APIの使用が推奨されています。

Python

参考情報:クイックスタート: Azure OpenAI Service で GPT-35-Turbo と GPT-4 を使い始める

依存関係をpipでインストールします。レスポンスはStreamingとして受け取るにしました。

pip install -r requirements.txt

次の実装でAzure上のOpenAIとやり取りします。

main.py

from openai import AzureOpenAI

api_version = "2024-12-01-preview"
endpoint = ""
apikey = ""

client = AzureOpenAI(
    api_version=api_version,
    azure_endpoint=endpoint,
    api_key=apikey
)

stream_response = client.chat.completions.create(
    messages=[
        {
            "role": "system",
            "content": "You are a helpful assistant.",
        },
        {
            "role": "user",
            "content": "シアトルに行きます。お勧めの観光スポットは?",
        }
    ],
    max_tokens=4096,
    temperature=1.0,
    top_p=1.0,
    model="gpt-4o",
    stream=True
)

for chunk in stream_response:
    if chunk.choices and (content := chunk.choices[0].delta.content) is not None:
        print(content, end="", flush=True)

client.close()
TypeScript

npmでパッケージをインストールします。

npm install openai @azure/openai

次の実装でAzure上のOpenAIとやり取りします。

index.ts

import { AzureOpenAI } from "openai";

export async function main() {
    const endpoint = "";
    const apiKey = "";
    const deployment = "gpt-4o";
    const modelName = "gpt-4o";
    const apiVersion = "2024-10-21";
    const client = new AzureOpenAI({ endpoint, apiKey, deployment, apiVersion });

    const response = await client.chat.completions.create({
        messages: [
            { role: "system", content: "You are a helpful assistant." },
            { role: "user", content: "シアトルに行きます。お勧めの観光スポットは?" }
        ],
        max_tokens: 4096,
        temperature: 1,
        top_p: 1,
        model: modelName,
        stream: true
    });

    if (response?.error !== undefined && response.status !== "200") {
        throw response.error;
    }

    for await (const chunk of response) {
        process.stdout.write(chunk?.choices?.[0]?.delta?.content ?? '');
    }

}

main().catch((err) => {
    console.error("The sample encountered an error:", err);
});
C#

Nuget でパッケージをインストールします。

dotnet add package Azure.AI.OpenAI
dotnet add package Azure.Core

次の実装でAzure上のOpenAIとやり取りします。

Program.cs

using Azure;
using Azure.AI.OpenAI;
using OpenAI.Chat;

var endpoint = new Uri("");
var deploymentName = "gpt-4o";
var apiKey = "";

AzureOpenAIClient azureClient = new(
    endpoint: endpoint,
    credential: new AzureKeyCredential(apiKey));

var chatClient = azureClient.GetChatClient(deploymentName);

var requestOptions = new ChatCompletionOptions()
{
    MaxOutputTokenCount = 4096,
    Temperature = 0.7f,
//    TopP = 1.0f,
};

ListChatMessage> messages =
[
    new SystemChatMessage("You are a helpful assistant."),
    new UserChatMessage("シアトルに行きます。お勧めの観光スポットは?")
];

await foreach(var update in chatClient.CompleteChatStreamingAsync(messages, requestOptions))
{
    System.Console.Write(update.ContentUpdate.FirstOrDefault()?.Text);
}

Azureは次の2つの環境にデプロイされたモデルに対して共通のAPIを提供しています。

  1. Azure AI Foundry
  2. Azure Machin Learning Studio

その共通のAPIのことをAzure AI Model Inference APIと呼びます。日本語ではモデル推論APIとも呼ばれます。このAPIはOpenAI社のモデルだけではなく、上記2つの環境にデプロイされたOpenAI以外のモデルとの通信も行えるのがOpenAI社のSDKを使用する場合との大きな違いです。

Azure AI Model Inference APIはREST APIです。これを便利に扱えるようにしたのがAzure AI Inference SDKです。なぜかSDK名からは「Model」が欠落しています。

Supported programming languages for models in Azure AI Model Inference

Python

依存関係をpipでインストールします。共通のAPI仕様なのでopenaiパッケージは必要ありません。

pip install -r requirements.txt

次の実装でAzure上のOpenAIとやり取りします。

main.py

from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential

endpoint = ""
apikey = "YOUR_OPENAI_APIKEY"

client = ChatCompletionsClient(endpoint=endpoint, credential=AzureKeyCredential(apikey))

response = client.complete(
    max_tokens=4096,
    temperature=0.7,
    top_p=1.0,
    model="gpt-4o",
    messages=[
        SystemMessage("You are a helpful assistant."),
        UserMessage("シアトルに行きます。お勧めの観光スポットは?"),
    ],
    stream=True,
)

for chunk in response:
    if chunk.choices and (content:= chunk.choices[0].delta.content):
        print(content or "", end="", flush=True)

client.close()
TypeScript

npmで4つパッケージをインストールします。

npm install @azure-rest/ai-inference @azure/core-auth @azure/core-sse @azure-rest/core-client

このうち、後ろの2つ @azure/core-sse @azure-rest/core-client は Streaming 用のライブラリなので必須ではありません。

次の実装でAzure上のOpenAIとやり取りします。

index.ts

import ModelClient from "@azure-rest/ai-inference";
import { createSseStream } from "@azure/core-sse";
import { createRestError } from "@azure-rest/core-client";
import { AzureKeyCredential } from "@azure/core-auth";

const endpoint = "";
const modelName = "gpt-4o";
const apiKey = "";

export async function main() {

    const client = new ModelClient(endpoint, new AzureKeyCredential(apiKey));

    const response = await client.path("/chat/completions").post({
        body: {
            messages: [
                { role: "system", content: "You are a helpful assistant." },
                { role: "user", content: "シアトルに行きます。お勧めの観光スポットは?" }
            ],
            max_tokens: 4096,
            temperature: 1,
            top_p: 1,
            model: modelName,
            stream: true
        }
    }).asNodeStream();

    const stream = response.body;
    if (!stream) {
        throw new Error("The response stream is undefined");
    }

    if (response.status !== "200") {
        throw createRestError(response);
    }

    const sses = createSseStream(stream as IncomingMessage);

    for await (const event of sses) {
        if (event.data === "[DONE]") {
            return;
        }
        for (const choice of JSON.parse(event.data).choices) {
            process.stdout.write(choice.delta?.content ?? "");
        }
    }
}

main().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Streaming用の実装がちょっとわかりにくいのは残念ですね。

C#

Nuget で次のパッケージをインストールします。共通のAPI仕様なのでAzure.AI.OpenAIパッケージは必要ありません。

dotnet add package Azure.AI.Inference
dotnet add package Azure.Core

次の実装でOpenAIのモデルとやり取りします。

Program.cs

using Azure;
using Azure.AI.Inference;

var endpoint = new Uri("");
var credential = new AzureKeyCredential("");
var model = "gpt-4o";

var client = new ChatCompletionsClient(
    endpoint,
    credential);
    
var requestOptions = new ChatCompletionsOptions()
{
    Messages =
    {
        new ChatRequestUserMessage("シアトルに行きます。お勧めの観光スポットは?")
    },
    MaxTokens = 4096,
    Temperature = 1.0f,
//    NucleusSamplingFactor = 1.0f,
    Model = model
};

StreamingResponseStreamingChatCompletionsUpdate> response = await client.CompleteStreamingAsync(requestOptions);

await foreach (var update in response)
{
    System.Console.Write(update.ContentUpdate);    
}

2024年の秋ごろに突如出てきた.NETのSDKです。名前からAzureが消えている点がポイントで、このSDKはかなり意欲的なものです。現在(2025年4月)は次の4種類のサービスとの通信を抽象化するレイヤーを提供しています。

  1. OpenAI
  2. Azure OpenAI
  3. Azure AI Inference
  4. Ollama(SLM・LLMローカル実行環境)

近い将来、この4種類に加えて様々なモデル、他社ISVホスティングのモデルもこのSDKで扱えるようになる見込みです。(Semantic Kernelのモデル抽象化機能をこちらへ持っていくるため)

このSDKはただモデルと通信するだけではなくて様々な便利機能があり、Semantic Kernelを置き換える勢いですが、ここではただモデルと通信だけしてみます。

※.NET専用のSDKです。

C#

Nuget で次のパッケージをインストールします。

dotnet add package Azure.AI.OpenAI
dotnet add package Azure.Core
dotnet add package Microsoft.Extensions.AI.OpenAI

AI Inference SDKの時はOpenAI仕様を気にしなくてよかったのですが、Microsoft.Extensions.AIの場合は使用するモデル用のパッケージが必要となります。

次の実装でOpenAIのモデルとやり取りします。

Program.cs

using Azure;
using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;

var endpoint = new Uri("");
var deploymentName = "gpt-4o";
var apiKey = "";

IChatClient chatClient =
    new AzureOpenAIClient(endpoint, new AzureKeyCredential(apiKey))
        .AsChatClient(deploymentName);

var chatOptions = new ChatOptions()
{
    MaxOutputTokens = 4096,
    Temperature = 0.7f,
    //    TopP = 1.0f,
};

await foreach(var update in chatClient.GetStreamingResponseAsync("シアトルに行きます。お勧めの観光スポットは?", chatOptions))
{
    Console.Write(update.Text);
}

Azure AI Foundryはプロジェクトという単位でデータやデプロイしたAIモデル、Azure AI Searchなどの外部リソースへの接続をひとまとめにします。そしてAzure AI Foundry SDKは、次の3つをひとまとめに総称したものです。

  1. Azure AI Projects SDK(プロジェクトの管理, Azure AI Agent Serviceの操作)
  2. 前述のAzure AI Inference SDK
  3. 評価用のAzure AI Evaluation SDK

Get started with projects

AIモデルと通信するSDKではないのですが、ここではAzure AI Projects SDKを使ってプロジェクトから情報を取得し、そのプロジェクトにデプロイしたモデルとの通信についてみてみます。

※ TypeScript用のSDKはリリースされていません。(2025年4月)

Python

requirements.txt

azure-ai-projects
azure-identity
openai
aiohttp

aiohttpは非同期アクセスをするためにインストールしています。

main.py

import asyncio
from azure.identity.aio import DefaultAzureCredential
from azure.ai.projects.aio import AIProjectClient

async def main():
    project_connection_string=""

    project: AIProjectClient = AIProjectClient.from_connection_string(
        conn_str=project_connection_string,
        credential=DefaultAzureCredential())

    openai = await project.inference.get_azure_openai_client(api_version="2025-01-01-preview")
    response = await openai.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "You are a helpful writing assistant"},
            {"role": "user", "content": "シアトルに行きます。お勧めの観光スポットは?"},
        ],
        stream=True
    )

    async for chunk in response:
        if chunk.choices and (content:= chunk.choices[0].delta.content):
            print(content or "", end="", flush=True)

    await openai.close()
    await project.close()


asyncio.run(main())

OpenAIのSDKではなく、Azure AI Inference SDKを使うこともできます。

requirements.txt

azure-ai-projects
azure-identity
aiohttp
azure-ai-inference

main.py

import asyncio
from azure.identity.aio import DefaultAzureCredential
from azure.ai.projects.aio import AIProjectClient

async def main():
    project_connection_string=""

    project: AIProjectClient = AIProjectClient.from_connection_string(
        conn_str=project_connection_string,
        credential=DefaultAzureCredential())

    chat = await project.inference.get_chat_completions_client()

    # run a chat completion using the inferencing client
    response = await chat.complete(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "You are a helpful writing assistant"},
            {"role": "user", "content": "シアトルに行きます。お勧めの観光スポットは?"},
        ],
        stream=True,
    )

    async for chunk in response:
        if chunk.choices and (content:= chunk.choices[0].delta.content):
            print(content or "", end="", flush=True)

    await chat.close()
    await project.close()

asyncio.run(main())
C#
dotnet add package Azure.AI.OpenAI
dotnet add package Azure.AI.Projects

Program.cs

using Azure;
using Azure.AI.OpenAI;
using Azure.AI.Projects;
using Azure.Identity;
using OpenAI.Chat;

var deploymentName = "gpt-4o";
var connectionString = "";
var projectClient = new AIProjectClient(connectionString, new DefaultAzureCredential());

var connections = projectClient.GetConnectionsClient();
ConnectionResponse connection = connections.GetDefaultConnection(ConnectionType.AzureOpenAI, true);
var properties = connection.Properties as ConnectionPropertiesApiKeyAuth;

if (properties == null) throw new Exception("Invalid auth type, expected API key auth");

// Create and use an Azure OpenAI client
AzureOpenAIClient azureOpenAiClient = new(
    new Uri(properties.Target),
    new AzureKeyCredential(properties.Credentials.Key));

// This must match the custom deployment name you chose for your model
var chatClient = azureOpenAiClient.GetChatClient(deploymentName);

var requestOptions = new ChatCompletionOptions()
{
    MaxOutputTokenCount = 4096,
    Temperature = 0.7f,
//    TopP = 1.0f,
};

ListChatMessage> messages =
[
    new SystemChatMessage("You are a helpful assistant."),
    new UserChatMessage("シアトルに行きます。お勧めの観光スポットは?")
];

await foreach (var update in chatClient.CompleteChatStreamingAsync(messages, requestOptions))
{
    Console.Write(update.ContentUpdate.FirstOrDefault()?.Text);
}


やけに長ったらしくなりましたが、よくよく見てみると、AI Foundryのプロジェクトに接続して、AzureOpenAIのAPI KEYを取得して、そのKEYでOpenAI用のSDKを使ってモデルに接続してるだけです。

ということは別にOpenAI用のSDKじゃなくても、AI Infrerence SDKでも Microsoft.Extensions.AIのどちらを使用することも可能だ、ということです。AI Inference SDKを使う場合、便利な拡張メソッドが用意されていて、もっと簡単に実装することができる・・・はずなんですが、バグで動きません。

Issue登録されており、StatusはClosedになっていますが解決していません。(ver 1.0.0-beta.6時点)

[BUG]: No serverless connection error on AIProjectClient.GetChatCompletionsClient

dotnet add package Azure.AI.Inference
dotnet add package Azure.AI.Projects

この実装で動くはずなのですが、動きませんので注意しましょう。

Program.cs

using Azure.AI.Inference;
using Azure.AI.Projects;
using Azure.Identity;

var deploymentName = "gpt-4o";
var connectionString = "";
var projectClient = new AIProjectClient(connectionString, new DefaultAzureCredential());

ChatCompletionsClient chatClient = projectClient.GetChatCompletionsClient();

var requestOptions = new ChatCompletionsOptions()
{
    Messages =
    {
        new ChatRequestSystemMessage("You are a helpful assistant."),
        new ChatRequestUserMessage("シアトルに行きます。お勧めの観光スポットは?"),
    },
    MaxTokens = 4096,
    Temperature = 0.7f,
//    NucleusSamplingFactor = 1.0f,
    Model = deploymentName
};

var response = await chatClient.CompleteStreamingAsync(requestOptions);

await foreach (var update in response)
{
    Console.Write(update.ContentUpdate);
}

2025年3月に登場したAssistant APIとChat Completion API を1つにまとめた感じのAPIです。Chat Completion APIの上位互換に相当するそうなので、今後はResponse APIを使うことが推奨されるようです。

OpenAI Developer quickstart
Azure OpenAI Responses API

※ C#用のSDKはリリースされていません。(2025年4月)

実装の前に、デプロイ済みのGPT-4oのリージョンバージョンに注意してください。

Python
pip install -r requirements.txt

既にopenaiインストール済みの場合はUpgradeが必要です。

pip install --upgrade openai

main.py

from openai import AzureOpenAI

client = AzureOpenAI(
    api_key="",  
    api_version="2025-03-01-preview",
    azure_endpoint = ""
    )

stream_response = client.responses.create(
    max_output_tokens=4096,
    temperature=1.0,
#    top_p=1.0,
    model="gpt-4o", # replace with your model deployment name 
    input="シアトルに行きます。お勧めの観光スポットは?",
    stream=True,
)

for event in stream_response:
    if event.type == 'response.output_text.delta':
        print(event.delta, end="", flush=True)

stream_response.close()
client.close()
TypeScript
npm install openai @azure/openai

index.ts

import { AzureOpenAI } from "openai";

export async function main() {

    const endpoint = "";
    const apiKey = "YOUR_OPENAI_APIKEY";
    const deployment = "gpt-4o";
    const modelName = "gpt-4o";
    const apiVersion = "2025-03-01-preview";
    const client = new AzureOpenAI({ endpoint, apiKey, deployment, apiVersion });

    const response = await client.responses.create({
        input: "シアトルに行きます。お勧めの観光スポットは?",
        max_output_tokens: 4096,
        temperature: 1,
        //        top_p: 1,
        model: modelName,
        stream: true
    });

    for await (const event of response) {
        if (event.type === 'response.output_text.delta') {
            process.stdout.write(event.delta ?? '');
        }

    }
}

main().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Python、TypeScriptのどちらもstreamの結果はイベントオブジェクトなので、どのイベントが返ってきているのか判定が必要になっています。

Agentの機能は多いので簡単に整理することはできません。ここでAgent越しにモデルと通信するだけのシンプルな場合についてやり方を見てみましょう。

OpenAI Agents SDK

OpenAI Agents SDKは、Agentを定義し、それをRunnerに渡すことで処理を実行します。今回、Azure上にデプロイされたOpenAIのモデルを扱う実装をします。Azure AI Agent Serviceを使用する必要はありません。

※ OpenAI Agents SDKにTypeScript, C#版はありません。(2025年4月)

Python
pip install -r requirements.txt

main.py

from openai import AsyncAzureOpenAI
from openai.types.responses import ResponseTextDeltaEvent
from agents import set_default_openai_client, Agent, Runner
import asyncio

api_version = "2025-03-01-preview"
endpoint = ""
apikey = ""

async def main():
    openai_client = AsyncAzureOpenAI(
        api_key=apikey,
        api_version=api_version,
        azure_endpoint=endpoint,
    )

    # Set the default OpenAI client for the Agents SDK
    # set trace off because of recomendation from OpenAI
    set_default_openai_client(openai_client, use_for_tracing=False)

    agent = Agent(
        name="Assistant",
        instructions="You are a helpful assistant.",
        model="gpt-4o"
    )

    result = Runner.run_streamed(agent, "シアトルに行きます。おすすめの観光スポットは?")

    async for event in result.stream_events():
        if event.type == "raw_response_event" and isinstance(event.data, ResponseTextDeltaEvent):
            print(event.data.delta, end="", flush=True)

if __name__ == "__main__":
    asyncio.run(main())

set_default_openai_client(openai_client, use_for_tracing=False)use_for_tracing=Falseが気になると思います。こちらはplatform.openai.com以外でのLLMを使用する場合はtraceをoffにすることがOpenAI社から推奨されているためです。

推奨を無視すると、Traceできないエラーがたくさん表示されてしまいますので、実質必須設定です。

Using other LLM providers

Azure AI Agent Serviceを扱うSDK

Azure AI Agent Serviceは、Azure AI Foundryにプロジェクトを作成し、モデルを事前にデプロイしておく必要があります。使用可能なモデルとリージョンは限定されていますので、ご確認ください。

Azure AI エージェント サービスでサポートされているモデル

Azure (AI Project) SDKのサンプルコードではGPT-4o 2024-05-13をデプロイ済みの環境に対して動作確認しています。サンプルコード内でのデプロイ名は”gpt-4o-0513″です。

OpenAI SDKはGpt-4o 2024-11-20で動作確認しています。(2024-05-13では動きません)

1. Azure (AI Project) SDK

Azure AI Project SDKは Azure AI Agent Serviceを操作するSDKでもあります。名前が悪いのでいずれ分離されるかもしれません。MS Learn の Azure AI Agent ServiceのクイックスタートAzure SDKと記載されているのはAzure AI Project SDK のことです。

Python

requirements.txt

azure-ai-projects
azure-identity
pip install -r requirements.txt

main.py

from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MessageDeltaChunk, AgentStreamEvent
from azure.identity import DefaultAzureCredential

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(), conn_str=""
)

with project_client:
    try:
        agent = project_client.agents.create_agent(
            name="MyAgent",
            model="gpt-4o-0513",
            instructions="You are a helpful assistant.",
        )
        print(f"Created agent, agent ID: {agent.id}")

        thread = project_client.agents.create_thread()
        print(f"Created thread, thread ID: {thread.id}")

        message = project_client.agents.create_message(
            thread_id=thread.id,
            role="user",
            content="シアトルに行きます。おすすめの観光スポットは?"
        )
        print(f"Created message, message ID: {message.id}")

        with project_client.agents.create_stream(thread_id=thread.id, agent_id=agent.id) as stream:

            for event_type, event_data, _ in stream:

                if isinstance(event_data, MessageDeltaChunk):
                    print(event_data.text, end="", flush=True)

                # elif isinstance(event_data, ThreadMessage):
                #     print(f"ThreadMessage created. ID: {event_data.id}, Status: {event_data.status}")

                # elif isinstance(event_data, ThreadRun):
                #     print(f"ThreadRun status: {event_data.status}")

                # elif isinstance(event_data, RunStep):
                #     print(f"RunStep type: {event_data.type}, Status: {event_data.status}")

                elif event_type == AgentStreamEvent.ERROR:
                    print(f"An error occurred. Data: {event_data}")

                elif event_type == AgentStreamEvent.DONE:
                    print("Stream completed.")
                    break

                # else:
                #     print(f"Unhandled Event Type: {event_type}, Data: {event_data}")

    finally:
        if thread:
            project_client.agents.delete_thread(thread.id)
        if agent:
            project_client.agents.delete_agent(agent.id)
TypeScript
npm install @azure/ai-projects @azure/identity

index.ts

import type { AgentOutput, AgentThreadOutput, MessageDeltaChunk, MessageDeltaTextContent } from "@azure/ai-projects";
import { AIProjectsClient, DoneEvent, ErrorEvent, MessageStreamEvent, RunStreamEvent } from "@azure/ai-projects";
import { DefaultAzureCredential } from "@azure/identity"

const connectionString = "eastus2.api.azureml.ms;6e5bc704-5645-462f-8368-0d98b1fcced5;rg-openai;admin-9739";

export async function main(): Promisevoid> {

    const client = AIProjectsClient.fromConnectionString(connectionString, new DefaultAzureCredential());
    let agent: AgentOutput | undefined;
    let thread: AgentThreadOutput | undefined;

    try {

        agent = await client.agents.createAgent("gpt-4o-0513", {
            name: "my-agent",
            instructions: "You are a helpful agent"
        });

        thread = await client.agents.createThread();

        await client.agents.createMessage(
            thread.id, {
            role: "user",
            content: "シアトルに行きます。おすすめの観光スポットは?",
        });

        const streamEventMessages = await client.agents.createRun(thread.id, agent.id).stream();

        for await (const eventMessage of streamEventMessages) {
            switch (eventMessage.event) {
                case MessageStreamEvent.ThreadMessageDelta:
                    {
                        const messageDelta = eventMessage.data as MessageDeltaChunk;
                        messageDelta.delta.content.forEach((contentPart) => {
                            if (contentPart.type === "text") {
                                const textContent = contentPart as MessageDeltaTextContent;
                                process.stdout.write(textContent.text?.value || "");
                            }
                        });
                    }
                    break;

                // case RunStreamEvent.ThreadRunCreated:
                //     break;
                // case RunStreamEvent.ThreadRunCompleted:
                //     break;
                case ErrorEvent.Error:
                    console.log(`An error occurred. Data ${eventMessage.data}`);
                    break;
                // case DoneEvent.Done:
                //     break;
            }
        }

    } finally {
        if (thread) {
            await client.agents.deleteThread(thread.id);
        }

        if (agent) {
            await client.agents.deleteAgent(agent.id);
        }
    }
}

main().catch((err) => {
    console.error("The sample encountered an error:", err);
});
C#
dotnet add package Azure.AI.Projects
dotnet add package Azure.Identity

Program.cs

using Azure;
using Azure.AI.Projects;
using Azure.Identity;

var connectionString = "";

AgentsClient client = new AgentsClient(connectionString, new DefaultAzureCredential());
Agent? agent = null;
AgentThread? thread = null;
try
{
    ResponseAgent> agentResponse = await client.CreateAgentAsync(
        model: "gpt-4o-0513",
        name: "My Agent",
        instructions: "You are a helpful agent.");
    agent = agentResponse.Value;

    ResponseAgentThread?> threadResponse = await client.CreateThreadAsync();
    thread = threadResponse.Value;

    ResponseThreadMessage> messageResponse = await client.CreateMessageAsync(
        thread?.Id,
        MessageRole.User,
        "シアトルに行きます。おすすめの観光スポットは?");

    await foreach (StreamingUpdate streamingUpdate in client.CreateRunStreamingAsync(thread?.Id, agent.Id))
    {
        if (streamingUpdate is MessageContentUpdate contentUpdate)
            Console.Write(contentUpdate.Text);
        else
            /*Console.WriteLine(streamingUpdate)*/;
    }
}
finally
{
    await client.DeleteThreadAsync(thread?.Id);
    await client.DeleteAgentAsync(agent?.Id);
}

Azure AI Agent Serviceでは、ProjectClientを作成し、次にAgent、Thead、MessageをTheadに追加してから実行、という流れになります。Toolを使う場合であってもこの流れは基本的に同じです。

このサンプルコードのようにStreamで結果を受け取る場合、処理が終了するまで戻り値をイベント型で受信し続けます。そのためイベントタイプを判別して処理をする必要があります。

Python: Create Run, Run_and_Process, or Stream

C#: Azure AI Projects client library for .NET – version 1.0.0-beta.6
(Function Callの項の一番最後のサンプルがStreamingの唯一のサンプルです)

また、ThreadとAgentは明示的に削除しないとAzure側に残り続けます。継続して使用しないのであれば削除するように実装することをお勧めします。

2. OpenAI SDK

Azure AI Agent Serviceは、Assistant APIの上位互換です。そのため、OpenAI のAssistant API用のSDKを使うこともできます。

サンプルコードはGPT-4o 2024-11-20で動作確認していますのでご注意ください。(2024-05-13では動きません)

Python

requirements.txt

azure-ai-projects
azure-identity
openai
pip install -r requirements.txt

main.py

from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from openai import AzureOpenAI

with AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str="",
) as project_client:

    client: AzureOpenAI = project_client.inference.get_azure_openai_client(
        api_version = "2025-03-01-preview",
    )

    with client:
        try:        
            agent = client.beta.assistants.create(
                model="gpt-4o", name="my-agent", instructions="You are a helpful agent"
            )
            print(f"Created agent, agent ID: {agent.id}")

            thread = client.beta.threads.create()
            print(f"Created thread, thread ID: {thread.id}")

            message = client.beta.threads.messages.create(
                thread_id=thread.id,
                role="user",
                content="シアトルに行きます。おすすめの観光スポットは?"
            )
            print(f"Created message, message ID: {message.id}")

            stream = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=agent.id, stream=True)

            for streamEvent in stream:
                if streamEvent.event == "thread.message.delta":
                    print(streamEvent.data.delta.content[0].text.value, end="", flush=True)
                elif streamEvent.event == "error":
                    print(f"Error: {streamEvent}")
                    exit(1)

            print("")

        finally:
            client.beta.assistants.delete(agent.id)
            client.beta.threads.delete(thread.id)





Source link

Views: 0

初音ミクが『ガンダムW』のOPテーマ「JUST COMMUNICATION」などを歌う無料ライブが4月23日から開催決定


ガンダムW公式Xアカウントは、「初音ミク」と『機動戦士ガンダム』のコラボレーションしたオンラインライブを開催すると発表した。

価格は無料。開催期間は4月23日(水)から5月18日(日)。昼公演は15時から、夜公演は23時からそれぞれ開始する。

今回は、「初音ミク」が『機動戦士ガンダム』とコラボしたコラボレーションライブの第二弾となる。新曲が2曲追加されており、充実したライブ体験を発信する。

なおチケット不要の「無料」のオンラインのメタバースライブとなり、「ガンダムメタバース」内のメインロビーからライブエリアに移動することで参加できる。セットリストは以下のとおり。

▼セットリスト
1.翔べ!ガンダム
2.ヴァンパイア
3.千本桜
4.FLYING IN THE SKY
5.ワールドイズマイン
6.JUST COMMUNICATION

初音ミクが『ガンダムW』のOPテーマ「JUST COMMUNICATION」などを歌う無料ライブが4月23日から開催決定_001
(画像はXより)
初音ミクが『ガンダムW』のOPテーマ「JUST COMMUNICATION」などを歌う無料ライブが4月23日から開催決定_002
(画像はNEWS | ガンダムメタバースプロジェクトオフィシャルサイトより)

公演時間は30分程度を予定しており、ライブ会場には途中入場可能となっている。なお初回ログイン時はチュートリアルやアバター作成などに時間がかかるので、余裕を持って準備しておこう。

セットリストには『新機動戦記ガンダムW』のオープニング・テーマ「JUST COMMUNICATION」も含まれたものとなっている。

「初音ミク」と『機動戦士ガンダム』のコラボレーションしたオンラインライブは、4月23日(水)から5月18日(日)まで開催予定。昼公演は15時から、夜公演は23時からそれぞれ開始となっている。

本ページはアフィリエイトプログラムによる収益を得ている場合がございます





Source link

Views: 0

店主×英雄の二重生活が3Dに!人気ローグライトARPG続編『Moonlighter 2』2025年夏に発売決定




『Moonlighter 2: The Endless Vault』2025年夏発売決定!



Source link

Views: 0

テスラは3月に急上昇しました



テスラは3月に急上昇しました

消費者が反応するにつれて、ますます多くのテスラの所有者が使用済み車両を販売しています イーロン・マスクの政治活動 そして グローバルな抗議 彼らは燃料を供給しました。

3月、Autotrader.comで販売されている使用済みのテスラ車両の数が急上昇しました。 シャーウッド・ニュースが報じたAutoTrader親会社のCox Automotiveからのデータを引用。数は、平均13,000を超える使用されたテスラが販売のためにリストされた3月の最終週に特に高かった。これはレコードであるだけでなく、前年の同じ週から67%増加しています。

同時に、他のブランドからのEV販売が上昇しても、新しいテスラ車両の売り上げは遅くなりました。米国では2025年の第1四半期に約300,000の新しいEVが販売されました。 Kelley Blue Bookの最新レポートによると前年比で10.6%の増加。一方、テスラ 売り上げは減少しました 第1四半期には、2024年の同じ期間からほぼ9%減少しました。

GMやヒュンダイのような自動車メーカーは、まだテスラに遅れをとっています。しかし、彼らは成長の増加を見ています。たとえば、GMブランドは第1四半期に30,000以上のEVを販売し、Kelley Blue Bookによると、1年前のボリュームをほぼ2倍にしました。



Source link

Views: 0

「ペルソナ」シリーズで活躍する主人公たちのかわいいフィギュア「Qset+」が8月に再販決定。予約受付開始



 グッドスマイルカンパニーは本日,「ペルソナ」シリーズに登場する主人公たちのフィギュア「Qset+P3P主人公」「Qset+P4G主人公」「Qset+P5R主人公」を2025年8月に再販すると発表し,予約受付を開始した。価格は2500円(税込)。机に飾れる小さなフィギュアで,全高約80mmとなっている。



Source link

Views: 0

経費管理クラウド「Bill One経費」、Amazonビジネスと連携するためのオプション機能を提供 – クラウド Watch


 Sansan株式会社は10日、クラウド型経費管理サービス「Bill One経費」と法人・個人事業主向けEコマース「Amazonビジネス」を連携できるオプションとして、「Amazonビジネス API連携オプション」を提供開始したと発表した。

 経費精算サービスのBill One経費では、経費の支払時に法人カード「Bill Oneビジネスカード」を用いることで、従業員の立て替えをなくし、経費精算における購買・経理担当者の負担軽減を支援してきた。

 今回提供される「Amazonビジネス API連携オプション」を利用すると、Bill Oneビジネスカードを用いてAmazonビジネスで購入した物品の証憑を、Bill One経費上の決済情報に自動で連携できるようになるため、従業員が購買を行った後の証憑提出が不要になるという。

 また、経理担当者がBill One経費上で仕訳を行う際に、自動連携された証憑の明細情報をBill One経費のオンライン画面上で参照しながら作業できるので、経費精算業務の効率化が実現するとした。

 さらに、「適格請求書判定機能」がAmazonビジネスの証憑にも適応されるようになる。これにより、出品事業者が適格請求書の発行事業者であるかどうかを確認できるようになるだけでなく、証憑が適格請求書の要件を満たしているかどうかもBill Oneが自動で判定できることから、効率的なインボイス制度対応を実現するとしている。





Source link

Views: 0

規則正しい生活って難しいけどとても大切【ぷーこの家電日記】- 家電 Watch


早くも4月に入り、2週間が過ぎた。春が来たと思ったら急に寒くなったりで、なかなかコートも手放せなかったけれど、やっとコートもいらない時期になってきたという感じだ。日も長くなり、我が家の猫たちも日向ぼっこが捗るようで、ちょっと日当たりの悪い家の中を、日向を探してはくつろいでいる。

猫に顔を埋めて深呼吸をする、いわゆる「猫吸い」をすると、猫の体からはお日様の香りがして、春を感じるし、最高に癒されるのである。

そんな陽気の春。寒さも一段落して動きやすくなる季節なのに、過ごしやすくて大好きな季節なのに、この時期はたいてい体調が悪くなる。

風邪をひいたり、疲れが取れなかったり、肩こりなのか体がダル重かったり。体調と連動するのか気持ちもちょっと落ち込みがちで、ただでさえ面倒くさがりなのに、億劫な気持ちが強くなって、休みの日はひたすら寝て過ごし、その後にせっかくの休みを無駄にしてしまったと後悔して落ち込んだり、とにかく低空飛行でやり過ごすことが多いのだ。

私のストレスに連動しているのかしていないのか、夫もストレスを溜めて、この時期は何となく焦ったり、不安になったりすることが多いように見える。さわやかな春なのに! 気持ちがいい春なのに! と非常にもったいないと感じていたのだけど、どうやら私だけじゃなくて、この季節に心身ともに不調になる人は多いらしい。

寒暖差が激しく体調を崩しやすい上に、花粉や黄砂でさらに体調が不安定になる。そして、寒暖差に加えて気圧の乱高下で自律神経が乱れ、心身共に不調になるのである。ただでさえ弱っている心身に追い討ちをかけるかのような環境の変化。入学だとか、引っ越しだとか、異動だとか、そういう大きな変化に適応しようとすると、ストレスが溜まりやすいのだ。

自律神経はストレスにも影響を受けやすいので、まさに弱り目に祟り目、泣きっ面に蜂状態で、春は心身ともに不調になる人が多いという。無理に動こうと頑張らず、「この時期はこんなもんだ」と開き直った方が良さそうだと諦めていたけれど、そういえば我々夫婦、今年は元気な気がする! むしろ気温の上昇と連動するかのように、気分も体調も上昇している気すらしているのだ。

よく分からないけれどラッキー! くらいの気持ちでいたけれど、理由を考えてみたら何ら不思議なラッキーではなく、無意識のうちにしっかりとした対策を取っていた。

まず夫は、この数カ月FEELCYCLE(フィールサイクル)という、バイクエクササイズのジムにどハマりしている。週末だけじゃなくて平日も仕事前に1レッスン受けて出社するくらいの頻度で通っている。冬場の運動不足で血行や代謝が悪くなりがちだけれど、このフィールサイクルのおかげで運動不足が解消されるだけじゃなくて、ストレス発散にもなっているようで、すこぶる体調が良い。

「不思議と体重は全然落ちないんだけどさ」と言っているが、それは運動によって食欲も増しているからだと私は知っている(笑)。でも、よく食べよく動き、そして早朝のレッスンに参加するために早寝早起きと、めちゃくちゃ規則正しい生活を送っているので、体調がかなり良いのだ。早寝早起きのために、外で飲むよりも家でご飯を食べてサッと寝たいと思うようで、食生活も結構改善している気がする。知らず知らずのうちに、規則正しい生活、適度な運動、バランスの良い食事と、自律神経を整えるのに良いとされる対策をバッチリしていたのである。

そして夫より数倍不規則な生活に運動不足な私の場合、すごく夜型でつい夜更かししてしまうし、朝は弱いし、運動しなきゃなぁと思いながらゴロゴロしてしまう怠惰のプロみたいな人間だけど、唯一体を動かす家庭菜園で無意識に対策を取っていた。

先日書いた通り、新しい場所に畑を借り直すことにしたけど、契約が8月末まで重複しているため、今80m2ほどの畑を管理している。今まで30m2程度でヒーヒー言いながらやっていたのに、2.5倍の広さを週末の管理だけでどうにかしなくてはいけない。

今の季節は夏野菜を植える畑の準備のために、2カ所の畑をはしごしながら通っている。まだ熱中症になる程暑くないので、真昼に畑仕事をしても問題ないのだけれど、昼までゆっくり寝てから畑に行くのでは時間が全然足りないので、休みの日も平日と変わらない時間に起きて、畑でえっさほいさと汗をかきながら1日体を動かして、帰ったら最高に美味しいビールと、野菜たっぷりのご飯を食べ、そして疲れてぐっすり寝てしまう。私も私で規則正しい生活、適度な運動、バランスの良い食事という、理想的な生活に自然に近づいていっているのだ。

規則正しい生活をしなきゃ! とか、少しは運動しなきゃ! とか、自分でやらなきゃいけないと分かっていても全然やれなかったことが、自分の楽しみとなった瞬間に全然できちゃうのが、自分に甘く、意志が弱いと自認している私たちらしいよねぇと、軽く苦笑いしちゃうのだけど、まぁ結果オーライ。

そして「適度な運動が大切」とよく聞くけれど、本当に体調にこんなにも直結するんだなと改めて感じて、感動している。この生活を続けていたら、「無意識のうちにダイエットになってたー」とならないかなぁと、趣味の副産物にちょっとだけ過度な期待を寄せている私なのでありました。





Source link

Views: 0

セブン・ローソン・ファミマの「ブレンドコーヒー」をブレンドしたら、至極の1杯ができるんじゃないのか?



私(佐藤)は毎朝コーヒーを飲んでいる。豆を買って自分で挽き、ハンドドリップしているわけだが、最近は自分なりに豆をブレンドして好みの味を模索している。 そこで、ふと思った。コンビニのブレンドコーヒーをさらにブレンドしたら、 […]



Source link

Views: 0

「ガンダム ジークアクス」EDの地球儀をよく見ると…欠けたオーストラリア大陸にファン「コロニー落としだ!」「芸が細かい」



「ガンダム ジークアクス」EDの地球儀をよく見ると…欠けたオーストラリア大陸にファン「コロニー落としだ!」「芸が細かい」

「ガンダム ジークアクス」EDの地球儀をよく見ると…欠けたオーストラリア大陸にファン「コロニー落としだ!」「芸が細かい」



Source link

Views: 0