EBIMOD開発日記1【Minecraft MOD】
春休みですが、外出もできずに、することないので、MinecraftのMODを開発することにしました。内容は最近流行りの「お前はエビ」の影響を受けたものとなります。まだ公開できるほどの内容ではないですが、いずれ機能が充実してきたら公開する予定です。
いつ完成するんだろう?最近原神にはまってるので、完成する気がしません。
スクリーンショット
絵のセンスが絶望的……
環境
Minecraft1.12.2 foege
基本的に環境構築から、MODの開発までこのサイトの通りにやりました。
今後の予定
効果音(お前はエビ)の追加
テクスチャーの改善
絵が描けないよ……バニラのアイテムからクラフトできるようにレシピ構成
エビ料理の追加
エビブロックの機能追加
メインのコード
こんな感じでアイテムやブロックを登録するようです。(EbiMod.java)
package com.ebi.youare; import net.minecraft.block.Block; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLConstructionEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @Mod(modid = "ebimod", version = "0.1", name = "EbiMod", acceptedMinecraftVersions = "1.12.2") public class EbiMod { public static final Item EBI = new ItemEbi(); public static final Block OMAEBI = new BlockOmaebi(); @Mod.EventHandler public void construct(FMLConstructionEvent event) { MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void registerItems(RegistryEvent.Register<Item> event) { event.getRegistry().register(EBI); event.getRegistry().register(new ItemBlock(OMAEBI).setRegistryName("ebimod", "omaebi")); } @SubscribeEvent public void registerBlocks(RegistryEvent.Register<Block> event){ event.getRegistry().register(OMAEBI); } @SubscribeEvent @SideOnly(Side.CLIENT) public void registerModels(ModelRegistryEvent event) { ModelLoader.setCustomModelResourceLocation(EBI, 0, new ModelResourceLocation(new ResourceLocation("ebimod", "ebi"), "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(OMAEBI), 0, new ModelResourceLocation(new ResourceLocation("ebimod", "omaebi"),"inventory")); } }
ホワイトノイズが酷い動画からノイズ除去
コロナウイルスが蔓延し始めて、もうじき一年。私の所属する大学では未だに対面授業がほとんどなく、オンデマンド講義動画を見る日々が続いている。
ほとんどの先生はeラーニングサイトに講義動画をアップロードしてくれる。しかし、某授業の先生は機械に弱いのか音声付パワーポイントのファイルを直接アップロードしてくる。pcの性能が足りなくて動画に変換できないのなら仕方ないかもしれないが、mp4でストリーミング再生できるようにしてくれないだろうか。
さらにひどいのは、雑音が大きすぎて聞いていて耳が(物理的に)痛くなる授業である。あなたは20年前のICレコーダーでも使っているのだろうか。最近のマイクは、パソコン内蔵、スマホ内蔵ですら、勝手にノイズキャンセリングしてくれるのだ。
なぜ、まともなノイキャン付きマイクで録音してくれないのかは本当に謎である。
使い方がわからないなら、調べてくれ。
どうにか自分で解決できないかといろいろ検索したが、音声編集ソフトをダウンロードすればよいということが分かった。ホワイトノイズを消してくれる機能があればよいということ。
私のパソコンに眠っているソフトをあさってみたところ、AviUtlがあった。
大昔にダウンロードして、一度も使ったことがないが、どうやらこのサイトの方法でホワイトノイズを除去できるみたい。
追記
このサイトの「②AviUtlのVSTプラグインを使う方法」という欄を参考にしよう。
なお、少し?面倒なので覚悟が必要かも
mp4形式で入出力するためのプラグイン
600円の激安多ボタンワイヤレスマウスを買ってみた
アキバで600円(税抜)のマウスを見つけました。
どこかで見たことのあるようなデザイン
dpiを調整する機能も搭載!ということなので、買ってみました。
開封してみると、まあ安っぽい
激安なので、仕方ないですね。
電池を入れて、pcに接続すると、
カーソルが動く正直動くとは思っていませんでした……
ボタンをいろいろと操作してみると、
dpiボタンを押しても何も反応しない
はずれ引いたのか、そもそもdpiを調整する機能はないのか。どちらかは誰もわかりません。カーソルが動いたので、もう満足です。交換しに行く気はありません。
側面は樹脂製ですので、滑ります。ラバーであってほしかったな。
サイドボタンは2つついていましたが、こちらはきちんと動きました。ワンボタンでブラウザバックができました。
ただし、押し心地は最悪です。プラスチックの支えをばねとして使っているのでしょう。
スクロールもできましたが、ホイールが奥まった位置にあるため、くるくるし心地も悪い。
さすがに、メインで使ってる数千円のマウスとはくらべものにならないですね。カーソルが動くので、僕のポンコツノートpc用のマウスとして、しばらく使いたいと思います。
C++で余因数展開を用いた行列式の計算
線形代数のレポート課題でこんな課題が……
4次元行列の行列式を”途中式付きで”、”余因数展開を用いて”求めよ。
手計算でよるのは面倒すぎる……そこで、C++によってパソコンで求めてくれるプログラムを作成!もちろん計算過程も出力します。
これで、パソコンが求めてくれた答えをレポート用紙に写すだけで良し!!!
ソースコード
#include<bits/stdc++.h> using namespace std; //cofactor expansion ver int det(vector<vector<int>> a){ int res=0; if(a.size() == 2){ res = a[0][0] * a[1][1] - a[0][1] * a[1][0]; for (auto &&i : a) { for (auto &&e : i) { cout << e << " "; } cout << endl; } cout << "=" << res << endl << endl; return res; } for(int i = 0; i < a.size(); i++){ vector<vector<int>> v = a; v.erase(v.begin()); for(int j = 0; j < v.size(); j++){ v[j].erase(v[j].begin() + i); } int op; if(i%2) op = -1; else op = 1; res += op * a[0][i] * det(v); } for (auto &&i : a) { for (auto &&e : i) { cout << e << " "; } cout << endl; } cout << "=" << res << endl << endl; return res; } int main(){ //N次行列 cout << "N>"; int n; cin >> n; //行列の中身を入力 cout << "Matrix>\n"; vector<vector<int>> v(n, vector<int>(n)); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ cin >> v[i][j]; } } cout << det(v) << endl; return 0; }
あとは、これをコンパイルして、行列の要素を入力するだけ。簡単でしょ。
こんなのを書くより、手計算で求めた方が速いって?キコエナイキコエナイ大事なのはロマンです?
Texについてメモ
Texのインストール
Ubuntuなどの環境ではターミナルを開いて、
sudo apt install texlive-full
でインストールできるはずです。ただし、かなり大きなパッケージ(5GBくらい)ですので、しばらく時間がかかります。
高速なWi-Fiまたは有線LAN推奨です。
Texコマンド
基本的にGoogleで「"やりたいこと" "tex"」などと検索すれば出てきます。
例えば、
数式について
上のように数式を囲むと行内、 下のようにすると別行になります。
\( f(x), f(x, y) \) \[ f(x), f(x, y) \]
テンプレート
これをコピペして、本文を書けばよいです。とりあえずは。
\documentclass[a4paper]{jsarticle} \usepackage{amsmath} \pagestyle{empty} \begin{document} ここに本文!!! \end{document}
PDFに出力
とりあえず、
platex ファイル.tex dvipdfmx ファイル.dvi
をたたくと、
ファイル.pdf
が生成されるはず。
最後に
VScodeで拡張機能を入れて自動ビルドするようにしたら便利です。オートコンプリートもできますからね。
TeX Wikiにいろいろ書いてあります……たぶん。 texwiki.texjp.org
Vector2をうまく使いたい
Unityには、Vector2という二次元ベクトルの構造体が用意されています。いろいろ調べたところ、関数とかがなかなか便利したので、メモしておきます。
目次
定数
Vector2.zero //ゼロベクトル (0, 0) Vector2.one //(1, 1) Vector2.up //(0, 1) Vecotr2.right //(1, 0)
同様にleftとdownもあります。 ちなみに new Vector2(0, 0) などでも代用できます。
絶対値
magnitudeで取得できます。
使用例
Vector2 v = new Vector2(3, 4); float a = v.magnitude; // a == 5
方向ベクトル(正規化)
normalizedで絶対値1の方向ベクトルを取得できます。
使用例
Vector2 v = new Vector2(3, 4); Vector2 dir = v.normalized; // dir == (0.6, 0.8)
Normalizeで、ベクトルの絶対値を1にできます。
Vector2 v = new Vector2(3, 4); v.Normalize(); // v == (0.6, 0.8)
パワーポイントに自動で画像を張り付ける
画像を張り付けるだけなのに、毎回パワーポイントを開いて作業するのは大変なので、パワーポイントでスライドショーを作るのを自動化しました。
ファイル選択画面を出現させて、そこで選択した画像が、スライドに張り付けられます。
ソースコード
from pptx import Presentation from pptx.util import Cm, Pt from PIL import Image import subprocess # モジュールのインポート import os, tkinter, tkinter.filedialog, tkinter.messagebox # ファイル選択ダイアログの表示 root = tkinter.Tk() root.withdraw() fTyp = [("","*.jpg"), ("", "*.png")] iDir = os.path.abspath(os.path.dirname(__file__)) # ここの1行を変更 askopenfilename → askopenfilenames file = tkinter.filedialog.askopenfilenames(filetypes = fTyp,initialdir = iDir) #パワーポイントを作成 prs = Presentation("template.pptx") max_height = Cm(19.05) max_width = Cm(33.867) for i in range(len(file)): layout = prs.slide_layouts[6] # 6 白紙 slide = prs.slides.add_slide(layout) img = Image.open(file[i]) if img.width / img.height > 16 / 9: pic = slide.shapes.add_picture(file[i], 0, 0, width = max_width) else: pic = slide.shapes.add_picture(file[i], 0, 0, height = max_height) prs.save("a.pptx") PPTX_PATH = r"C:\Program Files\Microsoft Office\root\Office16\POWERPNT.EXE" subprocess.Popen([PPTX_PATH, r"a.pptx"])
あらかじめtemplate.pptxを作成し、このファイルと同じフォルダに入れておく必要があります
template.pptxは、新しいプレゼンテーションをそのまま名前を付けて保存すればよいです。
開発環境
Windows10 64bit
python 3.7.9
python-pptx 0.6.18
pyinstaller 4.0
説明
ファイル選択画面は、
Python:処理ファイルをGUIから選択する方法 - Qiita
こちらのサイトを参考に、jpgとpngを選択できるようにしました。
写真のサイズは、縦長か横長か判定して、スライド(16:9)にフィットするようにしました。 中央寄せではなく、左寄せにしています。
仕上げに、pyinstallerでexe化すると便利です。