ゲーム作りは楽しい

なんか書く

【C++】コンパイル時 1+1は?みそスープ

1+1がみそスープであることは、コンパイル時にも計算できます。

#include <string_view>

consteval bool operator ==(int i , std::string_view str)
{
    return i == 2 && str == "みそスープ";
}
consteval bool operator !=(int i , std::string_view str)
{
    return !(i == str);
}
int main()
{
    using namespace std::string_view_literals;

    static_assert(1 + 2 != "みそスープ"sv);
    static_assert(1 + 1 != "みそ"sv);
    static_assert(1 + 1 == "みそスープ"sv);
}

そうえば、日常見たことないかも

呼ばれるたびにGet Wildが流れ出すゲッター

こんなゲッターは嫌だ

// 男
class Man
{
public:
    Man(float height, float weight, int32 wild)
        : m_height(height)
        , m_weight(weight)
        , m_wild(wild)
    {}

    // 身長取得
    [[nodiscard]] float getHeight() const { return m_height; }

    // 体重取得
    [[nodiscard]] float getWeight() const { return m_weight; }

    // Get Wild
    [[nodiscard]] int32 getWild() const 
    {
        s3d::System::LaunchBrowser(U"https://www.youtube.com/watch?v=NHKq8IOXPxA&t=1m02s");
        return m_wild;
    }

private:
    // 身長cm
    float m_height;
    // 体重kg
    float m_weight;

    // ワイルドさ
    int32 m_wild;
};
void Main()
{
    Man ryo{ 186.0, 72.0, 99999 };
    while (System::Update()) {
        if (KeySpace.down()) {
            Print << U"[Height] " << ryo.getHeight();
            Print << U"[Weight] " << ryo.getWeight();
            Print << U"[Wild]   " << ryo.getWild();
        }
    }
}

ポイント

YoutubeのURLの秒数指定でちょうどサビから始まるようになってます。

ダメな所

広告が流れ出すとめちゃめちゃガッカリします

ジョンネイピアに感謝しながら相乗平均を計算した

ちょっと相乗平均(幾何平均)を求める必要があったのだが
最初は脳死で定義通りのプログラムを書いた
※例のコードでは空配列の考慮は省略

template<class R>
double GeometricMean(const R& ar)
{
    double product = 1;
    for (const auto& v : ar)
    {
        product *= v;
    }
    return std::pow(product, 1.0 / std::size(ar));
}

まぁ問題はない。

のだけど、データセットの数値感が大きかったので一瞬でオーバーフローしちゃった 100~200程度の数が数百個あったので…
そこでジョンネイピアに感謝しながら対数を使うことで小さい足し算にして計算した

template<class R>
double GeometricMean(const R& ar)
{
    double logSum = 0;
    for (const auto&  v : ar)
    {
        logSum += std::log(v);
    }
    return std::exp(logSum / std::size(ar));
}

対数の発見は偉大過ぎると思いました。
ありがとう。ジョンネイピア。

どっかでみたようなローディングのサークル

# include <Siv3D.hpp>

void Main()
{
    Window::Resize({ 300, 300 });

    const Vec2 center = Scene::CenterF();

    while (System::Update())
    {
        constexpr Duration periodSec = 2s;
        const double rotateRate = s3d::Periodic::Sawtooth0_1(periodSec * 0.75);
        const double offsetAngle = rotateRate * Math::TwoPi;

        const double rate = s3d::Periodic::Sawtooth0_1(periodSec);
        double startAngle = offsetAngle;
        if (rate <= 0.5) {
            startAngle += Math::Lerp(0, Math::TwoPi, rate * 2);
        } else {
            startAngle += Math::TwoPi;
        }
        double endAngle = offsetAngle;
        if (rate <= 0.5) {
            endAngle += Math::Lerp(0, Math::HalfPi, rate * 2);
        } else {
            endAngle += Math::Lerp(Math::HalfPi, Math::TwoPi, (rate - 0.5) * 2);
        }
        const double angle = -(startAngle - endAngle);

        Circle(center, 100).drawArc(startAngle, angle, 0, 30);
    }
}

個人ホームページにRSSを取得して表示するようにした

ホームページは Vue.js で作ってるけど だいたいこんな感じ

<template>
  <div class="feed">
    <table>
      <tbody>
        <tr v-for="item in sortedFeedItems" :key="item.guid">
          <td>
            <p class="date">{{ item.pubDate }}</p>
            <p class="title"><a :href="item.link" target="_blank">{{ item.title }}</a></p>
          </td>
          <td> <a :href="item.feedLink" target="_blank">
              <p class="feed-title">{{ item.feedTitle }}</p>
            </a></td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: "RSSFeed",
  data() {
    return {
      feedItems: [],
    };
  },
  components: {
  },
  computed: {
    sortedFeedItems() {
      // pubDataを基準に記事を降順にソート
      return this.feedItems.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));
    },
  },
  mounted() {
    this.fetchRSSFeeds();
  },
  methods: {
    fetchRSSFeeds() {
      const requests = [
        // RSS Feed URL
      ].map(url =>
        axios.get(`https://api.rss2json.com/v1/api.json?rss_url=${url}`)
      );

      axios.all(requests)
        .then(responses => {
          responses.forEach(response => {
            const data = response.data;
            const fixedData = data.items.map(item => {
              item.feedTitle = data.feed.title;
              item.feedLink = data.feed.link;
              return item;
            });
            this.feedItems = this.feedItems.concat(fixedData);
          });
        })
        .catch(error => {
          console.error('Error fetching RSS feeds:', error);
        });
    },
  },
};
</script>

rss2jsonというAPIがあったのでこれにURLを投げてJSONにして受け取っています。

田舎のヤマダ電機で買ったノートPC

タダの備忘録

ワタシが今個人で使ってるノートPCのスペックをいつも忘れるのでメモしておく

https://jp.store.asus.com/store/asusjp/ja_JP/pd/ThemeID.4850018000/productID.5361152000

昔、田舎のヤマダ電機で一番スペックのいいWindowsノートPCをくださいと言ったらこれが出てきたので
これを買った

ハードにあまり興味がなくて、PCスペックに詳しくなかったので、わりと適当に買ってしまったので良くなかったとは思っている。
(普段ゴリゴリの3DグラフィクスなPCゲーとかを遊ばないので、そこまで気にすることがなかったというのもある)

【備忘録】Dドライブの空き容量をCドライブに移動した

Cドライブがきつきつで、ぴえんになってきたので
Dドライブの余ってる容量をCドライブに移動させた。

普通にディスクの管理からやると、一度Dドライブをバックアップしてから削除して、未割当て状態にするのが面倒くさかったので
無料でパーティションのリサイズ等をやってくれるソフトを探していたのだが

下記ソフトの無料版で対応できた。

www.diskpart.com

  1. Dドライブ右クリックでパーティションのリサイズ/移動
  2. Cドライブ右クリックで詳細処理 > パーティションを結合