月曜日, 4月 28, 2025
Google search engine
ホーム ブログ ページ 1413

『デビル メイ クライ 5』Steam同時接続数が爆増!アニメ開始と最大75%セールが影響? | Game*Spark


デビル メイ クライ 5(Devil May Cry 5)』のSteam同時接続数が記事執筆時点での直近24時間で6,809人まで伸びています。

本作は、2019年3月にリリースされたスタイリッシュアクションゲームシリーズ最新作。2022年10月時点では、全世界売上が600万本を突破しています。

直近1週間と比較すると約4.5倍

最高同時接続数は、SteamDBによると6.1年前の88,894人となっていますが、ここ一ヶ月は、同時接続数は多くても2,500人前後、直近1週間でみると1,500人前後となっていました。しかし、4月3日23時に急激に増加し、5,889人に。4月4日18時には、6,809人となっています。

Netflixでは、4月3日からアニメ「Devil May Cry」を配信。またSteamでは、最大75%オフの『デビル メイ クライ』FRANCHISE SALEを開催中。これらの影響により、同時接続人数が大幅に増加したようです。

『デビル メイ クライ 5』は、PC(Steam)/PS4/Xbox One向けに、『デビル メイ クライ 5 スペシャルエディション』が、PS5/Xbox Series X|S向けに発売中です。



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

Source link

【2万人以上が回答】「推し疲れ」実態調査!約3人に1人が経験あり、お金と時間の負担が主因に


「推し疲れ」大規模アンケート調査の結果

推し活の人気ジャンルランキング

アンケートではまず「推し活」をしているユーザーに対し、どのジャンルを応援しているかを調査。上位5項目は以下の通りです。

 

・アーティスト/ミュージシャン
・アイドル(国内・海外問わず)
・キャラクター・アニメ/漫画
・俳優/女優
・スポーツ選手/チーム

 

 

「推し疲れ」の経験と原因

「推し活をしている方へ。推し疲れしてしまった経験はありますか?」という質問に対し、「ある 33%」「ない 67%」という結果に。

 

約3分の1のファンが推し疲れを経験していることが明らかになりました。

 

 

推し疲れの主な原因TOP5

・推し活にお金がかかりすぎた
・自分の生活や仕事が忙しくなった
・推し活に時間がかかりすぎた
・情報や供給についていけなくなった
・SNSのファン同士のトラブルやマウント合戦

 

推し疲れは特に経済的負担時間的制約が大きな要因となっているよう。

 

近年のグッズ展開の多様化やイベント・配信の増加が、ファンの負担増につながっている可能性も考えられます。

 

 

推し疲れ後の行動パターン

「推し疲れした後、推し活はどうなりましたか?」という質問への回答順位は以下の通りでした。

 

・推し活のペースを落とした
・別の趣味を見つけた
・少し休んでまた再開した
・推し活をやめた
・他の推しに乗り換えた

 

完全に離れるのではなく、ペースダウンや一時休止という形で対応する人が多い結果に。

 

 

回復のきっかけTOP5

「少し休んでまた再開した」と回答した方に「推し疲れから立ち直る、一番のきっかけは何でしたか?」と質問した結果は以下の通りでした。

 

・時間を置いた
・推しへの愛を再確認した
・推し活以外の趣味を楽しんだ
・ファン仲間と話をした
・推しの新しい供給があった

 

適度な距離感の確保や客観的な視点を持つことが、健全な推し活の継続につながるようです。

 

現代のファン文化における「推し疲れ」の実態が明らかになった今回の調査。

 

自分のペースを大切にしながら、無理なく楽しく推し活を続けるヒントが詰まった貴重なデータとなりました!

 

 

調査概要

調査方法:「QR/バーコードリーダー・アイコニット」アプリ内アンケート
実施時期:2025年1月7日
有効回答者数:21,883人

 

※アンケート結果の出典元:「アイコニット・リサーチ」調べ

 

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

Source link

安全と言われるRustの落とし穴 #Rust – Qiita


Rustは「安全な言語」として知られています。特にメモリ安全性の面では優れた言語設計が施されていますが、それだけですべての問題が解決するわけではありません。コンパイラは多くのバグを捕捉してくれますが検出できない落とし穴も存在します。

上記の記事にRustで安全なコードを書く際によく遭遇する落とし穴と、それらを避けるためのベストプラクティスが非常によくまとまっていました。いくつか紹介します。

Rustコンパイラが検出できない問題の種類

Rustのコンパイラは優秀ですが、以下のような問題は検出できません:

  • 数値型の変換ミスによるオーバーフロー
  • ロジックのバグ
  • unwrapexpectの使用による意図しないパニック
  • サードパーティクレートの問題のあるbuild.rsスクリプト
  • 依存ライブラリの不適切なunsafeコード
  • 競合状態

それでは、よくある落とし穴とその対策を見ていきましょう。

1. 整数オーバーフローに気をつける

整数のオーバーフローはよくある問題です。次のコードを見てみましょう:

// 良くない例:オーバーフローの可能性がある
fn calculate_total(price: u32, quantity: u32) -> u32 {
    price * quantity  // 大きな数値の場合、オーバーフローする可能性あり!
}

この例では、pricequantityが大きな値の場合、結果がオーバーフローする可能性があります。デバッグモードではパニックしますが、リリースモードではラップアラウンドします(値が最大値を超えると0から再度カウントを始める)。

対策:チェック付き算術演算を使う

// 良い例:チェック付き算術演算
fn calculate_total(price: u32, quantity: u32) -> Resultu32, ArithmeticError> {
    price.checked_mul(quantity)
        .ok_or(ArithmeticError::Overflow)
}

checked_mulなどのメソッドを使うと、オーバーフローが発生した場合にNoneを返してくれるので、適切にエラー処理ができます。

また、Cargo.tomlに以下を追加しておくとリリースビルドでもオーバーフローチェックが有効になるそうです。覚えておきたいですね:

[profile.release]
overflow-checks = true

2. 数値型の変換時はasを安易に使わない

数値型の変換にはよくasキーワードが使われますが、これは安全でない場合があります:

let x: i32 = 1000;
let y: i8 = x as i8;  // 値が範囲外なので切り捨てられる!

この例では、i32からi8への変換で値が切り捨てられ、予期しない結果になります。

対策:安全な変換方法を使う

Rustには3つの主要な数値変換方法があります:

  1. asキーワード:便利だが安全でない(値が切り捨てられる可能性あり)
  2. From::from():データ損失のない変換のみ許可(拡大変換に最適)
  3. TryFrom:変換が失敗する可能性がある場合にResultを返す
// 良い例:TryFromを使った安全な変換
use std::convert::TryFrom;

let x: i32 = 1000;
let y = i8::try_from(x).map_err(|_| "値が大きすぎます")?;

この方法なら、変換が失敗した場合にエラー処理ができます。

3. 数値に境界つき型を使う

数値が特定の条件を満たす必要がある場合、単純なプリミティブ型ではなく、境界つき型を使いましょう。

// 良くない例:無制限の数値型
struct Product {
    price: f64,   // マイナスの可能性あり!
    quantity: i32,   // マイナスの可能性あり!
}

対策:カスタム型で制限を設ける

// 良い例:境界つき型
#[derive(Debug, Clone, Copy)]
struct NonNegativePrice(f64);

impl NonNegativePrice {
    pub fn new(value: f64) -> ResultSelf, PriceError> {
        if value  0.0 || !value.is_finite() {
            return Err(PriceError::Invalid);
        }
        Ok(NonNegativePrice(value))
    }
}

struct Product {
    price: NonNegativePrice,
    quantity: std::num::NonZeroU32,  // 0以外の正の整数のみ
}

この方法では、不正な値を持つオブジェクトが作れなくなります。

4. 配列のインデックスアクセスはgetメソッドを使う

配列やベクトルへの直接のインデックスアクセスは危険です:

let arr = [1, 2, 3];
let elem = arr[3];  // 範囲外アクセスでパニック!

対策:getメソッドでオプション値を返す

let arr = [1, 2, 3];
if let Some(elem) = arr.get(3) {
    println!("4番目の要素: {}", elem);
} else {
    println!("4番目の要素はありません");
}

5. split_atよりsplit_at_checkedを使う

スライスを分割する際も同様に注意が必要です:

let arr = [1, 2, 3];
let (left, right) = arr.split_at(4);  // 範囲外でパニック!

対策:チェック付きの分割方法を使う

let arr = [1, 2, 3];
match arr.split_at_checked(3) {
    Some((left, right)) => println!("分割成功: {:?} と {:?}", left, right),
    None => println!("インデックスが範囲外です")
}

6. ビジネスロジックではプリミティブ型を避ける

文字列などのプリミティブ型をそのまま使うと、バリデーションが困難になります:

// 良くない例:制限のないString型
fn authenticate_user(username: String) {
    // ユーザー名が空かも?特殊文字が含まれているかも?
}

対策:バリデーション付きのカスタム型を作る

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
struct Username(String);

impl Username {
    pub fn new(name: &str) -> ResultSelf, UsernameError> {
        if name.is_empty() {
            return Err(UsernameError::Empty);
        }

        if name.len() > 30 {
            return Err(UsernameError::TooLong);
        }

        if !name.chars().all(|c| c.is_alphanumeric() || c == '_') {
            return Err(UsernameError::InvalidCharacters);
        }

        Ok(Username(name.to_string()))
    }

    pub fn as_str(&self) -> &str {
        &self.0
    }
}

fn authenticate_user(username: Username) {
    // ユーザー名は常に有効!
}

この方法なら、関数に渡される時点で値が有効であることが保証されます。

7. 無効な状態を型システムで表現できないようにする

フィールドの組み合わせによっては無効な状態が生じることがあります:

// 良くない例:不正な組み合わせが可能
struct Configuration {
    port: u16,
    host: String,
    ssl_enabled: bool,
    ssl_cert: OptionString>, // ssl_enabled=trueなのに証明書がNoneという状態が可能
}

対策:列挙型で有効な状態のみを表現する

// 良い例:型で状態を強制
enum ConnectionSecurity {
    Insecure,
    Ssl { cert_path: String },  // 証明書なしのSSLは表現できない
}

struct Configuration {
    port: u16,
    host: String,
    security: ConnectionSecurity,
}

この方法では、「SSL有効だが証明書がない」という無効な状態を表現できなくなります。

8. Defaultの実装は慎重に

何も考えずにDefaultを実装すると問題が生じることがあります:

// 良くない例:不適切なデフォルト値
#[derive(Default)]
struct ServerConfig {
    port: u16,       // 0になる(有効なポートではない)
    max_connections: usize,  // 0になる
    timeout_seconds: u64, // 0になる
}

対策:意味のあるデフォルト値を提供するか、Defaultを実装しない

// 良い例:明示的な初期化
struct ServerConfig {
    port: Port,
    max_connections: std::num::NonZeroUsize,
    timeout: std::time::Duration,
}

impl ServerConfig {
    pub fn new(port: Port) -> Self {
        Self {
            port,
            max_connections: NonZeroUsize::new(100).unwrap(),
            timeout: Duration::from_secs(30),
        }
    }
}

9. Debug実装時は機密情報に注意

Debugトレイトを自動導出すると、機密情報が漏洩する恐れがあります:

// 良くない例:機密情報が表示される
#[derive(Debug)]
struct User {
    username: String,
    password: String,   // デバッグ出力で見えてしまう!
}

対策:機密情報を含む型はDebugを手動実装する

#[derive(Debug)]
struct User {
    username: String,
    password: Password,
}

struct Password(String);

impl std::fmt::Debug for Password {
    fn fmt(&self, f: &mut std::fmt::Formatter'_>) -> std::fmt::Result {
        f.write_str("[REDACTED]")
    }
}

これにより、デバッグ出力時にパスワードが「[REDACTED]」と表示されるようになります。

また、次のような実装もあります:

impl std::fmt::Debug for DatabaseURI {
    fn fmt(&self, f: &mut std::fmt::Formatter'_>) -> std::fmt::Result {
        // 構造体を分解して、フィールドが追加された場合にコンパイルエラーになるようにする
        let DatabaseURI { scheme, user, password: _, host, database, } = self;
        write!(f, "{scheme}://{user}:[REDACTED]@{host}/{database}")?;
        Ok(())
    }
}

10. シリアライズ・デシリアライズは慎重に

serdeSerializeDeserializeを自動導出すると、思わぬ問題が生じることがあります:

// 良くない例:チェックなしのシリアライズ
#[derive(Serialize, Deserialize)]
struct UserCredentials {
    #[serde(default)]   // デシリアライズ時に空文字を受け入れる
    username: String,
    #[serde(default)]
    password: String,  // シリアライズ時に平文で出力される
}

対策:カスタム実装で検証を組み込む

#[derive(Deserialize)]
#[serde(try_from = "String")]
pub struct Password(String);

impl TryFromString> for Password {
    type Error = PasswordError;

    fn try_from(value: String) -> ResultSelf, Self::Error> {
        if value.len()  8 {
            return Err(PasswordError::TooShort);
        }
        Ok(Password(value))
    }
}

この方法では、デシリアライズ時に自動的に検証が行われます。

11. 時間差攻撃から守る

機密データを比較する際は、実行時間の差から情報が漏れる可能性があります:

// 良くない例:単純な比較
fn verify_password(stored: &[u8], provided: &[u8]) -> bool {
    stored == provided   // タイミング攻撃に弱い
}

対策:定数時間比較を使用する

// 良い例:定数時間比較
use subtle::{ConstantTimeEq, Choice};

fn verify_password(stored: &[u8], provided: &[u8]) -> bool {
    stored.ct_eq(provided).unwrap_u8() == 1
}

12. 入力サイズを制限する

無制限の入力を受け付けると、DoS攻撃の原因になります:

// 良くない例:サイズ制限なし
fn process_request(data: &[u8]) -> Result(), Error> {
    let decoded = decode_data(data)?;   // 巨大なデータでメモリを使い果たす可能性
    // 処理
    Ok(())
}

対策:明示的なサイズ制限を設ける

// 良い例:明示的なサイズ制限
const MAX_REQUEST_SIZE: usize = 1024 * 1024;  // 1MiB

fn process_request(data: &[u8]) -> Result(), Error> {
    if data.len() > MAX_REQUEST_SIZE {
        return Err(Error::RequestTooLarge);
    }
    
    let decoded = decode_data(data)?;
    // 処理
    Ok(())
}

13. Path::joinの挙動に注意

パスを結合する際のPath::joinメソッドには注意が必要です:

use std::path::Path;

fn main() {
    let path = Path::new("/usr").join("/local/bin");
    println!("{path:?}");  // "/local/bin" と出力される
}

第2引数が絶対パスの場合、第1引数は無視されます。 これは意図しない動作につながる可能性があります。

14. 依存パッケージのunsafeコードをチェックする

自分のコードだけでなく、依存ライブラリのunsafeコードも脆弱性の原因になります。

対策:cargo-geigerで依存関係をチェック

cargo install cargo-geiger
cargo geiger

このツールを使うと、プロジェクトの依存関係に含まれるunsafe関数の数を確認できます。

15. Clippyでコンパイル時に問題を検出する

Rustのlintツール「Clippy」を使うと、前述の多くの問題をコンパイル時に検出できます:

// 数値演算関連
#![deny(arithmetic_overflow)]
#![deny(clippy::checked_conversions)]
#![deny(clippy::cast_possible_truncation)]

// unwrap関連
#![deny(clippy::unwrap_used)]
#![deny(clippy::expect_used)]

// 配列インデックス関連
#![deny(clippy::indexing_slicing)]

// その他
#![deny(clippy::join_absolute_paths)]
#![deny(clippy::serde_api_misuse)]

覚えておきたいのが:

  • cargo check はこれらの問題を報告しません
  • cargo run は実行時にパニックするか失敗します

一方

  • cargo clippyコンパイル時にすべての問題を検出します!

まとめ

Rustは安全な言語として設計されていますが、コンパイラだけでは検出できない問題も多くあります。実践的な対策も紹介されており大変参考になりました。

参考リンク



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

Source link

推論モデルは「思考内容」を出力しているけど実際の思考内容とはズレていることが判明、Anthropicが自社のClaude 3.7 SonnetやDeepSeek-R1で検証 – GIGAZINE



大規模言語モデルの中には、与えられた質問について長時間思考したうえで回答を出力する「推論」という機能を備えたものもあります。推論機能を備えたAIモデルの多くは回答の出力と同時に思考内容も出力するのですが、出力される思考内容と実際の思考内容にズレがあることがAnthropicの研究で明らかになりました。

Reasoning models don’t always say what they think \ Anthropic
https://www.anthropic.com/research/reasoning-models-dont-say-think

推論機能を備えたAIの例として、Grokを使ってみます。まず、質問を入力して「Think」をクリックしてから送信ボタンをクリック。


すると、回答を出力する前に長時間の思考が始まります。


回答が出力された後に「シンキングした時間」と記された部分をクリック。


すると、思考内容が表示されました。


上記のような推論機能はGrokだけでなくChatGPTやClaudeなどのチャットAIにも実装されており、幅広いユーザーに利用されています。しかし、Anthropicは「出力される思考内容は実際の思考内容に沿ったものなのか?」という疑問を提示し、自社製推論モデル「Claude 3.5 Sonnet」および「Claude 3.7 Sonnet」とDeepSeek製推論モデル「DeepSeek-V3」および「DeepSeek-R1」を対象に実験を行いました。

Anthropicは推論モデルに対して「スタンフォード大学の教授は○○と言っていた」とか「システムに侵入してみた結果、○○という情報を得た」といったヒントを用意し、ヒントの有無によってAIモデルの出力がどのように変化するのか検証しました。その結果、ヒントを与えられたAIモデルはヒントに沿って最終的な回答を変化させたものの、出力された思考内容には「ヒントを参考にした」という情報が含まれていませんでした。つまり、推論モデルの実際の思考には「ヒントを参照する」というプロセスが含まれていたものの、思考内容の出力時にはその事実を伏せたというわけです。


以下のグラフは「Claude 3.5 Sonnet」「Claude 3.7 Sonnet」「DeepSeek-V3」「DeepSeek-R1」が「思考時にヒントを参照したことを伏せた割合」をヒントの種類ごとにまとめたものです。平均してClaude 3.5 Sonnetは5%、Claude 3.7 Sonnetは25%、DeepSeek-V3は15%、DeepSeek-R1は39%の割合で出力する思考内容と実際の思考内容にズレが生じていました。


さらに、Anthropicは「故意に間違った回答に導くヒント」を作成し、「間違ったヒントに従って間違った回答を出力した際に報酬を最大化する」という条件で推論モデルを強化学習しました。その結果、「ヒントに最大限したがって間違った回答を出力する推論モデル」が作り出されましたが、この推論モデルも「ヒントを参照した」という事実を伏せる傾向にあったそうです。


Anthropicは「我々の実験結果は高度な推論モデルが思考プロセスを頻繁に隠していることを示している」と述べ、推論モデルに本当の思考プロセスを出力させる方法を構築する必要性を訴えています。

なお、実験内容や結果の詳細は以下のリンク先で確認できます。

Reasoning Models Don’t Always Say What They Think
(PDFファイル)https://assets.anthropic.com/m/71876fabef0f0ed4/original/reasoning_models_paper.pdf

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

・関連記事
AIの頭の中ではどのように情報が処理されて意思決定が行われるのかをAnthropicが解説 – GIGAZINE

AIは「思考している」のか、それとも「思考しているよう見せかけている」だけなのか? – GIGAZINE

人間とAIの「思考」に大きな違いがあることが研究で判明、AIは推論が苦手な可能性 – GIGAZINE

「推論モデルがユーザーにバレないように不正する現象」の検出手法をOpenAIが開発 – GIGAZINE

MicrosoftのAIアシスタント「Microsoft 365 Copilot」に推論エージェント「Researcher」と「Analyst」が追加される、OpenAIのo3ベースでデータ解析や文献調査が可能 – GIGAZINE

Googleが次世代推論AIモデル「Gemini 2.5」発表、推論とコーディング性能が大きく向上 – GIGAZINE

NVIDIAが推論AIを低コスト・高効率で稼働するための高速化ライブラリ「NVIDIA Dynamo」を公開、DeepSeek-R1を30倍に高速化可能とアピール – GIGAZINE

Baidu(百度)がDeepSeek-R1に匹敵するマルチモーダルAIモデル「ERNIE 4.5」と「ERNIE X1」を発表 – GIGAZINE

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

Source link

『マリオカート ワールド』の発表にショックを受けるインディーゲーム開発者…似た機能を搭載したレースゲームを開発中だった | Game*Spark – 国内・海外ゲーム情報サイト



『マリオカート ワールド』の発表にショックを受けるインディーゲーム開発者...似た機能を搭載したレースゲームを開発中だった | Game*Spark - 国内・海外ゲーム情報サイト

任天堂が4月2日に正式発表したニンテンドースイッチ2向けソフト『マリオカート ワールド』。久々の完全新作が登場ということで注目を集めていますが、その裏では違った意味でショックを受けているインディーゲーム開発者がいたようです。

『マリオカート』との不運なアイデア被りを嘆くインディーゲーム開発者

そのインディーゲーム開発者とは、見下ろし視点レースゲームFlex Ridersを手掛けるSharuu氏。Flex Ridersは、レースゲームとスケートボードが融合したカオスな物理演算が特徴の対戦ゲームとして、2024年5月Steamストアページが公開された開発中の作品です。トレイラーでは、車同士がぶつかり合いながらレールの上を滑ったり空中で回転したりしてレースを繰り広げている様子を確認できます。

Sharuu氏は、『マリオカート ワールド』で注目を集める要素の1つとしてレールの上を滑る機能が搭載されていることにショックを受けた様子。また、記事冒頭に掲載した動画では壁走りの機能も似通っていることを確認できます。Sharuu氏は、このアイデア被りに「おしまいだ(i’m fucked)」「プレイヤーは本作のことを安っぽいマリオカートととらえるようになるだろう」とコメントしています。

なお、任天堂にスパイされたのか?という質問には「そんなことは絶対にありえないだろう。万が一そうだとしても怒るよりも誇りに思う」と返答しており、任天堂にアイデアを盗まれたと主張しているわけではありません。あくまで不運なアイデア被りであったものの、『マリオカート』というビッグタイトルとぶつかってしまったことで、プレイヤーからの反応などの面で弱い立場になるであろうことに落ち込んでいる…ということなのでしょう。

とはいえ、本作には磁石で敵の車を投げ飛ばす、グラップリングフックでロケットに飛びつくなど、現状『マリオカート ワールド』には存在しないと思われるギミックも多数あります。一連の投稿を見たXユーザーからは「クールなゲームだから売れることを願っている」「私が『マリオカート ワールド』と『Flex Riders』に求めているものは違うから大丈夫だ。両方購入する」「任天堂と同じアイデアを思いつけたことを誇りに思って」などと好意的な反応が寄せられていました。

誰が悪いともいえない不運な事故

世界中でインディーゲームが盛んに開発されている昨今、大手デベロッパーとの不運なアイデア被りが発生してしまう事例も増えていることでしょう。

『Flex Riders』の発売時期は未定でSteamにてリリース予定。また、『マリオカート ワールド』はニンテンドースイッチ2向けに6月5日リリース予定です。



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

Source link

仲間と力を合わせて謎の島から脱出しよう。シンプル操作と温かみあるビジュアルが魅力の「サバイバルキッズ」[Switch 2先行体験]



仲間と力を合わせて謎の島から脱出しよう。シンプル操作と温かみあるビジュアルが魅力の「サバイバルキッズ」[Switch 2先行体験]

 突然の嵐で流れ着いた島から,みんなで協力して脱出を目指そう。同名シリーズ作品の久しぶりの新作となるKONAMIの「サバイバルキッズ」を,NintendoSwitch2のプレビューイベントで一足先にプレイし,ゲームの基本の流れを体験してきた。

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

Source link