万有引力シミュレーションみたいなやつをC#(WPF)で書いてみた

はてなダイアリーひさしぶり。
ひさしぶりになんかこういうの書きたくなって昔のコードを見ながら書いてみたやつ。
最初はPython/TkInterで書いたかと思ったらProcessingで書いていた。

いまのVisualStudioはGitHubがデフォルトで対応しているからこういう公開するのもすごい楽!
https://github.com/veleno/StarMovingWPF.git

万有引力シミュレーション


はてなダイアリー、動画できなかったのでTwitterでリプして貼り付けましたww

  • クリックした箇所に星ができる
  • 星はそれぞれ重量を持っていて引かれあう
  • スクショ地味www
  • 描画はCanvasみたいなのコントロールを自作して自前でDrawEllipseしているだけ
  • 最初は.Net MAUIでやってみようかと思っていたんだけどタッチした座標が取れないのでWPFに戻ってきた
  • 次は自前描画をやめて、Unityでスマホで動くようにしたいなあ…

第10回シンデレラガール総選挙にむけて

前回の総選挙、わたしは自分のボイスアイドルオーディション(以下VIA)票をVIA担当Pさんとの票交換に出しました。
個人の自担当への投票数をあげるという成果をあげることができたので満足しています。
ですが、結果発表時に予想と反することがあったのでその点について分析・考察をしたいと思います。
前回の投票後(結果発表前)の記事が下記
https://veleno.hatenadiary.org/entry/2020/05/16/002508:第9回シンデレラガール総選挙の投票期間を終えて

あくまで個人の予想(前回の)です

■第9回総選挙のときの予想

  • CV未実装はトップ5には入らない
  • ボイスオーディションのほうが票が散らばる
  • LIPPSが強そう、デレステでイベント多い組が+になる?

●CV未実装はトップ5には入らない

この点については言葉通りではあるのですが、予想より総選挙でのCV未実装アイドルが順位を落としていました。やっぱりVIAに集中したほうがいい結果を得られる、となっています。
浅利七海が総選挙では50位以内に入れていますが、VIAでは3位に入れていないため、ボイスの獲得ができていません。
CV未実装アイドルでもVIAに票を集中したほうが良い結果を得られるのではないか、と予想しています。
(票を集中したいので総選挙に集中するのもありな気はします)

●ボイスオーディションのほうが票が散らばる

ここは予想と異なる結果となりました。VIAの結果が3位までしか発表されていないのでその範囲でしか比較はできませんが、3位までの合計を比較します。
総選挙でのトップ北条加蓮、2位鷺沢文香、3位一ノ瀬志希までの得票数が1692万6974票、995万1829票、842万5856票。合計3530万4659票。
VIAでは辻野あかり、砂塚あきら、桐生つかさで2211万9341票、2122万6585票、1348万6437票。合計で5683万2353票。
母数が違うのでVIAの合計に母数の比率(当時のCV未実装アイドル数102/総選挙アイドル数)をかけると3051万0000票。
VIAのトップグループの得票率は総選挙のトップグループの85%ほどを集めているはずです。
もっとばらけた結果になると思っていました。
「96川1000秋プロジェクト」さんの分析を見ても3位以降はある程度団子状になっていることが予想されます。
https://ch.nicovideo.jp/turkey_p/blomaga/ar2000381:黒川千秋のVA133万票可視化は何を見せてくれたのか
昨年度は辻野あかり&砂塚あきらのトップ2が突出していましたが、今年度はトップ3までがVIAから抜けるのでさらに団子状になると思っています。

●LIPPSが強そう、デレステでイベント多い組が+になる?

LiPPS組は一ノ瀬志希(6位>3位)、速水奏(17位>10位)、城ケ崎美嘉(31位>13位)、宮本フレデリカ(26位>20位)、塩見周子(圏外)となりました。
塩見周子は一度シンデレラガールに選出されているので別メンバーに集中する形なのかもしれません。
他メンバーに関してはCV未実装アイドルがVIAに流れている分を加味しても大幅にランクアップしています。
ほかのデレステでイベント多い組はデレステのイベント状況を詳しく調査していないのでわからないですね…。

■第9回総選挙の他のポイント

  • 浅利七海が総選挙では50位以内にランクイン(CV未実装アイドルでは最上位)したが、VIAでは入賞できず
  • Co属性の躍進&Cu属性Pa属性の後退

●浅利七海の両名が総選挙では50位以内にランクイン(CV未実装アイドルでは最上位)したが、VIAでは入賞できず

総選挙では50位以内にランクインしたがVIAでは入賞できない、という現象が発生しました。
今回もCV実装のみに目的を絞るのならVIAに票を集中したほうが絶対有利、と予想しています。

●Co属性の躍進&Cu属性Pa属性の後退

10位以内の前々回からの推移をまとめます

Co属性が全体的にランクアップ

北条加蓮 2>1
鷺沢文香 7>2
神谷奈緒 16>4
高垣楓 11>5
新田美波 29>8
速水奏 17>10

Cu属性が微増してるがVIA分を考慮すると一ノ瀬志希以外は後退

一ノ瀬志希 6>3
佐久間まゆ 8>7
緒方智絵里 13>9

Pa属性は高森藍子以外は10位に入れず

高森藍子 15>6

■第9回総選挙以降のポイント

●CVのサプライズ実装が行われなかった。

第9回総選挙&VIA以降、CVのサプライズ実装(VIA選出以外のCV実装)がありません。
この状況がずっと続くとは思えないのですが、CVの実装タイミングをVIAにある程度まかせる、という運営の意図があるのかもしれません。なんとも。

●ポプマスの発表&サービス開始

アイドルマスター5ブランドでの合同でパズルゲームとしてアイドルマスターポップリンクスがサービス開始しました。
シンデレラガールズからは総選挙上位~CV未実装(総選挙圏外)まで様々な層から登場アイドルが選出されています。
ポプマスではまだ登場アイドルが追加され続けているので選挙までにも追加されるかもしれません。

■第10回シンデレラガール総選挙の予想

(ほんと個人的な直感レベルの予想なのでなにかのあてにはしないでください。あとレギュレーションで変わるかも)

●総選挙ではCo属性が躍進する。前回と変わらないレベルになると思う。

属性の変化はデレステ票の増加による好みの差が出たと思っています。デレステモバマスで同じ票が得られるなら同様の傾向が続く予想です。

●VIAは前回発表分がまるまる抜けるのでほとんど予想不能

前回総選挙では浅利七海が50位以内、前々回以前では松本沙理奈、八神マキノ、今井加奈、西園寺琴歌、池袋晶葉が50位以内ですが、予想の根拠にはしづらいですね…。
実際前回はその前に全く圏外だった辻野あかり、砂塚あきら、桐生つかさがVIAで上位だったので、今回も予想外のところから来るとは思っています。
前回で新キャラ枠全員にCVが実装されたので今回以降のほうがどこから来るのかわからない感はあります。

北条加蓮がシンデレラガールとなったのでトライアドプリムス票が神谷奈緒に流れる?

前回4位の神谷奈緒にプラス要素があるので今回はさらに票数のアップが見込めると思われます。

あとはレギュレーションとガチャブ、新規アプリであるポプマスからの流入がどのくらいあるのかなど…。
(まったく同じレギュレーションにすると運営側の不都合もあると思う(必要票数の予想から何票くらいあると入賞、など))


前回分析と予想なのでなるべく客観的に書きましたが、わたしは佐久間まゆを応援しています。

C言語の構造体を書き込んだファイルをビッグエンディアンからリトルエンディアンにPythonで変換する

Perlでも書いたんだけど、Pythonのほうが綺麗に書けたのでPythonで書いたやつを。
*1
C言語の構造体をそのまま書き込んだバイナリファイルがあるんだけど、ビッグエンディアンからリトルエンディアンに直したい。
構造体の定義はわかっているとする。

コンバートモジュール

構造体のフィールド、入力ファイル名、出力ファイル名とエンディアンのフラグを受け取って、入力ファイルから指定エンディアンのバイナリデータを読み込んで、逆で出力ファイルに書き込む。
やっていることは

  • 構造体のもとになるクラスの動的定義
  • そのインスタンス生成
  • 入力ファイルをバイナリでオープン
  • 入力の構造体に読込み
  • 入力構造体から出力構造体にフィールドをコピー
  • 出力ファイルをバイナリでオープン
  • 室力ファイルに出力構造体を書込み
#!/usr/bin/env python3

import ctypes

## エンディアン変換
## fields       :構造体のメンバ変数定義
## fileNameIn   :入力ファイル名
## fileNameOut  :出力ファイル名
## flg          :0:ビッグエンディアン>リトルエンディアン
##               1:リトルエンディアン>ビッグエンディアン
def convertEndian(fields,fileNameIn,fileNameOut,flg):
    intype = ctypes.LittleEndianStructure if flg else ctypes.BigEndianStructure
    outtype = ctypes.BigEndianStructure if flg else ctypes.LittleEndianStructure

    StructIn = type('StructIn', (intype,), {'_fields_':fields})
    StructOut = type('StructOut', (outtype,), {'_fields_':fields})

    tIn = StructIn()
    tOut = StructOut()

    with open(fileNameIn, 'rb') as f:
        f.readinto(tIn)

    for item in tIn._fields_:
        setattr(tOut, item[0], getattr(tIn, item[0]))

    with open(fileNameOut, 'wb') as f:
        f.write(tOut)

## リトルエンディアン→ビッグエンディアン変換
## fields       :構造体のメンバ変数定義
## fileNameIn   :入力ファイル名
## fileNameOut  :出力ファイル名
def convertLittleToBig(fields,fileNameIn,fileNameOut):
    "リトルエンディアン→ビッグエンディアン変換"
    convertEndian(fields, fileNameIn, fileNameOut, 1)

## ビッグエンディアン→リトルエンディアン変換
## fields       :構造体のメンバ変数定義
## fileNameIn   :入力ファイル名
## fileNameOut  :出力ファイル名
def convertBigToLittle(fields,fileNameIn,fileNameOut):
    "ビッグエンディアン→リトルエンディアン変換"
    convertEndian(fields, fileNameIn, fileNameOut, 0)

呼び出しサンプル

構造体のメンバ変数を定義してコンバートメソッドを呼び出す

#!/usr/bin/env python3

import ctypes
from endianConvertHelp import *

"""
/*** C言語の構造体定義 ***/
typedef struct __TEST{
	int n1;
	int n2;
	int n3;
	char text[16];
}TEST_STRUCT;
"""
## C言語の構造体のメンバ変数を定義する
fields = (
    ('n1',          ctypes.c_int32),
    ('n2',          ctypes.c_int32),
    ('n3',          ctypes.c_int32),
    ('text',        ctypes.c_char*16),
)

## リトルエンディアン→ビッグエンディアン変換メソッド
# convertLittleToBig(fields,              ## メンバ定義
#                    'test.dat',          ## 入力ファイル名
#                    'test.dat.py.big')   ## 出力ファイル名

## ビッグエンディアン→リトルエンディアン変換メソッド
convertBigToLittle(fields,              ## メンバ定義
                   'test.dat.py.big',   ## 入力ファイル名
                   'test.dat.py.ltl')   ## 出力ファイル名

*1:CPAN使うとPerlでももっときれいに書けるっぽいけど、こういうツールでモジュールのインストールが必要なのは嫌なので

C言語の構造体のデータをPerlから操作したい。

C言語の構造体のデータをPerlから操作したい。

C言語の構造体のデータをバイナリのままファイルに吐き出して、Perlで読み書きしてからそのファイルを構造体に戻す。

元の構造体のヘッダ

typedef struct __TEST_STRUCT{
	int n1, n2, n3;
	char txt[16];
} TEST_STRUCT;

構造体のデータをファイルに書き出すC言語のコード

#include <stdio.h>
#include <string.h>

#include "test.h"

int main(int argc, char** argv){
	TEST_STRUCT test;
	memset(&test, 0, sizeof(test));
	test.n1 = 1;
	test.n2 = 0x12345678;
	test.n3 = -1;
	snprintf(&test.txt[0], sizeof(test.txt), "hello,world.\n");

	FILE* fp = fopen("test.dat", "wb");
	if(!fp){ return 0; }

	fwrite(&test, sizeof(test), 1, fp);

	fclose(fp);
}

バイナリファイルを読み出すPerlのコード

#!/usr/bin/perl -w

use strict;

eval{
	main(@ARGV);
};

print $@ if $@;

sub main{
	open my $f, '<', 'test.dat' or die "can't open test.dat.";
	binmode $f;
	my $sz = read $f, my $buf, 28;
	print "$sz\n";
	my ($n1,$n2,$n3,$txt) = unpack "lllZ16", $buf;
	print "$n1,$n2,$n3,$txt\n";
}

バイナリファイルに書き出すPerlのコード

#!/usr/bin/perl -w

use strict;

eval{
	main(@ARGV);
};

print $@ if $@;

sub main{
	open my $f, '<', 'test.dat' or die "can't open test.dat.";
	binmode $f;
	my $sz = read $f, my $buf, 28;
	print "$sz\n";
	my ($n1,$n2,$n3,$txt) = unpack "lllZ16", $buf;
	print "$n1,$n2,$n3,$txt\n";
}

ファイルに書き出された構造体のデータを読み出すC言語のコード

#include <stdio.h>
#include <string.h>

#include "test.h"

int main(int argc, char** argv){
	TEST_STRUCT test;
	memset(&test, 0, sizeof(test));

	FILE* fp = fopen("test.dat", "rb");
	if(!fp){ return 0; }

	fread(&test, sizeof(test), 1, fp);

	fclose(fp);

	printf(
		"n1:%d\n"
		"n2:%d\n"
		"n3:%d\n"
		"txt:%s\n",
		test.n1,
		test.n2,
		test.n3,
		test.txt
		);
}

WSL2のEmacsでクリップボードを切ったり貼ったりできた

参考にしたのは下のサイト。
Emacs on WSLのクリップボード

clip.exeだとクリップボードを取得できなさそうなのでwin32yank.exeを下記からダウンロードして、パスの通ったところに適当において、
Releases · equalsraf/win32yank · GitHub

下記のように.emacsに書いておくと、C-c C-cでコピー、C-c C-vでペーストできるようになりました。

(defun wsl-copy (start end)
  (interactive "r")
  (shell-command-on-region start end "win32yank.exe -i"))

(global-set-key
 (kbd "C-c C-c")
 'wsl-copy)

(defun wsl-paste ()
  (interactive)
  (insert (shell-command-to-string "win32yank.exe -o")))
(global-set-key
 (kbd "C-c C-v")
 'wsl-paste)

残念なことにkill-ringと同期できたりはしていません…。

レシピ

最近便利だったレシピ

繊維質を取りたいのに取れなかったときの夜食。お手軽に野菜を取るやつ。
oceans-nadia.com
茄子が余った時の。揚げびたしが大変だなー、ともって揚げないでいいやつにしたんだけど煮込みすぎて結局きれいにならなかった。
www.sirogohan.com