メインコンテンツへスキップ

[雑記] 梅雨でドーパミンとセロトニンが不足している
xtool 改善
自作ゲーム バグ

··5653 文字·12 分·
日記 雑記 xtool セロトニン ドーパミン 梅雨 低気圧 プログラミング
著者
Admin
目次

自慰したあとに眠る前になぐり書きしているので誤字脱字などは許してくれ。

セロトニン、ドーパミンが不足している
#

3日前ぐらいから以上にやる気がでない。

梅雨入りで低気圧、曇りが続いているのでその影響だと思う。
なので最近は比較的やる気なくてもできることを少しだけやっていた。

作業要素の高いプログラミングやファイル整理などだ。

数学も少しやっているが、一日やらなかったりした。

飯も食う気が起きない。
この前食った数ヶ月前のカレーの残りの冷凍を解凍して作ったカレーそばがめちゃくちゃまずくて、それが原因かどうかわからないがそこから飯を食うのが面倒になってしまったので1日1食しか食っていない。

米も麺も用意が面倒なので鶏肉とにんにくが主食だ。
エネルギーは食パンとじゃがいもで補っている。

めちゃまずカレーそば以外に考えられる原因は低気圧で鼻が機能していないので味をかなり感じられなくなっていることだろう。

後は最初に言った脳内物質もやはり関係しているのかもしれない。

雨や曇は子供の頃から好きだったが中学あたりから自立神経が壊れ始めたので低気圧の影響を受けやすくなった。

xtool
#

ここ2,3日間主に手をつけていたのが🔗xtoolだ。

xtoolは身内向けのツールなので、xtoolとはなんぞやと思う人がほとんどなはずということで、かんたんに説明する。

xtoolはスマブラXというwiiのゲームを🔗dolphinエミュレータでプレイする際に、ゲーム内の音楽の代わりに、PC上にある音楽ファイルをゲームの場面に合わせて再生するソフトウェア(ツール)だ。

スマブラXを改造して曲を突っ込む方法もあるが、面倒だし音楽ファイルを変換する際に音質が落ちるのでPC上でやってしまえと思い開発したものだ。
ゲーム音楽の方はミュートしておけば良い。

実装にはみんな大好きC++言語を使用している。

機能自体はすでに完成していたのだが、大幅なリファクタや機能追加を行っていた。

乱数の質
#

xtoolは登録した曲の中から条件に合うものをランダムで一つ選んで再生する実装になっているのだが、dolphinエミュレータを利用してネット対戦している際に、どのプレイヤーサイドでも同じ曲が流れるようにしたいので、PCの現在時刻を元に乱数生成していた。

PCの時計が狂っていなければ同じ曲が再生される。

しかし、使用しているうちにどうもおかしいと思い始めた。

特定の曲ばかり選ばれる傾向があることになんとなく気がついた。

そこで、まず、時刻をもとに乱数生成したらどのくらいランダムになるのか確かめることにした。

検証コードは以下だ。
前にxtoolで使っていた乱数生成方法をそのままテストした。
厳密ではないが小手調べには十分だ。

#include <cassert>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <ctime>
#include <map>
#include <random>
#include <stdexcept>
#include <unordered_map>
#include <utility>

std::size_t time_seed_rand(std::size_t const l, std::size_t const r,
                           int epoch = -1) {
  assert(l <= r);
  // seed
  // auto now = std::chrono::utc_clock::now();
  // auto duration = now.time_since_epoch();
  // std::uint64_t minutes =
  //     std::chrono::duration_cast<std::chrono::minutes>(duration).count();

  std::time_t now = std::time(nullptr);
  auto const tm = std::gmtime(&now);
  if (!tm) {
    throw std::runtime_error("Failed to convert std::time_t to UTC");
  }

  int minutes_since_epoch = (now / 60);
  if (epoch != -1) {
    minutes_since_epoch = epoch;
  }

  std::uint32_t constexpr constant = 0x0a5a5a5a;
  // std::printf("epoch %d\n", minutes_since_epoch);
  std::uint32_t seed = minutes_since_epoch ^ constant;
  seed ^= tm->tm_mday << 16; // 日
  seed ^= tm->tm_hour << 31;

  // generate
  std::mt19937 rng(seed);
  std::uniform_int_distribution<std::size_t> dist(l, r);
  std::size_t v = dist(rng);
  return v;
}

int main() {
  auto const fn_test_rand = [](std::size_t const l, std::size_t const r,

                               std::uint32_t const count = 1000) {
    std::map<std::size_t, std::uint32_t> results;
    auto constexpr epoch_base = 28654799;
    for (auto i = 0; i < count; ++i) {

      std::random_device rd;
      std::mt19937 gen(rd());

      std::uniform_int_distribution<> dis(0, 60 * 3);

      auto const delta = dis(gen);

      // ランダムな整数の生成
      int random_int = dis(gen);

      auto const rand = time_seed_rand(l, r, epoch_base + delta);
      if (auto [ignore_, is_inserted] = results.insert(std::make_pair(rand, 1));
          !is_inserted) {
        ++results[rand];
      }
    }

    // print result
    std::printf("Result l=%lu, r=%lu, count=%u\n", l, r, count);
    std::printf("%lu unique results\n", results.size());
    for (auto const [k, v] : results) {
      std::printf("value %lu, occurence %u\n", k, v);
    }
    std::puts("\n\n");
  };

  fn_test_rand(0, 10);
  fn_test_rand(0, 10);

  fn_test_rand(0, 100, 1000000);
  fn_test_rand(0, 100, 1000000);

  fn_test_rand(0, 1000, 1000000);
  fn_test_rand(0, 1000, 1000000);
  return 0;
}

コンパイル&実行コマンド

g++ -std=c++20 rand.cpp -o r && ./r

実行結果

Result l=0, r=10, count=1000
11 unique results
value 0, occurence 45
value 1, occurence 85
value 2, occurence 93
value 3, occurence 123
value 4, occurence 93
value 5, occurence 65
value 6, occurence 67
value 7, occurence 131
value 8, occurence 105
value 9, occurence 82
value 10, occurence 111



Result l=0, r=10, count=1000
11 unique results
value 0, occurence 48
value 1, occurence 115
value 2, occurence 83
value 3, occurence 115
value 4, occurence 100
value 5, occurence 76
value 6, occurence 57
value 7, occurence 117
value 8, occurence 98
value 9, occurence 88
value 10, occurence 103



Result l=0, r=100, count=1000000
86 unique results
value 0, occurence 5485
value 2, occurence 5473
value 3, occurence 5571
value 5, occurence 16600
value 7, occurence 5478
value 8, occurence 11067
value 9, occurence 5536
value 10, occurence 5561
value 11, occurence 5463
value 12, occurence 22055
value 13, occurence 16555
value 15, occurence 5473
value 16, occurence 27639
value 17, occurence 11029
value 19, occurence 11103
value 21, occurence 10857
value 22, occurence 21976
value 23, occurence 5523
value 24, occurence 5628
value 25, occurence 11066
value 26, occurence 11056
value 27, occurence 11051
value 28, occurence 22106
value 29, occurence 5592
value 30, occurence 11053
value 31, occurence 5468
value 33, occurence 33286
value 34, occurence 22206
value 35, occurence 22162
value 36, occurence 5473
value 37, occurence 16384
value 38, occurence 5650
value 39, occurence 16572
value 40, occurence 5580
value 41, occurence 10913
value 42, occurence 5583
value 43, occurence 11168
value 44, occurence 16679
value 45, occurence 5425
value 46, occurence 16561
value 48, occurence 10985
value 49, occurence 5552
value 51, occurence 11039
value 52, occurence 11118
value 54, occurence 16527
value 55, occurence 22226
value 56, occurence 5630
value 57, occurence 5532
value 59, occurence 10841
value 62, occurence 10962
value 63, occurence 5465
value 64, occurence 5611
value 65, occurence 11022
value 66, occurence 5602
value 67, occurence 5483
value 68, occurence 27605
value 69, occurence 5464
value 70, occurence 22190
value 71, occurence 16318
value 72, occurence 11182
value 73, occurence 11331
value 74, occurence 11021
value 75, occurence 11064
value 76, occurence 11145
value 77, occurence 16677
value 78, occurence 5538
value 79, occurence 16532
value 80, occurence 16599
value 81, occurence 5519
value 82, occurence 10991
value 83, occurence 10939
value 84, occurence 11101
value 85, occurence 5635
value 86, occurence 5595
value 88, occurence 16338
value 90, occurence 16553
value 91, occurence 5532
value 92, occurence 11010
value 93, occurence 11058
value 94, occurence 16535
value 95, occurence 16552
value 96, occurence 5501
value 97, occurence 16505
value 98, occurence 11106
value 99, occurence 5505
value 100, occurence 16658



Result l=0, r=100, count=1000000
86 unique results
value 0, occurence 5494
value 2, occurence 5500
value 3, occurence 5612
value 5, occurence 16455
value 7, occurence 5536
value 8, occurence 11024
value 9, occurence 5710
value 10, occurence 5494
value 11, occurence 5398
value 12, occurence 22044
value 13, occurence 16723
value 15, occurence 5376
value 16, occurence 27633
value 17, occurence 11087
value 19, occurence 10954
value 21, occurence 11046
value 22, occurence 22194
value 23, occurence 5483
value 24, occurence 5609
value 25, occurence 10950
value 26, occurence 11067
value 27, occurence 11044
value 28, occurence 21940
value 29, occurence 5581
value 30, occurence 11057
value 31, occurence 5596
value 33, occurence 33291
value 34, occurence 22025
value 35, occurence 21918
value 36, occurence 5635
value 37, occurence 16588
value 38, occurence 5590
value 39, occurence 16403
value 40, occurence 5538
value 41, occurence 10998
value 42, occurence 5620
value 43, occurence 10872
value 44, occurence 16765
value 45, occurence 5592
value 46, occurence 16530
value 48, occurence 11229
value 49, occurence 5546
value 51, occurence 11065
value 52, occurence 11150
value 54, occurence 16577
value 55, occurence 22028
value 56, occurence 5341
value 57, occurence 5436
value 59, occurence 10910
value 62, occurence 10998
value 63, occurence 5470
value 64, occurence 5414
value 65, occurence 11201
value 66, occurence 5428
value 67, occurence 5414
value 68, occurence 27531
value 69, occurence 5475
value 70, occurence 21938
value 71, occurence 16669
value 72, occurence 11206
value 73, occurence 10912
value 74, occurence 11049
value 75, occurence 11073
value 76, occurence 11135
value 77, occurence 16618
value 78, occurence 5574
value 79, occurence 16679
value 80, occurence 16610
value 81, occurence 5475
value 82, occurence 11152
value 83, occurence 11009
value 84, occurence 11134
value 85, occurence 5512
value 86, occurence 5618
value 88, occurence 16406
value 90, occurence 16897
value 91, occurence 5525
value 92, occurence 10981
value 93, occurence 11113
value 94, occurence 16790
value 95, occurence 16554
value 96, occurence 5636
value 97, occurence 16620
value 98, occurence 11120
value 99, occurence 5487
value 100, occurence 16323



Result l=0, r=1000, count=1000000
159 unique results
value 4, occurence 5473
value 27, occurence 5549
value 36, occurence 5527
value 54, occurence 5548
value 59, occurence 11222
value 73, occurence 5419
value 84, occurence 10949
value 94, occurence 5600
value 100, occurence 5494
value 116, occurence 5494
value 121, occurence 5658
value 124, occurence 5605
value 125, occurence 5518
value 127, occurence 5473
value 129, occurence 5469
value 131, occurence 5478
value 137, occurence 5461
value 158, occurence 5429
value 162, occurence 5505
value 164, occurence 11181
value 165, occurence 5564
value 167, occurence 5473
value 171, occurence 5582
value 176, occurence 5578
value 189, occurence 5561
value 192, occurence 5534
value 208, occurence 5520
value 213, occurence 5537
value 218, occurence 5604
value 220, occurence 5398
value 227, occurence 11024
value 233, occurence 5443
value 244, occurence 5455
value 251, occurence 11126
value 263, occurence 11121
value 267, occurence 5516
value 276, occurence 5441
value 283, occurence 11037
value 285, occurence 11056
value 293, occurence 5450
value 301, occurence 5538
value 305, occurence 5645
value 314, occurence 5605
value 327, occurence 11083
value 328, occurence 5582
value 329, occurence 5574
value 332, occurence 5526
value 334, occurence 5427
value 337, occurence 5514
value 339, occurence 10775
value 344, occurence 5533
value 347, occurence 5482
value 349, occurence 5586
value 353, occurence 10865
value 366, occurence 5478
value 373, occurence 11192
value 374, occurence 5400
value 385, occurence 5465
value 388, occurence 5535
value 392, occurence 5549
value 394, occurence 5603
value 405, occurence 5610
value 409, occurence 5490
value 413, occurence 5535
value 418, occurence 5595
value 433, occurence 11006
value 437, occurence 5540
value 439, occurence 5415
value 445, occurence 5644
value 452, occurence 5661
value 456, occurence 5388
value 463, occurence 5441
value 464, occurence 5629
value 480, occurence 5425
value 484, occurence 5521
value 486, occurence 5501
value 508, occurence 5423
value 515, occurence 5529
value 523, occurence 11127
value 538, occurence 5446
value 539, occurence 5654
value 540, occurence 5407
value 545, occurence 5504
value 546, occurence 5703
value 548, occurence 5559
value 549, occurence 5620
value 556, occurence 5579
value 566, occurence 5700
value 585, occurence 5510
value 586, occurence 5488
value 619, occurence 10849
value 630, occurence 5532
value 644, occurence 5513
value 647, occurence 5473
value 650, occurence 5467
value 656, occurence 5523
value 664, occurence 5433
value 675, occurence 5533
value 677, occurence 11276
value 679, occurence 11037
value 688, occurence 5507
value 694, occurence 5557
value 699, occurence 11020
value 702, occurence 5531
value 703, occurence 5618
value 710, occurence 5648
value 711, occurence 5467
value 720, occurence 10916
value 724, occurence 5525
value 729, occurence 5501
value 735, occurence 5425
value 740, occurence 5389
value 749, occurence 5519
value 751, occurence 5536
value 754, occurence 5469
value 762, occurence 5436
value 768, occurence 5515
value 770, occurence 5526
value 771, occurence 5444
value 777, occurence 5632
value 783, occurence 5700
value 787, occurence 5473
value 790, occurence 5583
value 792, occurence 5628
value 794, occurence 5532
value 799, occurence 5493
value 805, occurence 5501
value 815, occurence 5614
value 822, occurence 5526
value 825, occurence 5380
value 828, occurence 5547
value 834, occurence 5537
value 841, occurence 5553
value 851, occurence 5419
value 854, occurence 5580
value 874, occurence 5517
value 877, occurence 11129
value 892, occurence 5533
value 895, occurence 5519
value 901, occurence 5556
value 903, occurence 5488
value 914, occurence 5407
value 917, occurence 5545
value 922, occurence 5591
value 928, occurence 5479
value 937, occurence 5602
value 938, occurence 5485
value 940, occurence 5494
value 941, occurence 5545
value 942, occurence 5571
value 945, occurence 5608
value 957, occurence 5556
value 962, occurence 5575
value 968, occurence 11079
value 972, occurence 5518
value 980, occurence 5561
value 986, occurence 5523
value 992, occurence 5633
value 999, occurence 10924



Result l=0, r=1000, count=1000000
159 unique results
value 4, occurence 5499
value 27, occurence 5434
value 36, occurence 5509
value 54, occurence 5529
value 59, occurence 11042
value 73, occurence 5443
value 84, occurence 11047
value 94, occurence 5575
value 100, occurence 5577
value 116, occurence 5616
value 121, occurence 5524
value 124, occurence 5628
value 125, occurence 5499
value 127, occurence 5535
value 129, occurence 5553
value 131, occurence 5584
value 137, occurence 5423
value 158, occurence 5485
value 162, occurence 5522
value 164, occurence 11182
value 165, occurence 5469
value 167, occurence 5474
value 171, occurence 5603
value 176, occurence 5462
value 189, occurence 5593
value 192, occurence 5452
value 208, occurence 5441
value 213, occurence 5510
value 218, occurence 5524
value 220, occurence 5498
value 227, occurence 10940
value 233, occurence 5416
value 244, occurence 5583
value 251, occurence 11064
value 263, occurence 11018
value 267, occurence 5512
value 276, occurence 5557
value 283, occurence 11067
value 285, occurence 11262
value 293, occurence 5567
value 301, occurence 5474
value 305, occurence 5528
value 314, occurence 5611
value 327, occurence 11022
value 328, occurence 5591
value 329, occurence 5458
value 332, occurence 5575
value 334, occurence 5483
value 337, occurence 5528
value 339, occurence 11150
value 344, occurence 5475
value 347, occurence 5504
value 349, occurence 5571
value 353, occurence 11063
value 366, occurence 5459
value 373, occurence 10990
value 374, occurence 5448
value 385, occurence 5584
value 388, occurence 5612
value 392, occurence 5567
value 394, occurence 5521
value 405, occurence 5428
value 409, occurence 5488
value 413, occurence 5611
value 418, occurence 5510
value 433, occurence 10989
value 437, occurence 5499
value 439, occurence 5525
value 445, occurence 5601
value 452, occurence 5652
value 456, occurence 5469
value 463, occurence 5597
value 464, occurence 5553
value 480, occurence 5637
value 484, occurence 5470
value 486, occurence 5571
value 508, occurence 5521
value 515, occurence 5445
value 523, occurence 10941
value 538, occurence 5614
value 539, occurence 5565
value 540, occurence 5461
value 545, occurence 5473
value 546, occurence 5508
value 548, occurence 5613
value 549, occurence 5614
value 556, occurence 5494
value 566, occurence 5486
value 585, occurence 5503
value 586, occurence 5560
value 619, occurence 11051
value 630, occurence 5467
value 644, occurence 5488
value 647, occurence 5472
value 650, occurence 5554
value 656, occurence 5487
value 664, occurence 5566
value 675, occurence 5312
value 677, occurence 10966
value 679, occurence 10963
value 688, occurence 5710
value 694, occurence 5373
value 699, occurence 11069
value 702, occurence 5556
value 703, occurence 5496
value 710, occurence 5536
value 711, occurence 5572
value 720, occurence 11070
value 724, occurence 5591
value 729, occurence 5613
value 735, occurence 5559
value 740, occurence 5492
value 749, occurence 5362
value 751, occurence 5533
value 754, occurence 5548
value 762, occurence 5619
value 768, occurence 5432
value 770, occurence 5546
value 771, occurence 5468
value 777, occurence 5622
value 783, occurence 5460
value 787, occurence 5573
value 790, occurence 5423
value 792, occurence 5498
value 794, occurence 5493
value 799, occurence 5458
value 805, occurence 5606
value 815, occurence 5441
value 822, occurence 5602
value 825, occurence 5449
value 828, occurence 5525
value 834, occurence 5576
value 841, occurence 5601
value 851, occurence 5363
value 854, occurence 5551
value 874, occurence 5546
value 877, occurence 11023
value 892, occurence 5528
value 895, occurence 5607
value 901, occurence 5587
value 903, occurence 5547
value 914, occurence 5423
value 917, occurence 5494
value 922, occurence 5467
value 928, occurence 5493
value 937, occurence 5442
value 938, occurence 5551
value 940, occurence 5563
value 941, occurence 5534
value 942, occurence 5611
value 945, occurence 5520
value 957, occurence 5620
value 962, occurence 5592
value 968, occurence 11084
value 972, occurence 5460
value 980, occurence 5475
value 986, occurence 5553
value 992, occurence 5643
value 999, occurence 11095

例として、一番最後の2つの結果について説明する。
0~1000までの範囲から一つの数を選ぶという操作を1000000(百万)回行った結果が出力されている。

value 999, occurence 11095

というのは999は11095回出現しましたよという意味だ。

0~1000の範囲なので、1001通りのユニークな数字があるのだが、そのうち159種類しか結果に出てこなかったというわけだ。

この例ではシードに使う時間にはある時刻から+60分*3=180分=3時間の幅をランダムで与えている。

つまり、xtoolで3時間のうちに百万回選曲しても出てこない曲がめちゃくちゃあるというわけだ。

試しにシードの時間の幅を60分*24=1日にしたら

Result l=0, r=1000, count=1000000
754 unique results

となった。

実際にプレイしているときは24時間で1000回すら選曲することはないだろうからもっと偏りが生じるわけだ。
シードの質が現在時刻では頼りがないことが分かっただろう。

ゲーム内の情報を拝借する
#

そこでどうにか乱数の質をあげられないか?
と考えて思いついたのが、スマブラXのプログラムで乱数が利用されているのは確実なので、エミュレーターを介してゲーム内の乱数のシードを読み取ってそれをそのままxtoolの乱数のシードに利用しようという作戦だ。

幸い、メモリの場所を見つけるのと読み取りはすぐに成功した。

乱数は改善されたのかどうか気になったのでxtoolにゲーム内の乱数シードを読み取って乱数生成を指定した回数行うコマンドを追加した。

さて、乱数は改善されただろうか?

0~100の範囲から100回選んだ場合60種類のユニークな結果を得た。

0~300の範囲で1000回選んだ場合は292種類だった。

かなり改善されたことがわかるだろう。

ただ、ゲーム内のシードが更新されるのは主に対戦中なので(テストで用いたのは対戦中のシード)、メニュー、ステージ選択あたりで毎回ゲーム内のシードが初期化される仕様だともしかしたらもっと偏ってしまうかもしれない。

そこは検証できていない。

まだなんとなく偏っている気がしなくもない。
まあ分からん。
シード情報を出力するようにしてあるので、利用時に観察しようと思う。

雷がやべえ
#

雷がやばいので、書き切ろうと思っていたが危険そうなのでここまでにして後日続きをかくことにする。

起きた。
気圧が低く副交感神経系優位なせいか12時間ぐらい寝てしまった。

自作ゲームのバグ
#

次に少し弄っていたのが自作ゲームだ。
4月ぐらいから全く弄ってなかったのだが、久々に手をつけてみた。

ゲーム開発の勝手が分かっていないので処理の共通化や抽象の仕方などの高レベルとデータの持ち方や操作入力の処理などの低いレベルの処理の両方に困らせられている。

ゲームの実装には必ずと言って良いほど、メインループという処理が存在する。

疑似コードで示すと

// メインループ
while(true){
  game->update(); // 入力処理ゲームの状態の更新
  game->draw(); // 描画
}

みたいな感じだ。

自分もupdate, drawのように大まかには処理を分けているのだが、もっと細かくしても良いのかもしれない。

スマブラXでは入力、衝突検出、物体の移動後の状態検証、ゲームの状態の更新、描画などと10種類ぐらいの処理が一つずつメインループの中で順番に呼ばれるようになっていた。

スマブラは衝突検出が面倒そうなゲームなのでそこまで細かくするのは正解だろう。
複数人で開発することを考えると、そういった分離は間違いや変なバグを生む可能性を多少排除してくれる。

さて、問題のバグというのが一つはキューブを回転させる際に、回転させた結果によって回転を許可、拒否するにように実装しているはずなのに不正な回転をしてしまうのと、もうひとつは、キューブが床に落ちた際に増えるバグだ。

バグの挙動は動画で見たほうがわかりやすいだろう。

後者の原因はGPUバッファの最大サイズが小さすぎるか、単純に描画し忘れだと思う。
それはまだ良い。

問題は前者だ。
ゲームの物体にはワールド座標はオブジェクト座標などの複数の座標が関わってくる。

少数計算や回転、座標移動などが複雑に絡み合って手に負えない状態になっている。

根本的なリライト、リファクタが必要だと確信したため関連箇所を書き直そうとしている。

コードを読んでいて思ったのだが、自分のコード内ではどれも座標はfloatのベクタで保持されているため、区別がつきにくい。

型で区別して誤変換を防ぐようにしたほうが良いのかもしれない。

floatがまた面倒だ。
理論的には整数で問題ない場合でも整数を使い始めると他の少数が必要な場面との噛み合いの問題が発生する。
floatは何度も計算しているうちに誤差が溜まってきて、その影響もでかくなってくるので扱いに注意が必要だ。

まあなんとかしようと思う。
地道に細かく関数化してみようとおもう。

じゃがいも
#

庭の土を掘り起こしてスーパーで買って放置していたじゃがいもを数ヶ月前に植えたのだが、驚くことに(?)それなりに育ってくれたので収穫できた。

写真をいくつか撮っておいてあるので、そのうち今後のじゃがいも計画とともに別記事でまとめようと思う。

おわり
#

そんなところかな。

今日はやる気が多少ある気がするので、まず自作ゲームに1hぐらい手を付けてその後数学をやったりしようと考えている。

Related

[日記, 進捗] React&TypeScriptを学習する 商ベクトル空間がよくわからねえ 低気圧地獄
·2292 文字·5 分
日記 数学 低気圧 商ベクトル空間 エロゲ プログラミング
ニセティ通信の記事ページに集中モードが追加されました
··119 文字·1 分
雑記
[日記] スマホがぶっ壊れた ~ドコモによる苛烈なデジタルレイプ~
··1533 文字·4 分
日記 ドコモ デジタルレイプ
クソが 俺はドコモを許さない