ゲーム作りは楽しい

なんか書く

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

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

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ドライブ右クリックで詳細処理 > パーティションを結合

Haskellの実行環境をVSCode DevContainerで作成

まえがき

関数型パラダイムの言語をあまり触れてこなかったので、最近Haskellを勉強中

書籍として すごいH本 を読んで勉強してます。

勉強用に実行環境を作りたかったのですが、だいたいいつも自分はちょっとした環境作成はDockerでやりたくなるので
今回もDockerでやろうと思っていたのですが
エディタ補完とかを考えると、どうしたものかと考えていたら DevContainer という便利拡張に出会った。

code.visualstudio.com

こいつを使ってHaskellの実行環境を用意することに

設定ファイル等の用意

repo
├ .devcointainer
│ ├ devcontainer.json
│ ├ Dockerfile
│ └ docker-compose.yml
└ src

devcontainer.json

{
    "name": "Haskell Dev Container",
    "dockerComposeFile": "docker-compose.yml",
    "service": "haskell-dev",
    "workspaceFolder": "/workspace",
    "extensions": [
        "haskell.haskell",
        "justusadam.language-haskell",
 ]
}

Dockerfile

# Dockerfile
FROM haskell:latest

# Install GHCup
RUN curl https://get-ghcup.haskell.org -sSf | sh
ENV PATH="/root/.ghcup/bin:${PATH}"

RUN ghcup install hls

# Set working directory
WORKDIR /workspace

# Copy project files to the container
COPY . /workspace

docker-compose.yml

version: '3'
services:
  haskell-dev:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: haskell-dev
    volumes:
      - ../src:/workspace
    tty: true

ちなみに、ほぼChatGPTに書かせました。

おまけ

ぶっちゃけちょっとコードを書くくらいならオンラインコンパイラが最強

wandbox.org

0=1の証明

本日のギャグです。


こちらのコードを見てください。

#include <cctype>
#include <iostream>
int main()
{
    using namespace std;

    int32_t x = 0;
    if (x = x + 1)
        std::cout << "true";
}

C++で以下のコードを実行したら「true」と出力されたので、 「x = x + 1」はtrueになります。
したがって、x = 0より「0 = 1」である。


...

これは間違いですよね、、

C++で等値判定は「==」にしないといけないので正しくは以下のようにしないと判定できません。

- if (x = x + 1)
+ if (x == x + 1)

「=」にした場合はifの条件評価時にxにx + 1が代入されて「1」になるのでif文を通ったわけです。


では、「==」にして再確認してみましょう。以下のコードの実行はどうでしょうか?

#include <cctype>
#include <iostraem>
int main()
{
    using namespace std;

    int32_t x = 0;
    if (x == x + 1)
        std::cout << "true";
}

なんとこれも「true」と表示されました。

やっぱり「0 == 1」なんですね!

ネタバレ

iostraemに以下のコードを書いています。

#pragma once
#include <iostream>
struct kuso
{
    constexpr kuso(){}
    constexpr kuso(int){}
    constexpr kuso operator + (int)const {return {};}
    constexpr bool operator == (kuso)const {return true;}
};
#define int32_t kuso

くそすぎ