月曜日, 2月 9, 2026
No menu items!
ホーム ブログ ページ 1819

「KizunaAI復活ライブ、豪華ゲスト決定!」

🔸 ざっくり内容:

KizunaAIのカムバックコンサートの詳細

概要 バーチャルタレント「キズナアイ」をプロデュースする「Kizuna AI株式会社」は、9月20日・21日にZepp Shinjuku(TOKYO)で開催される『KizunaAI Comeback Concert “Homecoming”』のゲスト出演者を発表しました。Day1には「にじさんじ」から剣持刀也、月ノ美兎、葉加瀬冬雪、なつめえりが参加し、Day2には「ホロライブ」の星街すいせいが出演します。現地チケットは8月16日12時から先着販売されます。

KizunaAI

特徴的な内容

  • Day1: 同窓会形式の生トーク
    • 「hello, again」と題して、「にじさんじ」のメンバーとのリモートトークセッションが行われます。KizunaAIが彼らに「ただいま」を伝える形式で、復活を祝います。

日1トークの様子

  • Day2: 星街すいせいのライブパフォーマンス
    • 「new world」と題して、星街すいせいがライブを披露します。KizunaAIと星街すいせいのコラボは今回が初となります。

星街すいせい

チケット情報

現地チケットは4,500円、2日通しチケットは9,000円で販売され、8月31日までに購入すると特典付きです。配信チケット購入者にも特典があり、早期購入者には新作ミュージックビデオの先行視聴が可能です。

このコンサートは、KizunaAIの活動再開を象徴する重要なイベントであり、バーチャルYouTuber文化の新たな展開を示しています。一般販売は混雑が予想されるため、早めの申し込みをおすすめします。

🧠 編集部の見解:
バーチャルタレント「キズナアイ」の復活コンサートが注目されていますね!特に、Day1には「にじさんじ」メンバーとの生トークがあるのがワクワクします。これって、ファンにとっては本当に特別な瞬間ですよね。バーチャルYouTuberのトレンドを作ってきた先輩たちが集まる「同窓会」的な雰囲気もすごく良い感じです。 実は、VTuberはもはや日本だけの現象ではなく、海外でも人気が広がっています。最近では、英語圏でも多くのVTuberが活躍中で、彼らの配信を通じて国際的な交流も進んでいます。社会的に見ても、こうした新しい形のエンターテインメントは、個々人の趣味や興味を広げるきっかけになっていると思います。 Day2では星街すいせいのライブが予定されていて、KizunaAIとの共演という新たな挑戦があるのも注目です。このように、世代やジャンルを超えたコラボレーションが進むことで、さらなる盛り上がりが期待できます。 チケットも早めに申し込むべきですが、配信チケットの特典にはライブ音源やアフタートーク動画があるのもポイント。こういった特典を通じて、ファンはさらにその世界観に浸ることができるのではないでしょうか。 最後に、バーチャルとリアルの境界が徐々に曖昧になっている現代において、こうしたイベントが果たす役割は非常に大きいと感じます。まさに「新たな旅路」の始まりですね!

  • キーワード: Kizuna AI Concert

    このキーワードから、Kizuna AIが主催するコンサートや関連するアーティストについての情報が強調されています。


KizunaAI をAmazonで探す にじさんじ をAmazonで探す ホロライブ をAmazonで探す
※以下、出典元 ▶ 元記事を読む

Views: 0

「結婚願望ゼロの20代女子に藤本美貴が現実的アドバイス」

🔸 ニュース:

タレントの藤本美貴さんが8月5日に自身のYouTubeチャンネルを更新し、視聴者から寄せられた悩みに対するアドバイスを行う動画を配信しました。この動画では、「1年前に別れた元カノともう一度付き合いたい」という男性の相談に対し、藤本さんがどのような助言をするのかにスポットが当たっています。

このような悩み相談は、特に若い世代の視聴者にとって共感を呼ぶものであり、藤本さんの率直な意見や経験談が多くの人にとって価値あるアドバイスとなっています。視聴者との交流を大切にし、楽しく役立つコンテンツを提供する藤本さんの姿勢は、多くのファンに支持されています。

動画の詳細は以下からご覧いただけます:こちらから視聴

🧠 編集部の見解:
藤本美貴さんのYouTube動画でのお悩み相談、なかなか面白いテーマですね!特に「1年前に別れた元カノともう一度付き合いたい」という恋愛相談に対して、どんなアドバイスをしたのか、とても気になります。

### 感想
恋愛の悩み相談は普遍的ですね。多くの人が似たような状況に直面することも多いでしょう。藤本さんのようなタレントが、自分の経験を交えて視聴者にアドバイスをすることで、少しでも救われる人がいるのかなと思います。彼女の言葉には、心に響くものがありそうです。

### 関連事例
恋愛に関する相談は、友人や家族、さらにはSNSでよく見られます。特に若者は、インターネットでの情報収集を通じて、意見やアドバイスを求める傾向があります。実際、恋愛カウンセラーの存在も増えてきており、オンラインで相談を受けるサービスも多くなりました。

### 社会的影響
こうした相談動画やコンテンツが広まることで、恋愛に関するコミュニケーションが増え、ストレスの軽減にもつながると思います。また、公の場でこうした問題を扱いがちなタレントが増えることで、特定の悩みに対する偏見が減っていく可能性もあるんじゃないかな。

### 豆知識
ちなみに、恋愛の再燃については「復縁」という言葉がありますが、心理学的には「感情の記憶」が影響しているとも言われています。かつての関係が持つ思い出や感情が、再び接点を持つきっかけになりやすいということですね!

恋愛は心の動きが大きい分、悩みも深いですが、こうした話題を取り上げること自体が大切ですよね。藤本さんのような存在がいることで、悩んでいる人たちが少しでも明るい気持ちになれることを願っています!

  • キーワード: 藤本美貴

    藤本美貴さんが自身のYouTubeチャンネルで視聴者のお悩み相談にアドバイスをする動画を公開しました。


藤本美貴 をAmazonで探す

YouTubeチャンネル をAmazonで探す

悩み相談 をAmazonで探す


Views: 0

大森元貴✨心温まる☀️瞬間をシェア!

✍️ 編集部の感想

大森元貴さんの投稿、素敵ですね!シンプルなビジュアルが彼の温かい人柄を引き立てています。最近の自身の活動や時事ネタをしっかり追いかけているので、安心感があります。ますますの活躍が楽しみです!これからも応援しています!☀️

📸 投稿内容

data-instgrm-captioned data-instgrm-permalink=https://www.instagram.com/p/DNdCRiSpWe-"?utm_source=ig_embed&utm_campaign=loading" data-instgrm-version="14" style="background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin:1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);" >


Views: 0

「秘密の節約術!家庭で実践可能」

0

一般家庭のとっておき節約術

こんにちは!今回は、「一般家庭のとっておき節約術」についての動画をもとに、役立つ情報をリライトしてお届けします。生活費を抑えるために、実際の体験談やアドバイスを元にした節約術を紹介しますね。

節約ライフの工夫

家計の見直しをしている皆さん、少しでも生活費を減らしたいと思ったこと、ありませんか?私たちも、節約を意識することで、少しでもお金を節約する生活を楽しんでいます。

自転車移動と自然を楽しむ

例えば、家族での移動はできるだけ自転車を利用しています。これによりガソリン代を節約しつつ、自然を楽しむことができるんです。さらには、公園にピクニックをしに行くことで、レジャーにもお金がかかりません。

食費の見直し

食費は家庭の中で大きな支出になりますよね。子供の成長とともに食費が増えるのは誰でも感じることです。それにも関わらず、家族全員が満足できる食事を提供するのは大変ですよね。まとめ買いや、半額セールを狙った買い物がカギです。たまに、失敗することもありますが、上手に見極めて賢い買い物を心がけています。

値引き品の活用

スーパーでは値引き品を積極的に購入するのがオススメです。これにより食費を削減できるだけでなく、食品ロスにも貢献できます。多くのお店が、廃棄率を減らす努力をしているので、その心意気に答える形で買い物を続けています。

貯金の習慣化

私たちは、自分の欲を抑えて貯金することを大切にしています。毎月の出費を記録し、きちんとした予算を立てて、必要な支出を管理することが重要です。その結果、まとまった金額を貯金することができ、安心感を持つことができています。

豆知識と背景

食費の高騰

最近、食材の価格がどんどん上がっていますよね。これは、コロナ禍やロシアのウクライナ侵攻など国際情勢の影響を受け、物流のコストが上昇したためです。この事実を頭に入れておくことで、今後の節約計画を見直すきっかけになるかもしれません。

自己投資の重要性

節約しつつも、自分自身の趣味やスキルへの投資も忘れないようにしています。自己成長は、将来的に大きなリターンをもたらすことがありますよね。

関係するページへのリンク

最後に、皆さんのお気に入りの節約法やアドバイスがあれば、ぜひ教えてくださいね!一緒に賢い節約ライフを楽しみましょう。

  • キーワード: 節約術

    このキーワードは、一般家庭が日常の生活費を抑えるために利用する様々な方法やアイデアを表しています。この内容は、生活をより豊かにするための工夫や経験を共有することに焦点を当てています。

自転車 をAmazonで探す

冷凍食品 をAmazonで探す

出前 をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

「2025夏アニメOP人気TOP10!1位は『薫る花』」

「2025年夏アニメ」好きなOPランキングTOP10

2025年の夏アニメオープニングテーマの人気ランキングが発表されました。音楽と映像が融合した作品ごとの魅力を伝える力は、視聴者にとっても大きな部分を占めています。それでは、ランキングを見ていきましょう。

第1位:「まなざしは光」キタニタツヤ(『薫る花は凛と咲く』)23票

まなざしは光
『薫る花は凛と咲く』のオープニングテーマであるキタニタツヤの「まなざしは光」が1位に輝きました。この楽曲は、繊細かつ力強い歌声と印象的なメロディで高評価を得ており、作品の豊かな世界観を見事に表現しています。

ノンクレジットオープニングムービー

第2位:「再会」Vaundy(『光が死んだ夏』)21票

再会
Vaundyの「再会」は、静かな日常に潜む不穏さを表現。淡い旋律と豊かなサウンドが作品の雰囲気にぴったりです。

ノンクレジットオープニング

第3位:「アオとキラメキ」スピラ・スピカ(『その着せ替え人形は恋をする』Season 2)18票

アオとキラメキ
スピラ・スピカの「アオとキラメキ」は、明るく爽やかなメロディで作品の華やかさを引き立てています。

オープニング映像

第4位:「革命道中」アイナ・ジ・エンド(『ダンダダン』第2期)15票

革命道中
アイナ・ジ・エンドの「革命道中」は、緩急のあるメロディと力強いビートが特徴的。作品の熱気を一層引き立てています。

オープニング映像

第5位:「ハッピーラッキーチャッピー」ano(『タコピーの原罪』)14票

ハッピーラッキーチャッピー
anoの「ハッピーラッキーチャッピー」は、軽快なリズムの中にシリアスなテーマが潜んでいる一曲。多層的な魅力が感じられます。

ノンクレジットOP映像

第6位:「おそ松さんのボンバシェー!」DA PUMP(『おそ松さん』第4期)13票

おそ松さんのボンバシェー!
DA PUMPの「おそ松さんのボンバシェー!」は、コミカルなサウンドが作品の雰囲気とマッチしていて、視聴者を楽しませてくれます。

ノンクレジットOP映像

第7位:「神頼み」syudou(『出禁のモグラ』)12票

神頼み
syudouの「神頼み」は、重厚なロックサウンドと鋭い歌詞が特長。作品のストーリー性を反映した印象的な曲です。

オープニング映像

第8位:「OVERNIGHT」THE ORAL CIGARETTES(『桃源暗鬼』)11票

OVERNIGHT
THE ORAL CIGARETTESの「OVERNIGHT」は、攻撃的なギターフレーズと情熱的なボーカルが印象深い楽曲。バトルシーンにうまくマッチしていると言えるでしょう。

ノンクレジットOP映像

第9位:「かごめかごめ」オーイシマサヨシ(『地縛少年花子くん2』後編)10票

かごめかごめ
オーイシマサヨシの「かごめかごめ」は、童謡のメロディをサンプリングした楽曲。和のリズムが不気味さとノスタルジーを見事に融合させています。

ノンクレジットOP映像

第10位:「You Can’t Run From Yourself」AURORA(『怪獣8号』第2期)9票

You Can’t Run From Yourself
AURORAの「You Can’t Run From Yourself」は、エモーショナルなボーカルが壮大なスケールを描き出します。視聴者の緊張感をさらに引き立てる体験ができます。

ノンクレジットOP映像


この夏、多様なジャンルのオープニング曲が視聴者の心を捉えました。各楽曲が作品の魅力を引き出し、見る者を惹きつける内容となっています。気になるアニメがあれば、ぜひノンクレジットOPをチェックしてみてください!あなたのお気に入りのOP曲は何ですか?

元記事では、全ランキング結果が確認できますので、ぜひご覧ください。

🧠 編集部より:

2025年夏アニメのオープニングテーマ(OP)のランキングに関する内容です。アニメの魅力を引き立てるOPは、視聴者の心を掴む重要な要素です。ここでは各ランキング上位曲について、さらに詳しく掘り下げてみましょう。

第1位:「まなざしは光」キタニタツヤ(『薫る花は凛と咲く』)

この曲は、アニメのテーマにぴったりフィットしており、歌詞の持つメッセージとメロディが物語の感情を鮮やかに演出します。キタニタツヤさんは、その繊細かつ力強い歌声で多くのファンを魅了しています。

  • 豆知識:キタニタツヤは、独自の音楽スタイルで注目を浴びています。彼の楽曲は、アニメだけでなく単独でも人気があります。

第2位:「再会」Vaundy(『光が死んだ夏』)

Vaundyの「再会」は、アニメの緊張感とストーリーの深さを音楽で表現した素晴らしい楽曲です。サウンドの爽やかさが、作品の持つ暗いテーマと対比を生み出しています。

  • 豆知識:Vaundyは、若手アーティストの中でも特に注目されており、独自のスタイルでジャンルを超えた音楽を提供しています。

第3位:「アオとキラメキ」スピラ・スピカ(『その着せ替え人形は恋をする』Season 2)

この曲は、楽しい雰囲気を醸し出しつつも、作品のテーマにぴったりなポップスタイルを持っています。リズムが聴く人をワクワクさせ、夏の爽やかさを感じさせる一曲です。

  • 豆知識:スピラ・スピカは、オリジナリティあふれる楽曲作りで知られ、アニメ界でも多くのファンを獲得しています。

他の注目曲

  • 第4位「革命道中」アイナ・ジ・エンド(『ダンダダン』第2期)
  • 第5位「ハッピーラッキーチャッピー」ano(『タコピーの原罪』)

これらの楽曲も、アニメのストーリーを視覚的にも音楽的にも引き立てる重要な役割を果たしています。

おすすめリンク

アニメのオープニングをチェックすることで、その作品への興味がより一層深まるでしょう。視聴時には、これらの楽曲の魅力を是非感じ取ってみてください!好みのOPはどれだったでしょうか?お楽しみください。

  • キーワード: OPランキング

まなざしは光 をAmazonで探す

再会 をAmazonで探す

おそ松さんのボンバシェー! をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

MagicOnion + WPF を使用して異なるPC間でアプリの操作内容をリアルタイム共有


「WPFアプリの操作内容を異なるPC間でリアルタイムで共有したい」と考えていたところ、MagicOnionで実装するのが実装しやすそう&楽しそうと感じた為、「MagicOnion + WPF」で該当の動作を確認する簡単なアプリを作成してみました。
作成にあたり、MagicOnionのサンプルコードにあるチャットアプリを参考にさせてもらっています。また、実行環境としてDockerコンテナーを使用していますが、DockerfileはVisualStudio側で自動生成されるものを基本として、必要な部分だけ調整し使用しています。
色々と知識が不足している状態で作成しておりますので、間違っている部分などご指摘いただけると幸いです。

https://github.com/Cysharp/MagicOnion

  • Visual StudioでMagicOnionサーバー、WPFアプリを作成
  • 作成したMagicOnionサーバーをDockerDesktopで起動
  • 同一ネットワークにて、WPFアプリを複数のPCで起動
  • 各WPFアプリはMagicOnionサーバーへ自端末での操作内容を送る
  • 各WPFアプリはMagicOnionサーバーより各端末の操作内容を受け取る

(イメージ)

以下の環境で実行します。

  • .NET9
  • Visual Studio Comunity
  • Docker Desktop

もしDocker Desktopがインストールされていない場合は、先にインストールしてください。

https://www.docker.com/ja-jp/get-started/

ソリューションの構成は以下の通りです。

プロジェクト名 プロジェクトテンプレート 説明
InteractionShare.Shared クラスライブラリ Server – Clientの通信用インターフェイス、MessagePackObjects
InteractionShare.Server ASP.NET Core gRPC サービス MagicOnionServer
InteractionShare.App WPFアプリケーション Client用WPFアプリ

InteractionShare.Shared


最初にServer-Client間で使用する「InteractionShare.Shared」を作成します。新しいプロジェクトの作成にて「クラスライブラリ」を選択し作成します。

プロジェクトを作成したら、NuGetにて「MagicOnion.Abstractions」「MessagePack」をインストールします。

パッケージのインストールが完了したら、MessagePackObjectから作成していきます。

Join時のリクエスト内容

MessagePackObjects/Requests.cs

using MessagePack;

namespace InteractionShare.Shared.MessagePackObjects
{
    [MessagePackObject]
    public struct JoinRequest
    {
        [Key(0)]
        public string RoomName { get; set; }

        [Key(1)]
        public string UserName { get; set; }
    }
}

操作内容のレスポンス

MessagePackObjects/Responses.cs

using MessagePack;

namespace InteractionShare.Shared.MessagePackObjects
{
    [MessagePackObject]
    public struct StatusResponce
    {
        [Key(0)]
        public string UserName { get; set; }
        [Key(1)]
        public string WindowName { get; set; }
        [Key(2)]
        public string FunctionName { get; set; }
    }
}

続いて、APIのインターフェイスを作成します。

Client -> Server API

Hubs/IInteractionShareHub.cs

using InteractionShare.Shared.MessagePackObjects;
using MagicOnion;

namespace InteractionShare.Shared.Hubs
{
    

Server -> Client API

Hubs/IInteractionShareHubReceiver.cs

using InteractionShare.Shared.MessagePackObjects;

namespace InteractionShare.Shared.Hubs
{
    

以上でInteractionShare.Sharedの作成は完了です。

InteractionShare.Server


次に、MagicOnionServerとなる「InteractionShare.Server」を作成します。新しいプロジェクトの作成にて「ASP.NET Core gRPC サービス」を選択します。

プロジェクトを作成したら、デフォルトで「Protos/greet.proto」「Services/GreeterService.cs」が作成されますが、これらは使用しないため削除します。

NuGetにて「MagicOnion.Server」をインストールします。

プロジェクトの参照の追加で、先に作成した「InteractionShare.Shared」を追加します。

MagicOnionServer

既存のProgram.csを以下の様に書き換えます。

Program.cs

using Microsoft.AspNetCore.Server.Kestrel.Core;

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(options =>
{
    options.ConfigureEndpointDefaults(endpointOptions =>
    {
        endpointOptions.Protocols = HttpProtocols.Http2;
    });
});
builder.Services.AddMagicOnion();

var app = builder.Build();
app.MapMagicOnionService();

app.Run();

続いて、実際のサーバーの処理を作成します。

InteractionShareHub.cs

using Cysharp.Runtime.Multicast;
using InteractionShare.Shared.Hubs;
using InteractionShare.Shared.MessagePackObjects;
using MagicOnion.Server.Hubs;

namespace InteractionShare.Server;

public class InteractionShareHub : StreamingHubBaseIInteractionShareHub, IInteractionShareHubReceiver>, IInteractionShareHub
{
    private IGroupIInteractionShareHubReceiver>? room;
    private string myName = string.Empty;
    private readonly IMulticastSyncGroupGuid, IInteractionShareHubReceiver> roomForAll;

    public InteractionShareHub(IMulticastGroupProvider groupProvider)
    {
        roomForAll = groupProvider.GetOrAddSynchronousGroupGuid, IInteractionShareHubReceiver>("All");
    }

    public async Task JoinAsync(JoinRequest request)
    {
            this.room = await this.Group.AddAsync(request.RoomName);
            this.myName = request.UserName;
            this.room.All.OnJoin(request.UserName);
    }

    public async Task LeaveAsync()
    {
        if (this.room is not null)
        {
            await this.room.RemoveAsync(this.Context);
            this.room.All.OnLeave(this.myName);
        }
    }

    public async Task SendStatusAsync(string windowName, string fucntionName)
    {
        if (this.room is not null)
        {
            var response = new StatusResponce { UserName = this.myName, WindowName = windowName, FunctionName = fucntionName };
            this.roomForAll.All.OnSendStatus(response);
        }

        await Task.CompletedTask;
    }

    protected override ValueTask OnConnecting()
    {
        Console.WriteLine($"client connected {this.Context.ContextId}");
        roomForAll.Add(ConnectionId, Client);
        return CompletedTask;
    }

    protected override ValueTask OnDisconnected()
    {
        roomForAll.Remove(ConnectionId);
        return CompletedTask;
    }
}

Docker/Docker Compose

次にDocker、docker-compose を作成します。
プロジェクト「InteractionShare.Server」を右クリックして、「追加」->「コンテナー オーケストレーターのサポート」を選択します。

「Docker Compose」を選択し「OK」を押します。

コンテナースキャンフォールディングオプションは、デフォルトのままでOKです。

プロジェクト配下に「Dockerfile」が作成されます。今回ポートは443を使用しますので、Dockerfileの内容を以下の通り修正します。

Dockerfile

Dockerfile(修正前)

EXPOSE 8080
EXPOSE 8081

Dockerfile(修正後)

EXPOSE 443

また、作成された「docker-compose」の「docker-compose.yml」を開き、以下の通り編集します。

docker-compose.yml

services:
  interactionshare.server:
    image: ${DOCKER_REGISTRY-}interactionshareserver
    build:
      context: .
      dockerfile: InteractionShare.Server/Dockerfile
    ports:
      - "5000:443"
    expose:
      - "443"
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+
      - ASPNETCORE_HTTPS_PORT=443

以上でInteractionShare.Serverの作成は完了です。

InteractionShare.App

最後にクライアント側アプリ「InteractionShare.App」を作成します。新しいプロジェクトの作成にて「WPFアプリケーション」を選択し作成します。

プロジェクトを作成したら、NuGetにて「MagicOnion.Client」「System.Reactive」をインストールします。

プロジェクトの参照の追加で、先に作成した「InteractionShare.Shared」を追加します。

使用するViewModelを作成します。

ViewModels/ViewModelSubWindow.cs

using InteractionShare.Shared.Hubs;
using System.ComponentModel;
using System.Windows.Input;

namespace InteractionShare.App.ViewModels
{
    public class ViewModelSubWindow : INotifyPropertyChanged
    {
        private IInteractionShareHub hub;
        private string editedElsewhere = string.Empty;
        public string EditedElsewhere
        {
            get => editedElsewhere;
            set { editedElsewhere = value; OnPropertyChanged(nameof(EditedElsewhere)); }
        }
        private string button01ClickInfo = string.Empty;
        public string Button01ClickInfo
        {
            get => button01ClickInfo;
            set { button01ClickInfo = value; OnPropertyChanged(nameof(Button01ClickInfo)); }
        }
        private string button02ClickInfo = string.Empty;
        public string Button02ClickInfo
        {
            get => button02ClickInfo;
            set { button02ClickInfo = value; OnPropertyChanged(nameof(Button02ClickInfo)); }
        }
        private string button03ClickInfo = string.Empty;
        public string Button03ClickInfo
        {
            get => button03ClickInfo;
            set { button03ClickInfo = value; OnPropertyChanged(nameof(Button03ClickInfo)); }
        }
        private string button04ClickInfo = string.Empty;
        public string Button04ClickInfo
        {
            get => button04ClickInfo;
            set { button04ClickInfo = value; OnPropertyChanged(nameof(Button04ClickInfo)); }
        }


        public ICommand Button01Command { get; }
        public ICommand Button02Command { get; }
        public ICommand Button03Command { get; }
        public ICommand Button04Command { get; }
        public ViewModelSubWindow(IInteractionShareHub interactionShareHub)
        {
            hub = interactionShareHub;
            Button01Command = new RelayCommand(OnButton01Click);
            Button02Command = new RelayCommand(OnButton02Click);
            Button03Command = new RelayCommand(OnButton03Click);
            Button04Command = new RelayCommand(OnButton04Click);
        }

        private async void OnButton01Click()
        {
            await hub.SendStatusAsync($"Button", "01");
        }
        private async void OnButton02Click()
        {
            await hub.SendStatusAsync($"Button", "02");
        }
        private async void OnButton03Click()
        {
            await hub.SendStatusAsync($"Button", "03");
        }
        private async void OnButton04Click()
        {
            await hub.SendStatusAsync($"Button", "04");
        }

        public event PropertyChangedEventHandler? PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        internal void SetButtonInfo(string userName, string functionName)
        {
            Button01ClickInfo = string.Empty;
            Button02ClickInfo = string.Empty;
            Button03ClickInfo = string.Empty;
            Button04ClickInfo = string.Empty;
            if (functionName == "01")
                Button01ClickInfo = $"{userName}がButton01をクリックしました";
            else if (functionName == "02")
                Button02ClickInfo = $"{userName}がButton02をクリックしました";
            else if (functionName == "03")
                Button03ClickInfo = $"{userName}がButton03をクリックしました";
            else if (functionName == "04")
                Button04ClickInfo = $"{userName}がButton04をクリックしました";
        }
    }
}

ViewModels/RelayCommand.cs

using System.Windows.Input;

namespace InteractionShare.App.ViewModels
{
    public class RelayCommand : ICommand
    {
        private readonly Action execute;
        private readonly Funcbool>? canExecute;

        public RelayCommand(Action execute, Funcbool>? canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }

        public bool CanExecute(object? parameter) => canExecute?.Invoke() ?? true;
        public void Execute(object? parameter) => execute();
        public event EventHandler? CanExecuteChanged;
    }
}

操作内容を共有するウィンドウを作成します。

Views/SubWindow.xaml

Window x:Class="InteractionShare.App.Views.SubWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:InteractionShare.App.Views"
        mc:Ignorable="d"
        Title="SubWindow" 
        WindowStartupLocation="CenterScreen"
        Height="350" 
        Width="400"
        Loaded="Window_Loaded"
        Unloaded="Window_Unloaded"
        >

    Window.Resources>
        ResourceDictionary>
            BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
        ResourceDictionary>
    Window.Resources>

    Grid>
        Grid.RowDefinitions>
            RowDefinition Height="60"/>
            RowDefinition Height="*"/>
            RowDefinition Height="50"/>
        Grid.RowDefinitions>
        Label Grid.Row="0" Content="{Binding EditedElsewhere}" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="20" Margin="10" Foreground="Red"  />

        Grid Grid.Row="1">
            Grid.RowDefinitions>
                RowDefinition Height="*"/>
                RowDefinition Height="*"/>
            Grid.RowDefinitions>
            Grid.ColumnDefinitions>
                ColumnDefinition Width="50*"/>
                ColumnDefinition Width="50*"/>
            Grid.ColumnDefinitions>
            StackPanel Grid.Row="0" Grid.Column="0" Orientation="Vertical" >
                Button Name="Button01" Content="01" Command="{Binding Button01Command}" Margin="5" Width="120" Height="50" Tag="01"/>
                Label Content="{Binding Button01ClickInfo}" Height="50"/>
            StackPanel>
            StackPanel Grid.Row="0" Grid.Column="1" Orientation="Vertical" >
                Button Name="Button02" Content="02" Command="{Binding Button02Command}" Margin="5" Width="120" Height="50" Tag="02"/>
                Label Content="{Binding Button02ClickInfo}" Height="50"/>
            StackPanel>
            StackPanel Grid.Row="1" Grid.Column="0" Orientation="Vertical" >
                Button Name="Button03" Content="03" Command="{Binding Button03Command}" Margin="5" Width="120" Height="50" Tag="03"/>
                Label Content="{Binding Button03ClickInfo}" Height="50"/>
            StackPanel>
            StackPanel Grid.Row="1" Grid.Column="1" Orientation="Vertical" >
                Button Name="Button04" Content="04" Command="{Binding Button04Command}" Margin="5" Width="120" Height="50" Tag="04"/>
                Label Content="{Binding Button04ClickInfo}" Height="50"/>
            StackPanel>
        Grid>

        Button x:Name="ButtonClose" Grid.Row="2" Content="閉じる" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="5" Width="120" Height="30" Click="ButtonClose_Click"/>
    Grid>
Window>

Views/SubWindow.xaml.cs

using InteractionShare.App.ViewModels;
using InteractionShare.Shared.Hubs;
using System.Windows;

namespace InteractionShare.App.Views
{
    

続いて、クライアント側の通信処理を作成します。

InteractionShareHubReceiver.cs

using InteractionShare.Shared.Hubs;
using InteractionShare.Shared.MessagePackObjects;
using System.Collections.ObjectModel;
using System.Reactive.Subjects;
using System.Windows;

namespace DataBridge.Client
{
    internal class InteractionShareHubReceiver : IInteractionShareHubReceiver
    {
        private readonly ObservableCollectionstring> dispMessages;
        private readonly SubjectStatusResponce> statusSubject;
        public IObservableStatusResponce> StatusObservable => statusSubject;

        public InteractionShareHubReceiver(ObservableCollectionstring> messages)
        {
            dispMessages = messages;
            statusSubject = new SubjectStatusResponce>();
        }

        public void OnJoin(string name)
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                dispMessages.Add($"[{name}]がJoinしました");
            });
        }

        public void OnLeave(string name)
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                dispMessages.Add($"[{name}]がLeaveしました");
            });
        }

        public void OnSendStatus(StatusResponce responce)
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                dispMessages.Add($"[{responce.UserName}]が{responce.WindowName}{responce.FunctionName}しました");
                statusSubject.OnNext(responce);
            });
        }
    }
}

最後にMainWindowを作成します。

MainWindow.xaml

Window x:Class="InteractionShare.App.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:InteractionShare.App"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="800"
        WindowStartupLocation="CenterScreen">
    Grid Margin="10">
        Grid.ColumnDefinitions>
            ColumnDefinition Width="300"/>
            ColumnDefinition Width="500"/>
        Grid.ColumnDefinitions>

        Grid.RowDefinitions>
            RowDefinition Height="*"/>
        Grid.RowDefinitions>

        Grid Grid.Column="0">
            Grid.RowDefinitions>
                RowDefinition Height="40"/>
                RowDefinition Height="40"/>
                RowDefinition Height="40"/>
                RowDefinition Height="40"/>
            Grid.RowDefinitions>
            Grid.ColumnDefinitions>
                ColumnDefinition Width="50*"/>
                ColumnDefinition Width="50*"/>
            Grid.ColumnDefinitions>

            StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" >
                Label Content="User Name:" VerticalAlignment="Center" Margin="5"/>
                TextBox Name="TextBoxUserName" Text="UserA"  Width="200" Margin="5" Background="LightYellow" VerticalContentAlignment="Center"  />
            StackPanel>
            StackPanel Orientation="Horizontal" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" >
                Label Content="User Name:" VerticalAlignment="Center" Margin="5"/>
                TextBox Name="TextBoxServerName" Text="https://localhost:5000"  Width="200" Margin="5" Background="LightYellow" VerticalContentAlignment="Center"  />
            StackPanel>
            Button Name="ButtonJoin" Grid.Row="2" Grid.Column="0" Content="Join" Click="ButtonJoin_Click" Margin="5" />
            Button Name="ButtonLeave" Grid.Row="3" Grid.Column="0" Content="Leave" Click="ButtonLeave_Click" Margin="5" />

            Button Name="ButtonSubWindow" Grid.Row="2" Grid.Column="1" Content="Open SubWindow" Click="ButtonSubWindow_Click" Margin="5"  />
        Grid>


        ListBox Name="ListBoxMessages" Grid.Column="1"   />

    Grid>
Window>

MainWindow.xaml.cs

using DataBridge.Client;
using Grpc.Net.Client;
using InteractionShare.App.Views;
using InteractionShare.Shared.Hubs;
using InteractionShare.Shared.MessagePackObjects;
using MagicOnion.Client;
using System.Collections.ObjectModel;
using System.Windows;

namespace InteractionShare.App
{
    

以上でコーディングは完了です。
続いて、単一PCで動作確認を行っていきます。

接続先を「https://localhost:5000」にして、単一PC内で動作確認を行います。
サーバー、クライアント共に同じPC上で実行します。サーバー(InteractionShare.Server)はVisualStudioからデバッグ実行し、クライアントのWPFアプリ(InteractionShare.App)は事前にビルドしたexeを実行します。

Serverのデバッグ実行

先ほど作成した「Docker Compose」を右クリック->デバッグ->新しいインスタンス で実行します。

問題なく実行できれば、Docker DesktopのContainersに以下の様に表示されます。

この状態でビルド済みのWPFアプリ(InteractionShare.App)を実行すると、動作確認することができます。

単一PCで問題なく動作する事が確認出来たら、デバッグを終了します。
その後、Docker Desktop上から該当のコンテナを削除します。

コンテナの削除が完了したら、複数PCで動作確認するための準備へ進みます。

複数のPC上からの動作確認を行うため、自己署名証明書を作成して環境を構築します。

自己署名証明書の作成

Power Shellにて以下のコマンドを実行し、自己署名証明書を作成します。
以下のコマンドの{ホスト名}{パスワード}を任意の値に修正して実行すると、デスクトップ上に「ホスト名.pfx」が作成されます。

$certname = "{ホスト名}"
$cert = New-SelfSignedCertificate `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Subject "CN=$certname" `
-DnsName $certname `
-KeyExportPolicy Exportable `
-KeyLength 2048 
$mypwd = ConvertTo-SecureString -String "{パスワード}" -Force -AsPlainText 
$outputPath = $Env:HOMEDRIVE + $Env:HOMEPATH + "\Desktop\" + $certname + ".pfx"
Export-PfxCertificate -Cert $cert -FilePath $outputPath -Password $mypwd

(参考)

https://learn.microsoft.com/ja-jp/entra/identity-platform/howto-create-self-signed-certificate

自己署名証明書の設定(サーバー側)

サーバー側のPCでは、作成した自己署名証明書を以下の通り設定します。

  1. ユーザー証明書の管理を開き、作成した証明書を「個人」-「証明書」から「信頼されたルート証明機関」-「証明書」へ移動します。

  2. コンテナ側からpfxファイルを読み込むため、以下のファイルパスを作成しpfxファイルをコピーします。
C:\Users\{ユーザー}\.aspnet\https\{ホスト名}.pfx

Docker Composeの修正

Docker Composeにて以下の処理を追加します。

(参考)

https://learn.microsoft.com/ja-jp/aspnet/core/security/docker-compose-https?view=aspnetcore-9.0

まず「docker-compose.yml」をコピーして「docker-compose.debug.yml」を作成します。ここからは、こちらを使う様にします。これはテスト起動を目的としてファイル内にパスワードを書き込んでしまうためです。

  1. pfxを読み込むため、証明書保管先をコンテナ上でマウントします

docker-compose.debug.yml

    volumes:
      - ~/.aspnet/https:/https:ro
  1. 証明書ファイル名、パスワードを記載します

docker-compose.debug.yml

    environment:
      - ASPNETCORE_Kestrel__Certificates__Default__Password={パスワード}
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/{ホスト名}.pfx

まとめると、以下の様になります。

docker-compose.debug.yml

services:
  interactionshare.server:
    image: ${DOCKER_REGISTRY-}interactionshareserver
    build:
      context: .
      dockerfile: InteractionShare.Server/Dockerfile
    ports:
      - "5000:443"
    expose:
      - "443"
    volumes:
      - ~/.aspnet/https:/https:ro
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+
      - ASPNETCORE_HTTPS_PORT=443
      - ASPNETCORE_Kestrel__Certificates__Default__Password={パスワード}
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/{ホスト名}.pfx

完了したら、PowerShellにてDockerComposeを実行します。

cd {docker-compose.debug.ymlのパス}
docker-compose -f "docker-compose.debug.yml" up

自己署名証明書の設定(クライアント側)

サーバ側にて作成したpfxファイルを、クライアント側PCへもインストールします。
インストール時、保管場所を「信頼されたルート証明機関」-「証明書」に指定します。

動作確認

異なるPCでInteractionShare.App(WPFアプリ)を起動します。
接続先に「https://{サーバー名}:5000」を指定してJoinします。MagicOnion経由で操作内容がお互いの画面に表示される事を確認します。

サンプルコードを参考にMagicOnion + WPFで構築しましたが、かなり作りやすかったです。C#だけで完結できるのも、学習コストが低くて非常に助かります。
凄く楽しかったので、今後もいろいろやってみようと思います。



Source link

Views: 0

「ブーメラン星雲:絶対零度に迫る冷たさ!」

📌 ニュース:
宇宙で最も冷たい天体、「ブーメラン星雲」は、地球から5000光年離れた場所にあります。その温度は1K(約−272℃)で、絶対零度にわずか1℃高いだけです。

1980年に発見されたブーメラン星雲は、原始惑星状星雲に分類され、ガスが猛烈なスピードで放出されています。このガス流は秒速150〜164キロメートルにも達し、膨張により温度が劇的に低下します。

さらに、ブーメラン星雲は宇宙マイクロ波背景放射を吸収する唯一の場所とも言われており、その冷たさの理由は、二つの星からなる系による可能性が高いとされています。

将来的には、その温度が上昇し、最も冷たい天体の座を失うかもしれませんが、現在の時点では、ブーメラン星雲がその名にふさわしい存在です。

  • 宇宙で最も冷たい天体「ブーメラン星雲」についてのポイントを3つご紹介します!🌌❄️

    1. 絶対零度に近い冷たさ
      ブーメラン星雲の温度は1K(約-272℃)であり、これは絶対零度(0K、約-273.15℃)からわずか1℃高いだけです。物質が静止した状態に極めて近い、最も冷たい場所なのです。❄️

    2. ガスの猛烈な流出が原因
      星雲の中心からは秒速150〜164キロメートルのスピードでガスが放出されており、この異常な膨張が温度を劇的に下げています。ガスの放出は、二つの星の相互作用によって生じたものと考えられています。💨✨

    3. 宇宙マイクロ波背景放射を吸収
      ブーメラン星雲は、宇宙マイクロ波背景放射(CMB)よりも低い温度であり、この点で宇宙で唯一の存在です。CMBは宇宙の始まりの名残ですが、ブーメラン星雲はその影響を直接受けないほど冷たいのです。🌌🔭

    これらのポイントから、ブーメラン星雲がいかに特異な存在であるかがわかりますね!


※以下、出典元
▶ 元記事を読む

Views: 0

「26カ国、ガザ支援物資搬入を要求」

2023年8月12日、日本やイギリスを含む26か国の外相とEU(欧州連合)は、ガザ地区における緊急支援を求める共同声明を発表しました。この声明は、ガザの人々が直面している苦痛が「想像を絶するレベルに達している」と強調し、イスラエルに対して支援物資の搬入を認めるよう訴えています。

主なポイント

  1. 緊迫する状況: ガザでは、飢餓状態が深刻化しており、多くの住民が基本的な食料や水を手に入れることができずに苦しんでいます。

  2. 支援物資の搬入要求: 共同声明では、支援団体の活動を制限しないことや、すべての支援物資がガザに搬入されるよう求められています。特に、食料や水などの緊急支援物資の大規模な搬入を可能にするため、すべての検問所の開放が要請されています。

  3. 民間人の保護: さらに、声明には、ガザの食料配給所に集まる市民に対してイスラエル軍等が攻撃を行っている事例が報告されていることから、「配給所では武器を使用せず、民間人を保護するように」との要望も含まれています。

背景情報

ガザ地区は長年にわたり、経済的・人道的危機に直面しており、特に最近の緊張状態が悪化する中で、国際的な支援の必要性が高まっています。今回の共同声明は、国際社会がガザの人々に対する具体的な支援を促すための重要な動きとして注目されています。

この声明が示すように、国際的な連携と共通の意志が、ガザでの人道的状況を改善するために必要不可欠です。今後の進展が期待されています。

🧠 編集部より:

このYouTube動画では、現在のガザ地区における人道的危機についての国際的な動きが取り上げられています。日本を含む26か国の外相とEU(ヨーロッパ連合)は、ガザの人々が直面している深刻な状況に対処するため、イスラエルに対して人道支援物資の搬入を認めるよう求める共同声明を出しました。

背景とひとこと豆知識

ガザ地区では、長引く紛争や封鎖によって食料や水が不足しており、特に民間人が直接的な影響を受けています。国際的な人権団体によると、ガザの人々は栄養失調や水不足に苦しんでいる状況にあります。この共同声明は、そのような状況を改善するための緊急の呼びかけとして非常に重要です。

また、この声明では、食料配給地点での武力行使の禁止も含まれています。世界的な視点から見ると、武力行使を避け、民間人を保護することは国際法における基本的な義務です。

関連リンク

この問題に対する関心を高めるため、関連情報や支援を行う団体について調べたり、発信を行うことが大切です。

  • キーワード: 支援物資

緊急支援物資 をAmazonで探す
食料 をAmazonで探す
水 をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

ポルノ新曲「THE REVO」ヒロアカOP決定!

ポルノグラフィティの新曲「THE REVO」が、2025年10月4日から放送されるTVアニメ『僕のヒーローアカデミア FINAL SEASON』のオープニングテーマに決定しました。このアニメは『週刊少年ジャンプ』で10年間連載された人気作品で、多くのファンを魅了しています。

新曲「THE REVO」は、アニメのテーマにマッチした力強いメッセージを持っていると期待されており、ポルノグラフィティの新しい音楽スタイルが注目されています。彼らの音楽は、アニメファンだけでなく幅広いリスナーに支持されています。

このアニソンの決定は、ポルノグラフィティにとっても重要な一歩であり、彼らの音楽がどのように物語を盛り上げるのか、楽しみにしているファンも多いことでしょう。この楽曲が放送されるのが待ち遠しいですね。

🧠 編集部より:
ポルノグラフィティの新曲「THE REVO」が、TVアニメ『僕のヒーローアカデミア FINAL SEASON』のオープニングテーマに決定したことは、ファンにとって嬉しいニュースです。アニメは多くの視聴者に人気があり、彼らの音楽がどう作品を盛り上げるのかに期待が寄せられています。

『僕のヒーローアカデミア』は、堀越耕平の漫画が原作で、スーパーヒーローを目指す若者たちの成長物語が描かれています。その人気は世界的で、アニメ化や映画化もされるほどです。なんと、2020年にはアメリカのアニメアワードで受賞歴もあり、国際的な評価を受けています。

豆知識として、ポルノグラフィティは1999年にメジャーデビューし、その後も数々のヒット曲を生み出しています。中でも「アポロ」や「サウダージ」は多くの人に愛され、今でもライブでの定番曲となっています。新曲「THE REVO」もそんな人気曲の仲間入りを果たすのか、楽しみですね!

  • キーワード:ポルノグラフィティ

ポルノグラフィティ をAmazonで探す

僕のヒーローアカデミア をAmazonで探す

THE REVO をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

「ブルアカ」新ストーリー開幕!「オラトリオ」編登場!

Yostarが提供するRPG「ブルーアーカイブ」は、2025年9月17日11時に新ストーリー「Vol.6 過ぎ去りし刻のオラトリオ」編 第1章「見えない私たちの境界線」を実装します。このリリースは、長らく続報がなかったメインストーリーの新展開となります。現在、メインストーリーEX「デカグラマトン編」が進行中ですが、そこに新しいメインストーリーが並行して追加される形です。

新たなビジュアルには、ハーモニカを持つキャラクターが描かれており、ストーリーの中心は「アリウススクワッド」にフォーカスされることが示唆されています。新ストーリーの実装から3日後の9月20日には、イベント「ブルアカらいぶ!みに♪ ~京都出張編~」が開催されるため、ファンにとって注目のタイミングとなります。

また、ストーリー実装に合わせてガイドミッションも行われるとのこと。これにより、プレイヤーが新ストーリーにスムーズに親しむことができるでしょう。

以下は関連画像です。

Vol.6「過ぎ去りし刻のオラトリオ」編 第1章「見えない私たちの境界線」
Vol.6「過ぎ去りし刻のオラトリオ」編 第1章「見えない私たちの境界線」

ストーリーの実装に合わせてガイドミッションが実施される
ストーリーの実装に合わせてガイドミッションが実施される

この新しい章に期待を寄せつつ、9月のイベント情報もチェックしておくと良いでしょう。

🧠 編集部より:

補足説明

Yostarが提供する「ブルーアーカイブ(ブルアカ)」は、近年人気の高いRPGで、プレイヤーは多様なキャラクターを操作し、魅力的なストーリーを進めていきます。このたび発表された新ストーリーVol.6「過ぎ去りし刻のオラトリオ」の第1章「見えない私たちの境界線」は、特に注目に値します。ストーリーは、既存のメインストーリーEX「デカグラマトン編」と並行して実施されるため、プレイヤーはさらに多様な物語体験を楽しむことができます。

また、Vol.6では「アリウススクワッド」という新たなキャラクターたちがフィーチャーされており、新たなビジュアルではハーモニカを演奏する姿が描かれています。これは、物語の中でのキャラクターの個性を強調する重要な要素です。

さらに、ストーリー実装に合わせてガイドミッションも行われるため、新たなプレイヤーもスムーズに物語を体験しやすくなっています。

背景や豆知識

「ブルーアーカイブ」は、ゲーム内でのキャラクター同士の関係性やストーリーが魅力的視されており、定期的に新コンテンツが追加されています。これにより、プレイヤーが常に新しい発見を楽しむことができます。また、2019年にリリースされて以来、アニメーションやコラボイベントなど様々なメディア展開も行われ、幅広いファン層を獲得しています。

次なるイベント「ブルアカらいぶ!みに♪ ~京都出張編~」は、9月20日に開催予定です。このイベントでは、ゲームの楽曲やキャラクターが一堂に会する描写が期待されており、特にファンにとって必見の内容となっています。

関係するページへのリンク

ファンの皆さんは、ぜひ新たなストーリーとイベントを楽しんでくださいね!

  • キーワード: 「ブルーアーカイブ」

ブルーアーカイブ をAmazonで探す

ハーモニカ をAmazonで探す

イベント をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0