diff --git a/src/assets/icons/blog/Go-Logo_Aqua.svg b/src/assets/icons/blog/Go-Logo_Aqua.svg new file mode 100644 index 0000000..632e6bb --- /dev/null +++ b/src/assets/icons/blog/Go-Logo_Aqua.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/blog/Markdown-mark.svg b/src/assets/icons/blog/Markdown-mark.svg new file mode 100644 index 0000000..2166cf8 --- /dev/null +++ b/src/assets/icons/blog/Markdown-mark.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/U_ProfileIcon_Positive.svg b/src/assets/icons/blog/U_ProfileIcon_Positive.svg new file mode 100644 index 0000000..6f63dea --- /dev/null +++ b/src/assets/icons/blog/U_ProfileIcon_Positive.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/arduino.svg b/src/assets/icons/blog/arduino.svg new file mode 100644 index 0000000..de94a8f --- /dev/null +++ b/src/assets/icons/blog/arduino.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/astro-icon-dark.svg b/src/assets/icons/blog/astro-icon-dark.svg new file mode 100644 index 0000000..8676bab --- /dev/null +++ b/src/assets/icons/blog/astro-icon-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/blog/discord-mark-black.svg b/src/assets/icons/blog/discord-mark-black.svg new file mode 100644 index 0000000..d921ab9 --- /dev/null +++ b/src/assets/icons/blog/discord-mark-black.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/docker.svg b/src/assets/icons/blog/docker.svg new file mode 100644 index 0000000..1f53fe5 --- /dev/null +++ b/src/assets/icons/blog/docker.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/dotnet-logo.svg b/src/assets/icons/blog/dotnet-logo.svg new file mode 100644 index 0000000..fbb6e11 --- /dev/null +++ b/src/assets/icons/blog/dotnet-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/blog/git.svg b/src/assets/icons/blog/git.svg new file mode 100644 index 0000000..26a44a6 --- /dev/null +++ b/src/assets/icons/blog/git.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/laptop.svg b/src/assets/icons/blog/laptop.svg new file mode 100644 index 0000000..e9d4bd7 --- /dev/null +++ b/src/assets/icons/blog/laptop.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/blog/python-logo-only.svg b/src/assets/icons/blog/python-logo-only.svg new file mode 100644 index 0000000..334c3bd --- /dev/null +++ b/src/assets/icons/blog/python-logo-only.svg @@ -0,0 +1,266 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/blog/rest-api-icon.svg b/src/assets/icons/blog/rest-api-icon.svg new file mode 100644 index 0000000..b262eec --- /dev/null +++ b/src/assets/icons/blog/rest-api-icon.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/blog/rust-logo-blk.svg b/src/assets/icons/blog/rust-logo-blk.svg new file mode 100644 index 0000000..3036451 --- /dev/null +++ b/src/assets/icons/blog/rust-logo-blk.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/content/authors/member.json b/src/content/authors/member.json new file mode 100644 index 0000000..c16567f --- /dev/null +++ b/src/content/authors/member.json @@ -0,0 +1,3 @@ +{ + "name": "Member" +} diff --git a/src/content/blog-metas/436.json b/src/content/blog-metas/436.json new file mode 100644 index 0000000..6526f69 --- /dev/null +++ b/src/content/blog-metas/436.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-05-09T21:48:00+09:00" +} diff --git a/src/content/blog-metas/452.json b/src/content/blog-metas/452.json new file mode 100644 index 0000000..8fe7f2b --- /dev/null +++ b/src/content/blog-metas/452.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-05-16T16:29:00+09:00" +} diff --git a/src/content/blog-metas/465.json b/src/content/blog-metas/465.json new file mode 100644 index 0000000..8956132 --- /dev/null +++ b/src/content/blog-metas/465.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-05-22T22:31:00+09:00" +} diff --git a/src/content/blog-metas/487.json b/src/content/blog-metas/487.json new file mode 100644 index 0000000..7118915 --- /dev/null +++ b/src/content/blog-metas/487.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-16T19:29:00+09:00" +} diff --git a/src/content/blog-metas/490.json b/src/content/blog-metas/490.json new file mode 100644 index 0000000..7d58a6e --- /dev/null +++ b/src/content/blog-metas/490.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-15T00:08:00+09:00" +} diff --git a/src/content/blog-metas/512.json b/src/content/blog-metas/512.json new file mode 100644 index 0000000..646edbf --- /dev/null +++ b/src/content/blog-metas/512.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-16T02:01:00+09:00" +} diff --git a/src/content/blog-metas/522.json b/src/content/blog-metas/522.json new file mode 100644 index 0000000..3217b6b --- /dev/null +++ b/src/content/blog-metas/522.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-19T00:08:00+09:00" +} diff --git a/src/content/blog-metas/524.json b/src/content/blog-metas/524.json new file mode 100644 index 0000000..89b381c --- /dev/null +++ b/src/content/blog-metas/524.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-19T01:22:00+09:00" +} diff --git a/src/content/blog-metas/548.json b/src/content/blog-metas/548.json new file mode 100644 index 0000000..3162e5a --- /dev/null +++ b/src/content/blog-metas/548.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-21T09:33:00+09:00" +} diff --git a/src/content/blog-metas/567.json b/src/content/blog-metas/567.json new file mode 100644 index 0000000..a682ac1 --- /dev/null +++ b/src/content/blog-metas/567.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-21T23:29:00+09:00" +} diff --git a/src/content/blog-metas/590.json b/src/content/blog-metas/590.json new file mode 100644 index 0000000..5f63603 --- /dev/null +++ b/src/content/blog-metas/590.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-22T23:16:00+09:00" +} diff --git a/src/content/blog-metas/611.json b/src/content/blog-metas/611.json new file mode 100644 index 0000000..e96adc9 --- /dev/null +++ b/src/content/blog-metas/611.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-24T23:46:00+09:00" +} diff --git a/src/content/blog-metas/659.json b/src/content/blog-metas/659.json new file mode 100644 index 0000000..6036176 --- /dev/null +++ b/src/content/blog-metas/659.json @@ -0,0 +1,3 @@ +{ + "postDate": "2021-12-25T15:55:00+09:00" +} diff --git a/src/content/blog-metas/775.json b/src/content/blog-metas/775.json new file mode 100644 index 0000000..9de481b --- /dev/null +++ b/src/content/blog-metas/775.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-01-19T23:46:00+09:00" +} diff --git a/src/content/blog-metas/796.json b/src/content/blog-metas/796.json new file mode 100644 index 0000000..75363d5 --- /dev/null +++ b/src/content/blog-metas/796.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-04-22T00:26:00+09:00" +} diff --git a/src/content/blog-metas/806.json b/src/content/blog-metas/806.json new file mode 100644 index 0000000..d9e48b0 --- /dev/null +++ b/src/content/blog-metas/806.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-11-22T04:28:00+09:00" +} diff --git a/src/content/blog-metas/835.json b/src/content/blog-metas/835.json new file mode 100644 index 0000000..347ac8c --- /dev/null +++ b/src/content/blog-metas/835.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-01T23:59:00+09:00" +} diff --git a/src/content/blog-metas/870.json b/src/content/blog-metas/870.json new file mode 100644 index 0000000..f54e78e --- /dev/null +++ b/src/content/blog-metas/870.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-03T00:45:00+09:00" +} diff --git a/src/content/blog-metas/871.json b/src/content/blog-metas/871.json new file mode 100644 index 0000000..a60d0b9 --- /dev/null +++ b/src/content/blog-metas/871.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-03T00:46:00+09:00" +} diff --git a/src/content/blog-metas/875.json b/src/content/blog-metas/875.json new file mode 100644 index 0000000..823b2da --- /dev/null +++ b/src/content/blog-metas/875.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-04T01:20:00+09:00" +} diff --git a/src/content/blog-metas/879.json b/src/content/blog-metas/879.json new file mode 100644 index 0000000..d709cfb --- /dev/null +++ b/src/content/blog-metas/879.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-07T19:04:00+09:00" +} diff --git a/src/content/blog-metas/890.json b/src/content/blog-metas/890.json new file mode 100644 index 0000000..ac0c262 --- /dev/null +++ b/src/content/blog-metas/890.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-07T17:35:00+09:00" +} diff --git a/src/content/blog-metas/901.json b/src/content/blog-metas/901.json new file mode 100644 index 0000000..1172ae4 --- /dev/null +++ b/src/content/blog-metas/901.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-08T22:51:00+09:00" +} diff --git a/src/content/blog-metas/908.json b/src/content/blog-metas/908.json new file mode 100644 index 0000000..fad795b --- /dev/null +++ b/src/content/blog-metas/908.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-12T22:46:00+09:00" +} diff --git a/src/content/blog-metas/918.json b/src/content/blog-metas/918.json new file mode 100644 index 0000000..6c66e28 --- /dev/null +++ b/src/content/blog-metas/918.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-18T06:00:00+09:00" +} diff --git a/src/content/blog-metas/1.json b/src/content/blog-metas/924.json similarity index 100% rename from src/content/blog-metas/1.json rename to src/content/blog-metas/924.json diff --git a/src/content/blog-metas/935.json b/src/content/blog-metas/935.json new file mode 100644 index 0000000..acc9cb4 --- /dev/null +++ b/src/content/blog-metas/935.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-19T00:19:00+09:00" +} diff --git a/src/content/blog-metas/974.json b/src/content/blog-metas/974.json new file mode 100644 index 0000000..92d2b41 --- /dev/null +++ b/src/content/blog-metas/974.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-22T17:13:00+09:00" +} diff --git a/src/content/blog-metas/988.json b/src/content/blog-metas/988.json new file mode 100644 index 0000000..eb144ba --- /dev/null +++ b/src/content/blog-metas/988.json @@ -0,0 +1,3 @@ +{ + "postDate": "2022-12-24T16:35:00+09:00" +} diff --git a/src/content/blogs/436.mdx b/src/content/blogs/436.mdx new file mode 100644 index 0000000..0fcb674 --- /dev/null +++ b/src/content/blogs/436.mdx @@ -0,0 +1,54 @@ +--- +title: Blender と競プロの講習会を開催 +description: | + 5/8 (土) に Blender による 3D モデリング、5/9 (日) に競技プログラミングの講習会を Discord 新歓サーバーを用いてオンラインで実施しました。 +author: member +tags: [workshop, blender] +--- +import Image from "@/components/common/Image.astro" +import Blender_1 from "./436/Blender_1-1024x616.png" +import Blender_2 from "./436/Blender_2-1024x617.png" +import Blender_3 from "./436/Blender_3-1024x616.png" +import Blender_4 from "./436/Blender_4-1024x617.png" +import Blender_5 from "./436/Blender_5-576x1024.jpg" +import image_4 from "./436/image-4-1024x576.png" +import image from "./436/image-1024x576.png" +import image_1 from "./436/image-1-1024x576.png" +import image_2 from "./436/image-2-1024x576.png" +import image_3 from "./436/image-3-1024x576.png" + +

5/8 (土) に Blender による 3D モデリング、5/9 (日) に競技プログラミングの講習会を Discord 新歓サーバーを用いてオンラインで実施しました。

+ +

Blender 講習会

+ +

約 90 分間という短時間で、VRChat で使える Avatar 制作の流れを学びました。短時間制作であることからポリゴンや着色などが荒くなっていますが、それでも様々な必須技術を学ぶことができました。

+ +
+ +
+ +
+ +
+ +
+ +

競プロ講習会

+ +

阪大競技プログラミング部 RAINBOU の部長を務めるこたまねぎ(Twitter: @small_onions)氏に、特別に講習会を開いていただきました。テーマは「全探索攻略」で、バグを減らすためのマクロ定義や文字列化 bit 全探索の活用、また C++ ライブラリの活用など、競プロに最前線で取り組んでいる方による様々なノウハウやアドバイスなどはとても新鮮で、競プロをそれなりにやっている受講者にとっても新たな発見がありました。

+ +
+ +
REP マクロを使う
+ +
bit 全探索
+ +
順列全列挙
+ +
複雑なデータ構造の操作は関数化
+ +

ご協力くださったこたまねぎ氏に感謝です!今後も、同じ志を持つ別団体との交流を進めていきたいですね。

+ +

今後の予定

+ +

次は 5/15 (土) 15:00 に Git、5/9 (日) 14:00 にオブジェクト指向プログラミングの講習会を、同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

diff --git a/src/content/blogs/436/Blender_1-1024x616.png b/src/content/blogs/436/Blender_1-1024x616.png new file mode 100644 index 0000000..44bbb75 Binary files /dev/null and b/src/content/blogs/436/Blender_1-1024x616.png differ diff --git a/src/content/blogs/436/Blender_2-1024x617.png b/src/content/blogs/436/Blender_2-1024x617.png new file mode 100644 index 0000000..8eb2230 Binary files /dev/null and b/src/content/blogs/436/Blender_2-1024x617.png differ diff --git a/src/content/blogs/436/Blender_3-1024x616.png b/src/content/blogs/436/Blender_3-1024x616.png new file mode 100644 index 0000000..6c7dfd6 Binary files /dev/null and b/src/content/blogs/436/Blender_3-1024x616.png differ diff --git a/src/content/blogs/436/Blender_4-1024x617.png b/src/content/blogs/436/Blender_4-1024x617.png new file mode 100644 index 0000000..2cc10f5 Binary files /dev/null and b/src/content/blogs/436/Blender_4-1024x617.png differ diff --git a/src/content/blogs/436/Blender_5-576x1024.jpg b/src/content/blogs/436/Blender_5-576x1024.jpg new file mode 100644 index 0000000..7d923f5 Binary files /dev/null and b/src/content/blogs/436/Blender_5-576x1024.jpg differ diff --git a/src/content/blogs/436/image-1-1024x576.png b/src/content/blogs/436/image-1-1024x576.png new file mode 100644 index 0000000..503ed76 Binary files /dev/null and b/src/content/blogs/436/image-1-1024x576.png differ diff --git a/src/content/blogs/436/image-1024x576.png b/src/content/blogs/436/image-1024x576.png new file mode 100644 index 0000000..cecaaf7 Binary files /dev/null and b/src/content/blogs/436/image-1024x576.png differ diff --git a/src/content/blogs/436/image-2-1024x576.png b/src/content/blogs/436/image-2-1024x576.png new file mode 100644 index 0000000..97e84e1 Binary files /dev/null and b/src/content/blogs/436/image-2-1024x576.png differ diff --git a/src/content/blogs/436/image-3-1024x576.png b/src/content/blogs/436/image-3-1024x576.png new file mode 100644 index 0000000..c75c2c3 Binary files /dev/null and b/src/content/blogs/436/image-3-1024x576.png differ diff --git a/src/content/blogs/436/image-4-1024x576.png b/src/content/blogs/436/image-4-1024x576.png new file mode 100644 index 0000000..8ac9275 Binary files /dev/null and b/src/content/blogs/436/image-4-1024x576.png differ diff --git a/src/content/blogs/452.md b/src/content/blogs/452.md new file mode 100644 index 0000000..3f2149d --- /dev/null +++ b/src/content/blogs/452.md @@ -0,0 +1,68 @@ +--- +title: Git と OOP の講習会を開催 +description: | + Git 講習会 + Git は分散型バージョン管理システムで、近年のソフトウェア開発で頻繁に利用されるほか、複数人開発では必須ツールとなっています。仕組みが複雑で初心者にはとっつきにくいのが難点ですが、使いこなせればソフトウェア開発を力強くサポートしてくれるとても便利なツールです。 +author: member +tags: [git, workshop] +--- + + +

5/15 (土) に SourceTree と GitHub による Git 講習会、5/16 (日) に TypeScript を用いたオブジェクト指向プログラミング (OOP) の講習会を Discord を用いてオンラインで開催しました。

+ + + +

Git 講習会

+ + + +

Git は分散型バージョン管理システムで、近年のソフトウェア開発で頻繁に利用されるほか、複数人開発では必須ツールとなっています。仕組みが複雑で初心者にはとっつきにくいのが難点ですが、使いこなせればソフトウェア開発を力強くサポートしてくれるとても便利なツールです。今回は、初学者にも比較的扱いやすい SourceTree という GUI ソフトウェアを用いて、Git を扱うのに最低限必要な技能を身に着けることに重点を置きました。

+ + + +![](./452/Git_1-1024x576.png) + + + +![](./452/Git_2-1024x575.png) + + + +![](./452/Git_3-1024x577.png) + + + +![](./452/Git_4-1024x576.png) + + + +

OOP 講習会

+ + + +

オブジェクト指向は「関数と型の関連付け」と「抽象化」を目的としたもので、「カプセル化」「継承」「多相」が主な特徴となります。近年はソフトウェアのメンテナンス性を重視する傾向が強まってきており、そういった点で合理的な OOP が広まっています。また、この考え方を取り入れた言語も数多く存在します。しかし、これもまた初学者にはとっつきにくいものであることから、今回は入門編としてその目的や定義を紹介したのち、TypeScript を題材として実際の実装例を確認しました。

+ + + +![](./452/OOP_1-1024x576.png) + + + +![](./452/OOP_2-1024x576.png) + + + +![](./452/OOP_3-1024x576.png) + + + +![](./452/OOP_4-1024x576.png) + + + +

今後の予定

+ + + +

次は 5/22 (土) に Python、6月初めに Linux の講習会を、同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

+ diff --git a/src/content/blogs/452/Git_1-1024x576.png b/src/content/blogs/452/Git_1-1024x576.png new file mode 100644 index 0000000..30e7cee Binary files /dev/null and b/src/content/blogs/452/Git_1-1024x576.png differ diff --git a/src/content/blogs/452/Git_2-1024x575.png b/src/content/blogs/452/Git_2-1024x575.png new file mode 100644 index 0000000..06cb883 Binary files /dev/null and b/src/content/blogs/452/Git_2-1024x575.png differ diff --git a/src/content/blogs/452/Git_3-1024x577.png b/src/content/blogs/452/Git_3-1024x577.png new file mode 100644 index 0000000..f18d439 Binary files /dev/null and b/src/content/blogs/452/Git_3-1024x577.png differ diff --git a/src/content/blogs/452/Git_4-1024x576.png b/src/content/blogs/452/Git_4-1024x576.png new file mode 100644 index 0000000..8a99b9b Binary files /dev/null and b/src/content/blogs/452/Git_4-1024x576.png differ diff --git a/src/content/blogs/452/OOP_1-1024x576.png b/src/content/blogs/452/OOP_1-1024x576.png new file mode 100644 index 0000000..f3313d7 Binary files /dev/null and b/src/content/blogs/452/OOP_1-1024x576.png differ diff --git a/src/content/blogs/452/OOP_2-1024x576.png b/src/content/blogs/452/OOP_2-1024x576.png new file mode 100644 index 0000000..5a6472a Binary files /dev/null and b/src/content/blogs/452/OOP_2-1024x576.png differ diff --git a/src/content/blogs/452/OOP_3-1024x576.png b/src/content/blogs/452/OOP_3-1024x576.png new file mode 100644 index 0000000..19c9fc4 Binary files /dev/null and b/src/content/blogs/452/OOP_3-1024x576.png differ diff --git a/src/content/blogs/452/OOP_4-1024x576.png b/src/content/blogs/452/OOP_4-1024x576.png new file mode 100644 index 0000000..7012199 Binary files /dev/null and b/src/content/blogs/452/OOP_4-1024x576.png differ diff --git a/src/content/blogs/465.md b/src/content/blogs/465.md new file mode 100644 index 0000000..5fc3b5f --- /dev/null +++ b/src/content/blogs/465.md @@ -0,0 +1,29 @@ +--- +title: Python 講習会を開催 +description: | + 5/22 (土) に Python 3 の講習会をオンライン開催しました。 + + Python は C/C++ のような言語よりも手軽に扱えることから多くの人に好まれている言語です。また、統計処理や機械学習系のライブラリが充実しており、その分野でも広く使われています。今回の講習会では、Python が持つ基本的な機能を網羅的に解説し、AtCoder Beginners Selection で演習することで、Python を活用できるようになることを目標としました。 +author: member +tags: [workshop, python] +--- + +

5/22 (土) に Python 3 の講習会をオンライン開催しました。

+ +

Python は C/C++ のような言語よりも手軽に扱えることから多くの人に好まれている言語です。また、統計処理や機械学習系のライブラリが充実しており、その分野でも広く使われています。今回の講習会では、Python が持つ基本的な機能を網羅的に解説し、AtCoder Beginners Selection で演習することで、Python を活用できるようになることを目標としました。

+ +![](./465/Python_1-1024x576.png) + +![](./465/Python_2-1024x576.png) + +![](./465/Python_3-1024x576.png) + +![](./465/Python_4-1024x576.png) + +![](./465/Python_5-1024x576.png) + +

資料は Discord で配布していますので、今回参加できなかった方もその資料で学習可能です!

+ +

今後の予定

+ +

次は6月初めに Linux の講習会、そして 5/29 - 6/26 にチーム開発イベントを同じく Discord 新歓サーバーで予定しています。興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトで紹介していますので、こちらもご確認ください。

diff --git a/src/content/blogs/465/Python_1-1024x576.png b/src/content/blogs/465/Python_1-1024x576.png new file mode 100644 index 0000000..5b223d8 Binary files /dev/null and b/src/content/blogs/465/Python_1-1024x576.png differ diff --git a/src/content/blogs/465/Python_2-1024x576.png b/src/content/blogs/465/Python_2-1024x576.png new file mode 100644 index 0000000..66b1087 Binary files /dev/null and b/src/content/blogs/465/Python_2-1024x576.png differ diff --git a/src/content/blogs/465/Python_3-1024x576.png b/src/content/blogs/465/Python_3-1024x576.png new file mode 100644 index 0000000..d12275a Binary files /dev/null and b/src/content/blogs/465/Python_3-1024x576.png differ diff --git a/src/content/blogs/465/Python_4-1024x576.png b/src/content/blogs/465/Python_4-1024x576.png new file mode 100644 index 0000000..0b0946c Binary files /dev/null and b/src/content/blogs/465/Python_4-1024x576.png differ diff --git a/src/content/blogs/465/Python_5-1024x576.png b/src/content/blogs/465/Python_5-1024x576.png new file mode 100644 index 0000000..107e451 Binary files /dev/null and b/src/content/blogs/465/Python_5-1024x576.png differ diff --git a/src/content/blogs/487.mdx b/src/content/blogs/487.mdx new file mode 100644 index 0000000..97b5bf4 --- /dev/null +++ b/src/content/blogs/487.mdx @@ -0,0 +1,89 @@ +--- +title: ゲームや動画等の演出の話 (雑) +description: | + OUCC Advent Calender 2021 16日目の記事です。 執筆者: ちょくぽ + 前回はShiokaiさんの GrabPassで取得したテクスチャが意外と後まで使える でした。 + + 演出関連の気づきを、自分用にメモするくらいの気持ちで書いていきます。 + これは特別演出の勉強などはしていない、一般趣味クリエイターによる記事です。読者としてポートフォリオを作るような方々ではなく、一般人を想定しています。 +author: member +tags: [advent-calendar] +--- +import Image from "@/components/common/Image.astro" +import Screenshot from "./487/スクリーンショット-2021-12-15-152205-1024x719.png" + +

OUCC Advent Calender 2021 16日目の記事です。 執筆者: ちょくぽ
前回はShiokaiさんの GrabPassで取得したテクスチャが意外と後まで使える でした。

+ +

演出関連の気づきを、自分用にメモするくらいの気持ちで書いていきます。
これは特別演出の勉強などはしていない、一般趣味クリエイターによる記事です。読者としてポートフォリオを作るような方々ではなく、一般人を想定しています。

+ +

特殊演出や凝った編集のような話ではありません。普段コンテンツを見る側として気にも留めていなかった、しかし制作側は知っておかないと作れない、そんなことが中心です

+ +

色彩

+ +

基本的には目立たせたい所にコントラストを使い、色相・明度・彩度に差を出します。これは広く知られていることかと思います。しかし、実際に三要素全てで差を出すと強烈になりすぎます。メイン(キャラや障害物等、ゲームプレイに関係のあるもの)と比較して背景は明度で差を、敵や弾と主人公とは色相で差を出し(例.2Pカラー)、主人公等見て欲しいものにより高い明度・彩度を使う(≒光を当てる)ことで目立たせる等が常套手段。

+ +

逆に単一オブジェクトの中では三要素全てをある程度まとめるべきです。特に背景はぼかしてでも1~3色程度にまとめましょう(敵の弱点やギミック等は見て欲しいものなのでこの限りでない)。 単一オブジェクト内では、下画像のように使用色がパレット上で一直線に並ぶようにするとまとまりが良いです。色相を少しだけ変えると汚くなりにくい。アクセントの色はむしろ外れる方がキャッチーかも。

+ +

確かに使用色がばらけるほど目立ちますが、ゲームや動画・キャラデザの文脈では目立ちすぎると目が疲れる・悪目立ちといった印象になるので、メイン色範囲(直線)1本、アクセント1,2色程度に留めましょう。

+ +
OUCC Advent Calender 2021 day16 pic1
+ +

+ +

ビジュアルノベルやRPG(アクションでない)等では、逆に雰囲気を重視し環境光などでキャラをなじませることがよくあります。書いてあることと逆じゃないかと思うかもしれませんが、このときは背景美術や音楽などもっと目立たせたいものが他にあることや、キャラの実在感を出すためということもあります。後者の場合、光を当てたり視点誘導などでメインが目立つようにしています。

+ +

動画や広告等でも同じことが言えます。字幕を縁取りすることはコントラストを作り目立たせる手法として一般的です。また、赤色の特徴である購入意欲向上や、信頼感の青色、明るい気分の黄色など色の特徴を使うこともあります。

+ +

いら〇とやなどを使うときは当然他の素材と競合しないようにするべきです。い〇すとや等イラスト素材は、それ単体でメインになる程度の情報量(≒色の多さ、十分な明るさ、三要素のばらつき具合)を持っています。文章だけの掲示に彩りを与えるには良いですが、他にメインとなる画像素材がある場合、いらす〇やは実は邪魔かもしれないのです。

+ +

動き

+ +

イージング最高!イージング最高!イェイイェイ!

+ +

すべてのUI、ズームイン/アウト、表示などに、親の仇のようにイージングを使いましょう。イージングとは、簡単に言うと加減速のことです。

+ +

アイコンやボタンなどの表示はEase-In-Outがいいでしょう。最初に加速、最後に減速です。いきなりアイコンが動くとユーザーが驚くし、急に停止すると不自然な上にフリーズか仕様か分かりません。加速度の絶対値が小さすぎるとのっそりもっそりしてしまうので、すぐに最高速度に達するようにしましょう。

+ +

ボタンを押したとき等、ユーザーが能動的に操作するとき、その演出にはEase-Outを使いましょう。最初からトップスピード、最後に減速です。ユーザーが触れた瞬間に動き出すので、クリックにより"弾いた"感があり、操作している感が出ます。

+ +

*直線移動、Ease-in-out、Ease-outの例をGIF画像で作ったがこのブログ.gif対応してない*

+ +

ぶっちゃけ動きの演出なんて無限通りあります。イージングはいついかなる場所でも大体通用しますが、エフェクトはそう簡単ではありません。

+ +

使用するエフェクトは世界観ごとに、前もってある程度まで限定しておきましょう。
サイバーな世界ではグリッチやモザイク、発光などを多用し、ポップな世界ではバウンド、いったん拡大縮小しすぎて戻るやつなどを多用します。アイコンはもちろん、キャラクターの動きや字幕までエフェクトを統一すると、より世界観を演出できます。

+ +

ゲームに限った話ではありません。業務用ソフトのUIや動画にも世界観というものはあります。UIに明るい世界観を与えると、ユーザーフレンドリーな感じになります。

+ +

一瞬色を反転させる、拡大縮小と共にフェードインさせる、明度が高い所だけを先に描画し印象付ける、など世界観を持たない演出は便利に使えますし、他の演出と組み合わせることもできます。無限です。ここはもう製作者の好みの話です。

+ +

配置

+ +

余白を上手く使うことができる人は強いです

+ +

イラストを描く人なら知っているかもしれませんが、キャラが向いている方向に空間があると、安定して良く見えます。逆にキャラの背後に空間があると不安を煽り、キャラの頭上に空間を大きく取ると開放感を与えます。また、キャラが前を向いていると未来を、振り返っていると過去を、カメラと目が合うと元気さを、カメラと目が合わないと不思議を演出します。

+ +

視点誘導の方法も様々です。見て欲しいものをキャラが見ている方向に置いたり、光を当てたりすると目立ちます。窓枠やその他物などで囲いを作り、中に見て欲しいものを置くのもありです。(ただし、四角形の中に物を入れるのは不安感を煽る手法でもあります)

+ +

先ほどの四角の他に、画面を傾けたり(Dutch angle)、重要なものの一部をあえて画面外へやることでも不安感を演出できます。未知や不安定は怖いものです。

+ +

画面上の適当な三角形の領域に見て欲しいものを収める構図は躍動感を与えます。(丸の場合は安定感を出します) 広く知られていながら、常に強力な構図です。*三角構図*
同様に、画面を3×3分割し、その交点上 or 線上に見て欲しいものを置く(≒ド真ん中を避ける)のも魅力的です。*三分割法*

+ +

広告の文脈では、人間は左上→右下で視点を動かす癖があるので、これを意識した配置にするのがおススメです。街中の広告でも、見出しが左上に書いてあることが多いかと思います。(縦書きの場合右上→左下)

+ +

当たり前に聞こえるかもしれませんが、大きいものは目立ちます。文字や画像に大小をつけるということは優先順位を定義することであり、ユーザーはどれから見れば良いのかが分かります。逆に大小がないとユーザーにストレスがかかり、読まれません。動画やゲームでもそうです。ボスの登場時はボスにカメラを寄せて強敵感を出しますし、エフェクトが派手で大きいと印象に残ります。

+ +

音響

+ +

金銭的理由からフリー音源を使いがちな趣味クリエイターには辛いことですが、SEとBGMはそのコンテンツの世界観の半分を決定します。神ゲーと言われるインディーゲームのほとんどはBGMやSEに信じられないほどの情熱を注いでいます。

+ +

詳しくは触れませんが、当然ながら、音楽は強烈な世界観を持ちます。調や進行だけでなく、音源やリバーブですら世界観を演出します。SEもまた世界観を持ちます。

+ +

音楽と絵の世界観は、不気味さを演出するのでない限りは合わせるべきです。が、これがなかなか難しい。特定の世界観を持たない演出を多用すれば音楽に合いはしますが、個性が潰れます。DTMを嗜む御仁や絵の描ける御仁は、自分の手の届かない、素材を使うしかない領域を先に作り、その世界観に合わせて柔軟に制作をしてみてはいかがでしょう。

+ +

しめ

+ +

コンテンツ内容とエフェクト、音楽と絵のように、複数の要素間で世界観を共有するのは非常に難しいことです。ディレクターの大事な役割の一つは、世界観を開発メンバーと共有し調節することなのでしょう。ここがアマチュアとプロの境界であり、マルチクリエイターの強みでもあるかと思います。

+ +

さいごに、細かい設定を練った末に出てくる些細なこだわりはオタクの心をくすぐる神演出になるものです。裏の設定を練りましょう。舞台裏を、世界を想像しましょう。

+ +

OUCC Advent Calender 2021 次回は izumi104 さんです!

diff --git "a/src/content/blogs/487/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-15-152205-1024x719.png" "b/src/content/blogs/487/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-15-152205-1024x719.png" new file mode 100644 index 0000000..6a1d28f Binary files /dev/null and "b/src/content/blogs/487/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-15-152205-1024x719.png" differ diff --git a/src/content/blogs/490.mdx b/src/content/blogs/490.mdx new file mode 100644 index 0000000..4e146ef --- /dev/null +++ b/src/content/blogs/490.mdx @@ -0,0 +1,63 @@ +--- +title: テトリスの電子辞書移植 +description: | + 執筆者: watamario15 + + これは OUCC Advent Calendar 2021 の14日目の記事です。前日の記事は...おかしいなぁ誰もいないぞ?w 明日の記事は shiokai が担当します。 + + さて、何を書きましょうか。マジでネタがありません。何を隠そう今まさに12月14日23:22です。 +author: member +tags: [advent-calendar, electronic-dictionary] +--- +import Image from "@/components/common/Image.astro" +import Pic from "./490/P_20210501_231913.jpg" + +

執筆者: watamario15

+ +

これは OUCC Advent Calendar 2021 の14日目の記事です。前日の記事は...おかしいなぁ誰もいないぞ?w 明日の記事は shiokai が担当します。

+ +

さて、何を書きましょうか。マジでネタがありません。何を隠そう今まさに12月14日23:22です。今年は大量の課題やら部室の引っ越しやらノーキャリアの学祭やら Brain Wiki の整備やらの事務的なことが多く、個人でプログラムを書く時間をあまり取れなかったのです(そういえば、今年から Brain Wiki の Admin になりました)。情報科学科なら講義でプログラムを書くのでは?と思うかもしれませんが、はっきり言ってあんなのおまけで数学や回路設計の方がはるかに workload が高いです。というか、プログラミングの講義自体レポートを書く部分が本質みたいなところあります。つらい。

+ +

うーんどうしようか、そういえばギリギリ今年のはじめに OB の方が作ったテトリスを電子辞書に移植するのやってたな、あれの流れと宣伝でも書いとくか(ここでようやくタイトル欄を埋める)。

+ +

経緯

+ +

さて、電子辞書とは言っても明確な機種を指定していませんでしたね。機種は SHARP のカラー電子辞書 Brain シリーズです。ただし、2021年発売のモデル以降は見た目こそほぼ変わりませんが中身が全く違うので対象としません。昨年の私の記事で、実際に作り方を説明していますので興味があれば見ていってください。

+ +

まず、なぜ移植しようと思ったのか。それは突如として OB さんの1人が

+ +

「最近win32apiでテトリスを実装しました。」

+ +

という投稿と共に OUCC の Discord (内部サーバーで、当時はこちらがメインの活動場所だった)でテトリスを添付されたことが始まりです。何という奇遇でしょうか。WinCE が動く SHARP Brain は、ライブラリこそ碌に流通していませんが Win32 API の subset を利用することができます(詳細は昨年の記事)。そして、その完成度の高さにも驚きました。結構昔から電子辞書で動くテトリスは実はあったのですが、それはモノクロで乱数も seed 値が全く同じでパターンが変化しない、とても単純なものでした。

+ +
「これは移植すると面白いかもしれない」
+ +

そうして、移植が始まったのでした。

+ +

序盤

+ +

本当は詳しく書きたいものですが、何しろ今 23:38 です。時間がありません。概況だけ書きます。

+ +

まず、最初の状態でそのまま CeGCC に掛けるとしっかりエラーになりました。まあ、そうなりますよね。想定内です。あくまで subset の API しかサポートしないので、そのまま動くなんぞ甘い期待は禁物です。

+ +

まず、1つは menu bar の仕様違いです。ここは WinCE をやるときの1つの沼で、私もかつて知るまではずっと何がダメなのか分からなかったし、分かっても仕様がどこを調べても書いていないので苦労しました。CE はモバイル用 OS で、それゆえ画面領域が貴重です。狭い範囲に最大限の情報を詰め込むため、×ボタンなどの並びと menu bar を共通にできる command bar が導入されています。なので、これに置き換える必要があるのです。とはいえ、この苦労は既に1年前に経験したものですから、簡単に切り抜けました。

+ +

中盤

+ +

あ^~もう 23:46 じゃないか!!やばい!!

+ +

次はレイアウトの問題です。何か酷いことになってたんですよねこの段階では。これも command bar の仕業です。通常 Windows なら menu bar は描画範囲外ですが、何と CE では範囲内です。なので、その分画面全体を下にずらさなければなりません。いやぁとんだ沼ですね。しかも、幅はさすがに取得する API があるのですが画面が出てからしか使えません。よって、ウィンドウサイズを起動した後に変えるような仕様変更をすることになりました。

+ +

終盤

+ +

ここが一番苦労した部分です。なぜか適切に描画されなくなる問題が生じて、あれやこれやと色々試す沼にはまりました。時間も無いので (23:54) 結果だけ書いてしまうと、電子辞書の超低スペックでもまともに動くようにするために FPS を落としたとき、プログラム仕様をよく分かっておらず「やってはいけない」設定変更を実施したことによるものでした。悲しいですね。

+ +

成果

+ +
+ +

https://github.com/OUCC/tetris

+ +

何はともあれ一応動くものは完成しました。上記の GitHub Repository に置いてあるので、対象機種をお持ちの方はぜひ遊んでみてください(くれぐれも先生の前でやって没収されぬよう...)。ただ、割と高度な音声処理が組み込まれているらしく、そのせいか電子辞書では結構もっさりします(十分遊べますが)。あと、電子辞書版が遊ばれる状況を考慮して初期状態では音量が0になっています。右のスライダーやページ送りボタンで音量を上げると、効果音付きで遊べますので是非お試しください。

+ +

(あー10分超過したッ!!許せッ!!)

diff --git a/src/content/blogs/490/P_20210501_231913.jpg b/src/content/blogs/490/P_20210501_231913.jpg new file mode 100644 index 0000000..c8ecd65 Binary files /dev/null and b/src/content/blogs/490/P_20210501_231913.jpg differ diff --git a/src/content/blogs/512.md b/src/content/blogs/512.md new file mode 100644 index 0000000..43c8f86 --- /dev/null +++ b/src/content/blogs/512.md @@ -0,0 +1,67 @@ +--- +title: GrabPassで取得したテクスチャが意外と後まで使える +description: | + 執筆者: Shiokai + + はじめに + この記事は、OUCC Advent Calendar 2021の15日目の記事です(投稿日がずれているのは気にしない)。前回はwatamario15さんのテトリスの電子辞書移植でした。 + またこの記事はUnityのShaderのGrabPassに関する内容です。 +author: member +tags: [advent-calendar, unity] +--- + + +

執筆者: Shiokai

+ + + +

はじめに

+ + + +

この記事は、OUCC Advent Calendar 2021の15日目の記事です(投稿日がずれているのは気にしない)。前回はwatamario15さんのテトリスの電子辞書移植でした。
またこの記事はUnityのShaderのGrabPassに関する内容です。

+ + + +

本題

+ + + +

シェーダーを触ったことのある人なら大抵一度は触ってみたくなる(よね?)GrabPassではありますが、Unityのドキュメントにはわずか1ページの説明しかありません。その中に、GrabPassで取得したテクスチャ(以下GrabTex)は「後続のパス」で使用できるとあります。この「後続のパス」というのが肝で、私は当初同じシェーダー(SubShader)内で後に来るパスのことを指しているのかと思っていました。

+ + + +

ところがある日Twitterを見ていると、異なるシェーダーでもGrabTexが使用できるといった内容のツイートを見かけました(何方のツイートか分からなくなってしまってリンクが貼れない……)。これは試さねばと思い、GrabPassだけをするシェーダーと、GrabTexを貼るだけのシェーダーを書いてみると、なんと確かに異なるシェーダーでもGrabTexが使えているではありませんか!

+ + + +

さらにもう少し触ってみると、GrabPassが呼ばれてから、再度同じ名前のGrabTexでGrabPassが呼ばれるまでの間であれば、初めのGrabTexがどんなシェーダーからでも使える様でした。GrabPassが呼ばれるタイミングは通常のPassと同様にRenderQueueと前後関係による(はずな)ので、単純にRenderQueueがGrabPassより後ならGrabTexがそのまま使えてしまうことになります。

+ + + +

更に、GrabPassとGrabTexを使うシェーダーのRenderQueueを逆転してみたところ、なんと前のフレームのGrabPassで取得したと思しきGrabTexが使用できてしまいました。ただ、その場合オブジェクトを動かすかどうかでうまく描画できなくなることもあったので、実用に耐えうるかどうかは怪しいものですが。
これを見るに、GrabTexが使える「後続のパス」は、時系列的に後であれば本当に何でもいいようです。

+ + + +

注意点としては、GrabPassをしているシェーダーがカリングされてしまうとGrabTexを使用している側には意図しないテクスチャ(たいてい灰色一色)が渡されることになるので、オブジェクトの配置やBoundsには気を付ける必要があるでしょう。

+ + + +

これで何ができるの?

+ + + +

GrabTexが他のシェーダーで使えることでどういった表現ができるようになるかと言われると……正直自分にはさっぱり何も思いつきません。例えばオブジェクトの座標を色情報にしてシェーダー間で受け渡しできたりはしますが、それはGPUInstancingを使った既存の手法もありますし、何よりスクリプトが使えれば簡単にできることで、では他にわざわざ他のシェーダーからGrabTexを持ってきてするようなことがあるかというと……。この記事を読んだ方が何か素晴らしいアイデアを実現してくれるといいなぁ。

+ + + +

終わりに

+ + + +

ゴミみたいな文章が出来上がってしまった……

+ + + +

OUCC Advent Calendar 2021、次回の担当者はちょくぽさんです。

+ diff --git a/src/content/blogs/522.md b/src/content/blogs/522.md new file mode 100644 index 0000000..e89e1f1 --- /dev/null +++ b/src/content/blogs/522.md @@ -0,0 +1,148 @@ +--- +title: パワポを動画にしようとしてみた +description: | + はじめに + この記事は、OUCC Advent Calendar 2021の18日目の記事です。前回はAreiさんのハンドヘルドコンピュータの製作と展望でした。 今回はPower Pointのスライドショーを動画に変換しようとしてみました。 +author: member +tags: [advent-calendar] +--- + +執筆者 みやじ + +## はじめに + +この記事は、[OUCC Advent Calendar 2021](https://adventar.org/calendars/6722)の18日目の記事です。前回はAreiさんの[ハンドヘルドコンピュータの製作と展望](http://arei1126.ddns.net/other/handheld/handheld.html)でした。 今回はPower Pointのスライドショーを動画に変換しようとしてみました。 + +## やり方 + +音声付きスライドを考えると動画を作るためには画像と音声が必要です。しかし、pptxファイルやppsxファイルから直接画像や音声を取り出すことのできるライブラリはありませんでした。 + +まずは音声ファイルの抽出から行うことにしました。pptxを含むoffceファイルは中身はただのzipファイルなのでos.Rename()を使ってファイル形式を変え、zipfileライブラリで開くことで中の情報に直接アクセスできます。音声ファイルがあるのは ppt/media のディレクトリで、どの音声がどのスライドに紐づけられているのかというのは ppt/slides/_rels にあるrelsファイルに書いてあります。relsファイルはxmlファイルなのでこれもos.Rename()でファイル形式を変えて扱います。そこから音声ファイルとスライドの関連情報が得られ、音声ファイルの準備は完了します。 + +次に画像ファイルの作成ですが、現状pptxから自力で画像を作ること大変難しいのでPower Pointアプリを起動し、画像をエクスポートさせます。これはcomtypesライブラリを用いることで実現しました。 + +最後にこれらをまとめるのですがこれにはffmpegというコマンドライン上から動画編集ができるソフトをいれ、python上でそのコマンド実行するというゴリ押しの方法で行いました。 + +## 作っている途中で気づいたこと + +**Power Pointのエクスポートに動画に出力する機能があり、自作するより圧倒的に多機能であること** + +## それを知って + +デバッグする気力がなくなったため、途中からデバッグしてません。理論は分かったけど、もう動作させる理由がありませんでした。たぶん動かないと思います。 + + + +```python +import os +import re +import zipfile +import glob +from comtypes import client +import xml.etree.ElementTree as ET +import subprocess + +def getM4aPath(relsPath): + root = ET.fromstring(relsPath) + for child in root: + data = child.attrib["Target"] + print(data) + if re.match(".+\.m4a",data): + return "pptxZipTemp/voice/ppt/" + data.replace("../","") + return "" + +def generateMp4(relsPathList,pptxPath): + aviPathList = [] + concat = "concat:" + for index,relsPath in enumerate(relsPathList): + voicePath = getM4aPath(relsPath) + pngPath = "pptxZipTemp/images/slide{}.PNG".format(index) + aviPathList.append("pptxZipTemp/avi/temp{}.avi".format(index)) + subprocess.run("ffmpeg -loop 1 {} -i {} -vodec mpeg4 -acodec pcm_s16le -shortest {}".format(pngPath,voicePath,aviPathList[index]),shell=True) + concat = concat + aviPathList[index] + "|" + concat = re.sub(".+\|$","",concat) + pptxPath = pptxPath.split("/") + pptxPath = pptxPath[-1].split(".") + subprocess.run("ffmpeg -f concat -i {} -vcodec libx264 -acodec aac -pix_fmt yuv420p {}".format(concat,pptxPath[0])) + + +def zip2mp4(zipPath,pptxPath): + with zipfile.ZipFile(zipPath) as pptxZip: + inforLi = pptxZip.infolist() + voicePathList = [] + relsPathList = [] + for info in inforLi: + fname = info.filename + if re.match(".+\.m4a",fname): + voicePathList.append(fname) + elif re.match("ppt/slides/_rels/.+\.rels",fname): + relsPathList.append(fname) + print(fname) + for voiceIndex, voicePath in enumerate(voicePathList): + pptxZip.extract(voicePath, "pptxZipTemp/voice") + voicePathList[voiceIndex] = "pptxZipTemp/voice/" + voicePath + for relsIndex, relsPath in enumerate(relsPathList): + renamedRelsPath = relsPath.replace(".rels","") + pptxZip.extract(relsPath, "pptxZipTemp/rels/") + os.rename("pptxZipTemp/rels/"+relsPath, "pptxZipTemp/rels/"+renamedRelsPath) + relsPathList[relsIndex] = "pptxZipTemp/rels/" + renamedRelsPath + + generateMp4(relsPathList,pptxPath) + +def export_img(fname, odir): + application = client.CreateObject("Powerpoint.Application") + application.Visible = True + current_folder = os.getcwd() + + presentation = application.Presentations.open(os.path.join(current_folder, fname)) + + export_path = os.path.join(current_folder, odir) + presentation.Export(export_path, FilterName="png") + + presentation.close() + application.quit() + +def rename_img(odir): + file_list = glob.glob(os.path.join(odir, "*.PNG")) + for fname in file_list: + new_fname = fname.replace('スライド', 'slide') + os.rename(fname, new_fname) + +def getLines(path): + reg = '\.pp[s|t]x' + renamedPath = re.sub(reg,".zip", path) + print("match:") + print(renamedPath) + print(path) + if os.path.isfile(path): + try: + subprocess.run("mkdir pptxZipTemp",shell=True) + export_img(path,"pptxZipTemp/images") + rename_img("pptxZipTemp/images") + os.rename(path,renamedPath) + print("This path exists.") + print(renamedPath) + zip2mp4(renamedPath,path) + except OSError as e: + print("An OSError occured") + print(e) + finally: + os.rename(renamedPath,path) + print("終了しました") + else: + print(path+"は存在しないか、対応していません。") + +def main(): + while True: + print("scan:") + inputString = input() + if inputString == "exit": + break + else: + getLines(inputString) + + +if __name__ == "__main__": + main() + +``` diff --git a/src/content/blogs/524.mdx b/src/content/blogs/524.mdx new file mode 100644 index 0000000..07523a2 --- /dev/null +++ b/src/content/blogs/524.mdx @@ -0,0 +1,164 @@ +--- +title: 政府統計e-Statで学期末レポートを粉砕する +description: | + 執筆者:yuyu + + この記事はOUCC Advent Calendar 2021の19日目の記事です。前回はyuさんの「パワポを動画にしようとしてみた」でした。 + + 吐く息も白くなってきて、いよいよ令和も3年目を終え、はや4年目を迎えることに驚きを隠せておりません。 +author: member +tags: [advent-calendar] +--- +import Image from "@/components/common/Image.astro" +import Screenshot from "./524/スクリーンショット-2021-12-18-223020-1024x593.png" +import BunyaAka from "./524/分野に丸付けたやつ-1024x594.png" +import Kakei from "./524/家計調査-1024x594.png" +import ShosaiAka from "./524/詳細に赤丸-1024x594.png" +import UrlAka from "./524/URLに赤丸-1024x594.png" +import YogoAka from "./524/用語の解説に赤丸-1024x592.png" +import DatabaseAka from "./524/データベースに赤丸-1024x593.png" +import NenjiAka from "./524/年次に赤丸-1024x593.png" +import DbAka from "./524/DBに赤丸-1024x594.png" +import Fig3 from "./524/図3-1024x591.png" + +

執筆者:yuyu

+ +

この記事はOUCC Advent Calendar 2021の19日目の記事です。前回はyuさんの「パワポを動画にしようとしてみた」でした。

+ +

吐く息も白くなってきて、いよいよ令和も3年目を終え、はや4年目を迎えることに驚きを隠せておりません。yuyuです。みなさんはいかがお過ごしでしょうか。私は下宿をしている身ですが、部屋に備え付けの暖房の効きが異常に悪く、毎日布団にくるまっているミノムッチ状態です。

+ +

+ +

さて、今日は「政府統計の総合窓口」e-Statについて解説したいと思います。e-Statとは例えば「人口・世帯」、「労働・賃金」といった17の分野の政府による統計結果が集まったサイトです。具体的には国勢調査の結果や賃金構造基本統計調査(様々な業種の基本給を調査)の結果などが公表されています。URLはこちら。https://www.e-stat.go.jp/

+ +

+ +

※この記事は主にデータ分析のために、あるいは基盤教養科目などのレポート課題で自身の主張を裏付けるために公的な統計結果が欲しい方向けです。例えば、法学部に所属している私なら、特に政治学の分野において適切な政策を考案するために日本の現状を知る手段の一つとしてe-Statを利用しています。

+ +

+ +

目次

+ +
  1. はじめに
  2. この記事で伝えたいこと
  3. 解決したい問題
  4. じゃあ、どうする?
  5. e-Statの良いところ・悪いところ
  6. e-Statの使い方
  7. 補足
  8. おわりに
  9. リンク
+ +

1. はじめに

+ +

あなたはこれまでの人生で公的な統計結果が欲しいと感じたことがありませんでしたか?高校で調べ学習を課されたり、大学の基盤教養科目でレポート課題を課されたり。往々にして「引用するデータは信頼のおける発信者のものにしなさい」と注文が来ます。信頼のおける発信者とは公的機関、特に政府機関です。とはいえピンポイントで見つけるのは難しいです。たいていの場合は省庁が出している報告書に引っ掛かる程度。

+ +

そこで登場するのが我らがe-Statであり、これはありとあらゆる公的な統計調査結果を集約したサイトで、そこからさまざまな調査結果を調べ、データのダウンロード、ブラウザ上で表作成、グラフ作成が可能です。

+ +

こんな便利なサイトがあるのに使いこなさないのはもったいない!!!ということで、今日は[冬季集中講義]e-Stat基礎論を開講します。安心してください、楽単ですよ。

+ +

+ +

2. この記事で伝えたいこと

+ + + +

3. 解決したい問題

+ +

公的統計調査結果の効率的な収集です。そもそも、どのような統計調査が行われているのかを具体的に認識していないと単にブラウザで調べるという手法では限界があります。

+ +

+ +

4. じゃあ、どうする?

+ +

ついにこの記事の真打、e-Statの登場です。先述の通り、e-Statとは政府統計調査のポータルサイトです。ここを経由して様々な統計データにアクセスができます。ここでいったんe-Statの長所短所を確認しておきましょう。

+ +

+ +

5. e-Statの良いところと悪いところ

+ +

◇良いところ

+ + + +

◇悪いところ

+ + + +

こんなところです。べた褒めをしても政府の回し者に思われてしまいそうなので短所を出しておきましたが、個人的には気にならないかなと思っています。それは、デザインの問題であるという性質上、xlsx形式でダウンロードしてExcelを開いて自分で表やグラフを作成すれば済むことだからです。

+ +

+ +

6. e-Statの使い方

+ +

今回は「家計調査」を題材として説明していきたいと思います。

+ +

(1)e-Statにアクセスする

+ +

任意のWebブラウザで「e-Stat」と検索していただくと”e-Stat政府統計の総合窓口”にアクセスできると思います。(直リンは https://www.e-stat.go.jp/)

+ +
トップページはこんな感じ
+ +

(2)知りたい情報のキーワードを考える

+ +

ここからお目当てのデータにたどり着くには「・統計データを探す」というところから「すべて」、「分野」、「組織」、キーワード検索の4通りの方法があります。基本的には探しやすい「分野」を用いるのが良いと思います。探し出せなければキーワード検索を使いましょう。

+ +

今回の例として用いる題材は家計調査でしたね。つまり、キーワードは「家計」、「経済」です。まず分野を確認してみて、なければキーワード検索です。

+ +
「分野」をクリック
+ +

「企業・家計・経済」という分野の主な調査に掲載されている「家計調査」をクリックしましょう。

+ +
「家計調査」をクリック
+ +

(3)統計調査の詳細な内容確認

+ +

クリックして次のページに進んだら当該統計調査の目的と内容が大まかに書かれているのがわかると思います。統計データを分析するには統計で用いられている用語の定義を確認することが非常に重要です。自分の考えていた意味とは全く異なる場合があります。統計調査名の右にある「詳細」をクリックしてください。

+ +
「詳細」をクリック
+ +

すると担当機関名や課室名、連絡先などの情報がありますがそれらは無視して「ホームページURL」とあるのをクリックしてください。担当機関の当該統計調査に関するページに飛びます。

+ +
URLをクリック
+ +

ここには調査の概要や結果が載っています。この統計では総務省統計局のホームページですが、別の統計で担当機関が異なる場合でも同様に調査の概要を説明するページに飛びます。さて、最も重要なのは用語の定義です。調査の結果 > 用語の解説と進みます。

+ +
調査の結果 > 用語の解説
+ +

可処分所得を例に確認します。

+ +

「実収入」から税金,社会保険料などの「非消費支出」を差し引いた額で,いわゆる手取り収入のことである。これにより購買力の強さを測ることができる。

用語の解説
+ +

実収入と非消費支出にカギ括弧がついていますが、これらの定義も同じページに説明があるので確認してみてください。

+ +

(4)データ取得

+ +

用語の定義を確認したらいよいよデータを取得します。(2)が終わった段階までページをさかのぼります。「データベース」と「ファイル」の2つが確認できるかと思います。

+ +
+ +

このうち、「データベース」を選択した場合はブラウザ上で表の作成、グラフの作成ができます。単に内蔵データを確認したいならこちらを選択してください。一覧が出てくるので家計収支編 > 総世帯 > 年次を選び(図1)、続けて用途分類(総数)の全国の右にあるDBをクリックしてください(図2)。作成された表を閲覧できます(図3)。表をそのままダウンロードも可能です。APIは私自身がよくわからないので使っていません。

+ +
図1
+ +
図2
+ +
図3
+ +

一方、「ファイル」を選択した場合は Excelデータのダウンロードができます。

+ +

(5)データ分析

+ +

データを取得したら分析をして類似する別のデータを調べたりします。その場合は(1)からの手順を繰り返します。データ分析の手法は本題ではないので省略します。

+ +

+ +

7. 補足

+ +

今回取り扱った統計調査は国が行ったものであって、その収集単位も国全体です。しかし都道府県別のデータなど、地方公共団体を単位とする統計調査データが欲しいときもあると思います。そんなときはe-Statのトップページから「・統計データを活用する」にある「地域」を選択してください。

+ +

+ +

8. おわりに

+ +

いかがでしたでしょうか。ここまでお付き合いくださりありがとうございます。次節のリンクに学習用サイトのリンクを貼っておくのでわからない部分があればそちらを参考にしてください。

+ +

レポート課題のときだけでなく常日頃からさまざまな統計データに触れておくことで現政府の政策にある意図に気づくことができます。コロナ禍の今は皆さんも政府の動向にとりわけ注意を払っているはず。せっかくの機会ですからいろいろ考察してみると面白いかもしれないですね!

+ +

OUCC Advent Calendar 2021 次回はtakuemonさんです!お楽しみに!

+ +

9. リンク

+ + diff --git "a/src/content/blogs/524/DB\343\201\253\350\265\244\344\270\270-1024x594.png" "b/src/content/blogs/524/DB\343\201\253\350\265\244\344\270\270-1024x594.png" new file mode 100644 index 0000000..4e91466 Binary files /dev/null and "b/src/content/blogs/524/DB\343\201\253\350\265\244\344\270\270-1024x594.png" differ diff --git "a/src/content/blogs/524/URL\343\201\253\350\265\244\344\270\270-1024x594.png" "b/src/content/blogs/524/URL\343\201\253\350\265\244\344\270\270-1024x594.png" new file mode 100644 index 0000000..b763291 Binary files /dev/null and "b/src/content/blogs/524/URL\343\201\253\350\265\244\344\270\270-1024x594.png" differ diff --git "a/src/content/blogs/524/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-18-223020-1024x593.png" "b/src/content/blogs/524/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-18-223020-1024x593.png" new file mode 100644 index 0000000..9ba752d Binary files /dev/null and "b/src/content/blogs/524/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-18-223020-1024x593.png" differ diff --git "a/src/content/blogs/524/\343\203\207\343\203\274\343\202\277\343\203\231\343\203\274\343\202\271\343\201\253\350\265\244\344\270\270-1024x593.png" "b/src/content/blogs/524/\343\203\207\343\203\274\343\202\277\343\203\231\343\203\274\343\202\271\343\201\253\350\265\244\344\270\270-1024x593.png" new file mode 100644 index 0000000..d38b6d0 Binary files /dev/null and "b/src/content/blogs/524/\343\203\207\343\203\274\343\202\277\343\203\231\343\203\274\343\202\271\343\201\253\350\265\244\344\270\270-1024x593.png" differ diff --git "a/src/content/blogs/524/\345\210\206\351\207\216\343\201\253\344\270\270\344\273\230\343\201\221\343\201\237\343\202\204\343\201\244-1024x594.png" "b/src/content/blogs/524/\345\210\206\351\207\216\343\201\253\344\270\270\344\273\230\343\201\221\343\201\237\343\202\204\343\201\244-1024x594.png" new file mode 100644 index 0000000..10595e0 Binary files /dev/null and "b/src/content/blogs/524/\345\210\206\351\207\216\343\201\253\344\270\270\344\273\230\343\201\221\343\201\237\343\202\204\343\201\244-1024x594.png" differ diff --git "a/src/content/blogs/524/\345\233\2633-1024x591.png" "b/src/content/blogs/524/\345\233\2633-1024x591.png" new file mode 100644 index 0000000..071a028 Binary files /dev/null and "b/src/content/blogs/524/\345\233\2633-1024x591.png" differ diff --git "a/src/content/blogs/524/\345\256\266\350\250\210\350\252\277\346\237\273-1024x594.png" "b/src/content/blogs/524/\345\256\266\350\250\210\350\252\277\346\237\273-1024x594.png" new file mode 100644 index 0000000..ae1ff0a Binary files /dev/null and "b/src/content/blogs/524/\345\256\266\350\250\210\350\252\277\346\237\273-1024x594.png" differ diff --git "a/src/content/blogs/524/\345\271\264\346\254\241\343\201\253\350\265\244\344\270\270-1024x593.png" "b/src/content/blogs/524/\345\271\264\346\254\241\343\201\253\350\265\244\344\270\270-1024x593.png" new file mode 100644 index 0000000..8463308 Binary files /dev/null and "b/src/content/blogs/524/\345\271\264\346\254\241\343\201\253\350\265\244\344\270\270-1024x593.png" differ diff --git "a/src/content/blogs/524/\347\224\250\350\252\236\343\201\256\350\247\243\350\252\254\343\201\253\350\265\244\344\270\270-1024x592.png" "b/src/content/blogs/524/\347\224\250\350\252\236\343\201\256\350\247\243\350\252\254\343\201\253\350\265\244\344\270\270-1024x592.png" new file mode 100644 index 0000000..b81f3ca Binary files /dev/null and "b/src/content/blogs/524/\347\224\250\350\252\236\343\201\256\350\247\243\350\252\254\343\201\253\350\265\244\344\270\270-1024x592.png" differ diff --git "a/src/content/blogs/524/\350\251\263\347\264\260\343\201\253\350\265\244\344\270\270-1024x594.png" "b/src/content/blogs/524/\350\251\263\347\264\260\343\201\253\350\265\244\344\270\270-1024x594.png" new file mode 100644 index 0000000..9aa410c Binary files /dev/null and "b/src/content/blogs/524/\350\251\263\347\264\260\343\201\253\350\265\244\344\270\270-1024x594.png" differ diff --git a/src/content/blogs/548.mdx b/src/content/blogs/548.mdx new file mode 100644 index 0000000..728e588 --- /dev/null +++ b/src/content/blogs/548.mdx @@ -0,0 +1,120 @@ +--- +title: ローポリのすゝめ +description: | + 執筆者:MrMocchy + + はじめに + この文章はOUCCアドベントカレンダー2021の12/21のものです。 + 前回はtakuemonさんのMixamoのススメです。 + + これが自分のはじめてのブログ記事になります。 + 調べものの際によく出てくるブログをまねる感じで書くつもりです。 + 暖かい目でご覧ください。 +author: member +tags: [advent-calendar, blender] +--- +import Image from "@/components/common/Image.astro" +import t1 from "./548/t1.png" +import t2 from "./548/t2.png" +import tc from "./548/tc.png" +import r1 from "./548/r1.png" +import r01 from "./548/r01.png" +import r02 from "./548/r02.png" +import r02d from "./548/r02d.png" +import untitled from "./548/untitled.png" +import capcha from "./548/キャプチャ.png" + +

執筆者:MrMocchy

+ +

はじめに

+ +

この文章はOUCCアドベントカレンダー2021の12/21のものです。
前回はtakuemonさんのMixamoのススメです。

+ +

これが自分のはじめてのブログ記事になります。
調べものの際によく出てくるブログをまねる感じで書くつもりです。
暖かい目でご覧ください。

+ +

ローポリ

+ +

自分はノートパソコンしか持っていないのですが、3Dゲームは重いのばっかりで興味をもったやつの多くは必要スペックを満たせずに断念していたりします。
しかし、ある程度のグラフィックでも快適に遊べるものもあります。まあゲーム性自体がシンプルだってのもありますが、その多くは(たぶん)ローポリです。

+ +

ローポリとは、ロー・ポリゴンの略で、少ないポリゴン(=面)でできた、ざっくり言えば精巧でない3Dモデルを形容する言葉です。
それを綺麗に見せるためにテクスチャやシェーダーに力を入れているようなのですが、本記事のメインはローポリです。

+ +

エンティティを大量に配置するゲームを作る際、クオリティより数を必要とする際、その他とにかく軽くしたい際、ローポリは非常に有効です。

+ +

カメ

+ +

さて、ローポリについて話すとなれば何かの3Dモデルを用意する必要がありますが、なぜでしょうか、カメを作ろうと思いました。甲羅にポリゴン感があるからでしょうか。
「カメ 3Dモデル」などと検索してみてください。精巧なカメの画像がたくさん見つかると思います。手足や頭の曲線、皺、甲羅の凸凹感。重そうですね。

+ +

そこで自分が作ったカメがこちらです。

+ +
+ +

シンプルですね。5分で作れそうです。15分ぐらいで作りました。
しかし、このモノクロでもカメ、それもリクガメでもウミガメでもない、ミドリガメのようなカメだと分かります。

+ +

画像の左上にあるのがこれの三角面数などの情報です。比較対象は後に出しますが、基本的にこれが少ない=データ量が小さい=描画が軽いということになります。

+ +

ちなみに、もっとローポリにすることも可能です。それがこちら。

+ +
+ +

もはやカメだとも言われなければ分からなさそう...ですかね?よく見ればカメだとは思いますが。
ですがテクスチャを設定するだけで、随分と分かりやすくなるものです。現に、2色のべた塗りでも、

+ +
+ +

ほら、カメです(断言)。

+ +

先ほども述べましたが、モデルの精巧さだけでなく、このテクスチャにこだわることでもより正確なカメを表現することができます。
ただ、自分個人の意見としては、このような極端なローポリのモデルは、同じく極端に単純なモデル、パステルカラーなイメージの少ない色数といった感じのデザインで統一し、かわいい方向にした方が好きですね。

+ +

ウサギ

+ +

カメときたらウサギです。

+ +
+ +

誰が見てもウサギ、かは分かりませんが、多くの人はウサギだと言ってくれるでしょう。

+ +

これもさらにローポリにしようとしたのですが、なかなかうまいこと行きませんでした。

+ +
+ +

とりあえず鼻先を小さくするとして、やはり胴体がネックですね()。これが限界な気がします。

+ +

なので、逆に精巧に作ってみることにしました。

+ +
+ +

なにかがおかしい。犬でもない。なにかこう、いそうでいないようなクリーチャーができました。

+ +
+ +

できました。口の周りを膨らませたらウサギっぽくなりました。あとは草を咥えさせたら完全にウサギです。
色と背景を付けるとこうなります。

+ +
+ +

完成。

+ +

ここで見てもらいたいのが、2つ上の画像の左上の数字。...潰れてますね。こちらです。

+ +
+ +

そして先ほどのカメの数字をご覧ください。

+ +

ローポリの偉大さが分かっていただけたのではないでしょうか。

+ +

おわりに

+ +

まとめ:ローポリは軽い。作るのは非常に楽。かわいい。

+ +

ご覧いただきありがとうございました。

+ +

次回のOUCCアドベントカレンダー2021は、Pres.UさんのOUCC Advent Calendar DAY21 Unityでゲーム作るRTA+おまけの謎解きです。

+ +

ちなみに

+ +

上の3DモデルはBlenderというフリーソフトで作りました。完全フリーです。どこかの機能を使おうとしたら有料アップグレードを要求されることなんてありません。広告もありません。開発側はどうやって稼いでいるのでしょうか。

+ +

ローポリモデル欲しい、けどモデリングしたくない人は
「○○ 3Dモデル フリー」とかで検索、ダウンロード⇒Blenderにインポート⇒モディファイアーを追加>デシメート⇒比率を調整
で簡単にポリゴンの削減ができるはずです。あまり削減しすぎると崩れてきますが。

+ +

そしてウサギの背景をもらってきたのはPoly Havenというサイトからです。そこのHDRIs(=360°画像)で入手することができます。このサイトではテクスチャや3Dモデルも無料で利用できます。IT業界の発展のための無償公開だそうです。非常にありがたいです。

+ +

Blender:https://www.blender.org/
Poly Haven:https://polyhaven.com

+ diff --git a/src/content/blogs/548/r01.png b/src/content/blogs/548/r01.png new file mode 100644 index 0000000..6b06205 Binary files /dev/null and b/src/content/blogs/548/r01.png differ diff --git a/src/content/blogs/548/r02.png b/src/content/blogs/548/r02.png new file mode 100644 index 0000000..8bd0fd0 Binary files /dev/null and b/src/content/blogs/548/r02.png differ diff --git a/src/content/blogs/548/r02d.png b/src/content/blogs/548/r02d.png new file mode 100644 index 0000000..75b5f9b Binary files /dev/null and b/src/content/blogs/548/r02d.png differ diff --git a/src/content/blogs/548/r1.png b/src/content/blogs/548/r1.png new file mode 100644 index 0000000..207072a Binary files /dev/null and b/src/content/blogs/548/r1.png differ diff --git a/src/content/blogs/548/t1.png b/src/content/blogs/548/t1.png new file mode 100644 index 0000000..f7aa50c Binary files /dev/null and b/src/content/blogs/548/t1.png differ diff --git a/src/content/blogs/548/t2.png b/src/content/blogs/548/t2.png new file mode 100644 index 0000000..339659e Binary files /dev/null and b/src/content/blogs/548/t2.png differ diff --git a/src/content/blogs/548/tc.png b/src/content/blogs/548/tc.png new file mode 100644 index 0000000..e91efd6 Binary files /dev/null and b/src/content/blogs/548/tc.png differ diff --git a/src/content/blogs/548/untitled.png b/src/content/blogs/548/untitled.png new file mode 100644 index 0000000..5882036 Binary files /dev/null and b/src/content/blogs/548/untitled.png differ diff --git "a/src/content/blogs/548/\343\202\255\343\203\243\343\203\227\343\203\201\343\203\243.png" "b/src/content/blogs/548/\343\202\255\343\203\243\343\203\227\343\203\201\343\203\243.png" new file mode 100644 index 0000000..db0bec6 Binary files /dev/null and "b/src/content/blogs/548/\343\202\255\343\203\243\343\203\227\343\203\201\343\203\243.png" differ diff --git a/src/content/blogs/567.mdx b/src/content/blogs/567.mdx new file mode 100644 index 0000000..39df7a0 --- /dev/null +++ b/src/content/blogs/567.mdx @@ -0,0 +1,26 @@ +--- +title: Mixamoのススメ +description: | + 執筆者:takuemon + +  これはOUCC Advent Calendar 2021の20日の記事です。(なぜ記事を21日に記事が投稿されているんだ…おかしいぞ?…)前日(一昨日)の記事はyuyuさんの政府統計e-Statで学期末レポートを粉砕する 、明日(今日)の記事はMrMocchyさんのローポリのすゝめです。 + + 今回は、Unityでゲーム制作しているときに個人的にお世話になったサイトを紹介させていただきたいと思います。 +author: member +tags: [advent-calendar, unity, mixamo] +--- + +import Image from '@/components/common/Image.astro' +import Img1 from './567/スクリーンショット-2021-12-21-215104-1024x440.jpg' +import Img2 from './567/スクリーンショット-2021-12-21-215538-1-1024x494.jpg' +import Img3 from './567/スクリーンショット-2021-12-21-221001-1-1024x492.jpg' +import Img4 from './567/スクリーンショット-2021-12-21-222549-1.jpg' +import Img5 from './567/スクリーンショット-2021-12-21-222709-1.jpg' +import Img6 from './567/スクリーンショット-2021-12-21-223005-1.jpg' +import Img7 from './567/スクリーンショット-2021-12-21-224316-1-1024x495.jpg' +import Img8 from './567/スクリーンショット-2021-12-21-224702-1.jpg' +import Img9 from './567/スクリーンショット-2021-12-21-225021-1.jpg' +import Img10 from './567/スクリーンショット-2021-12-21-225709.jpg' +import Img11 from './567/スクリーンショット-2021-12-21-230131-1.jpg' + +

執筆者:takuemon

 これは OUCC Advent Calendar 2021 の20日の記事です。(なぜ記事を21日に記事が投稿されているんだ…おかしいぞ?…)前日(一昨日)の記事はyuyuさんの 政府統計e-Statで学期末レポートを粉砕する{' '} 、明日(今日)の記事はMrMocchyさんの ローポリのすゝめ です。

今回は、Unityでゲーム制作しているときに個人的にお世話になったサイトを紹介させていただきたいと思います。

URL: https://www.mixamo.com/#/

Mixamoはどんなサイトかといいますと、大量のキャラクターとモーションが無料で使い放題という慈善事業みたいなことしてるサイトです。ここではキャラクターをアップロードして、専用のモーションをダウンロードするまでを解説していきます。

1.アカウントを作る

青色のボタンをクリックしてアカウントをつくります。

右上のCharacterのタブをクリックすると大量のキャラクターをダウンロードできますが、今回は自分でキャラクターをアップロードします、UPLOAD CHARACTERをクリックしましょう。

するとこのウィンドウが表示されます。私はユニティちゃんのfbxファイルをアップロードしました。

テクスチャが貼られたモデルをアップロードしたい場合は、テクスチャとモデルを圧縮したzipファイルをアップロードしてください。

左下の頭蓋骨をおすと、ボーンが表示されます。NEXTをクリックします。

すると、こんな感じに警告文が表示されます(初見でちょっとビビった)が、全く問題ないので無視してNEXTをクリックしましょう。

これでユニティちゃんがアップロードされました! 左側のモーションをクリックすることで、ユニティちゃんにモーションを反映させることができます。例えば、

それではこれらのモーションをダウンロードしてみましょう。DOWNLOADをクリックします。

するとこのようなウィンドウが表示されますがそのままでDOWNLOADをクリックしてください。これでユニティちゃんのモーションがダウンロードされました。

いかがだったでしょうか? Unityで3Dゲームを作る時、キャラクターのモーションに悩まされることは多いと思います。そんなとき、Mixamoに頼ってみると、あなたの求めるキャラクターやモーションが手に入るかもしれません。気になった人は是非!

diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-215104-1024x440.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-215104-1024x440.jpg" new file mode 100644 index 0000000..fea0b35 Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-215104-1024x440.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-215538-1-1024x494.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-215538-1-1024x494.jpg" new file mode 100644 index 0000000..5eeae5f Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-215538-1-1024x494.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-221001-1-1024x492.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-221001-1-1024x492.jpg" new file mode 100644 index 0000000..1de2348 Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-221001-1-1024x492.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-222549-1.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-222549-1.jpg" new file mode 100644 index 0000000..d683137 Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-222549-1.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-222709-1.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-222709-1.jpg" new file mode 100644 index 0000000..76da1de Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-222709-1.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-223005-1.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-223005-1.jpg" new file mode 100644 index 0000000..48c5f80 Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-223005-1.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-224316-1-1024x495.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-224316-1-1024x495.jpg" new file mode 100644 index 0000000..3d9ada7 Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-224316-1-1024x495.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-224702-1.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-224702-1.jpg" new file mode 100644 index 0000000..7fd05ef Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-224702-1.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-225021-1.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-225021-1.jpg" new file mode 100644 index 0000000..387502a Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-225021-1.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-225709.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-225709.jpg" new file mode 100644 index 0000000..1ed7edc Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-225709.jpg" differ diff --git "a/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-230131-1.jpg" "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-230131-1.jpg" new file mode 100644 index 0000000..88b04bf Binary files /dev/null and "b/src/content/blogs/567/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-21-230131-1.jpg" differ diff --git a/src/content/blogs/590.mdx b/src/content/blogs/590.mdx new file mode 100644 index 0000000..6222e35 --- /dev/null +++ b/src/content/blogs/590.mdx @@ -0,0 +1,77 @@ +--- +title: OUCC Advent Calendar DAY21 Unityでゲーム作るRTA+おまけの謎解き +description: | + 執筆者:Pres.U(近々ハンドルネーム変更予定) + この記事はOUCC Advent Calendar 2021の21日目の記事です(実質9日目)。前回(12/21)はtakuemonさんのMixamoのススメです。 + + 今回はUnityで2Dゲームをゼロから作りかつ記事を書くという無謀なRTAを行います。多分これが一番早いとは思いません。 +author: member +tags: [advent-calendar, unity] +--- +import Image from "@/components/common/Image.astro" +import osechi2 from "./590/osechi2.jpg" +import game1 from "./590/game1.png" +import result from "./590/2021-12-22-1-1024x683.png" + +

執筆者:Pres.U(近々ハンドルネーム変更予定)
この記事はOUCC Advent Calendar 2021の21日目の記事です(実質9日目)。前回(12/21)はtakuemonさんのMixamoのススメです。

+ +

今回はUnityで2Dゲームをゼロから作りかつ記事を書くという無謀なRTAを行います。多分これが一番早いとは思いません

+ +

目次(と思しき何か)

+ +
  1. 初めに
  2. 作るゲーム
  3. 今回のRTAのレギュレーション
  4. 準備
  5. ゲームの方針
  6. 実装方法
  7. できた
  8. 完走した感想(俄並感)
  9. 謎解き
+ +

初めに

+ +

ほかの皆さんの記事は実用性があり内容も素晴らしいのですが、わたくしの書く記事は実用性も糞もなく、TDNただの読んでくださる人および執筆者の時間潰しにすぎません。それでも楽しんで頂けると幸いです。

+ +
おせちだよ~
図1:上はほかの皆様の記事、下は僕の記事
+ +

作るゲーム

+ +

今回は、脱出ゲームを作ってみようと思います。

+ +
図2:ゲーム画面の予定
+ +

今回のRTAのレギュレーション

+ + + +

準備

+ +

まずはプロジェクトを作りましょう。Unity Hubから新規作成→2D→任意で名前変更→作成で作れます。
次に、画像を自作します。ペイントがおすすめです。

+ +

ゲームの方針

+ +

軽い謎を解いて鍵をゲットし部屋から脱出する感じです。

+ +

実装方法

+ +


タイトル・本編・クリア画面の3つのシーンをSceneManagerを使って遷移させてやる感じです。また、アイテムの表示・非表示はオブジェクトの座標を画面外に移すことで疑似的に実行しています。

+ +

できた

+ +

後でドライブにzipファイルを置いておきます。

+ +
図3:ゲーム画面
+ +

完走した感想(俄並感)

+ +

じつは実装しているうちに、GameObjectを非表示にするとアタッチしているスクリプトが無効になるといった仕様に悩まされ方針を変更せざるを得なくなりました。
また、最近Unityに触れる機会がなかったので、いい練習の機会になったと思いました。
最後に、ゲーム作るのは大変でした。

+ +

謎解き

+ +

本編です。

+ +

1213①②16③④
④⑤⑥22⑦②⑧

+ +

⑥④⑦⑤er④→?

+ +

ヒント1:僕は22です(年齢じゃないよ)

+ +

ヒント2:①~⑧に入るのは数字ではなくアルファベット

+ +

ヒント3:このイベントはずばり…?

+ +

答え:mystery

+ diff --git a/src/content/blogs/590/2021-12-22-1-1024x683.png b/src/content/blogs/590/2021-12-22-1-1024x683.png new file mode 100644 index 0000000..042f8f2 Binary files /dev/null and b/src/content/blogs/590/2021-12-22-1-1024x683.png differ diff --git a/src/content/blogs/590/game1.png b/src/content/blogs/590/game1.png new file mode 100644 index 0000000..33a4107 Binary files /dev/null and b/src/content/blogs/590/game1.png differ diff --git a/src/content/blogs/590/osechi2.jpg b/src/content/blogs/590/osechi2.jpg new file mode 100644 index 0000000..0af7c1e Binary files /dev/null and b/src/content/blogs/590/osechi2.jpg differ diff --git a/src/content/blogs/611.mdx b/src/content/blogs/611.mdx new file mode 100644 index 0000000..54aaffd --- /dev/null +++ b/src/content/blogs/611.mdx @@ -0,0 +1,117 @@ +--- +title: Live2Dを触ってみた +description: | + この記事はOUCC Advent Calendar 2021の24日目の記事です。イブですね。イベント開催することで24日の予定を阻むFGOの運営の気持ちがよくわかる日になりました。いかがお過ごしでしょうか?前回は、かき氏の「Reactで時間割アプリを作ってみた」でした。 + + 私が書いた記事は、前回はGANについて、前々回はOpenCVについて、前々々回はUnityについて書くといったように毎回分野を変えて記述しているので、今回はLive2Dについて記述していこうと思います。 +author: member +tags: [advent-calendar] +--- +import Image from "@/components/common/Image.astro" +import E_chan_gif from "./611/123530619-7b7e9b00-d737-11eb-83cc-0bfd10d8c3be.gif" +import live2dten from "./611/live2dten.png" + +{/* wp:paragraph */} +

この記事はOUCC Advent Calendar 2021の24日目の記事です。イブですね。イベント開催することで24日の予定を阻むFGOの運営の気持ちがよくわかる日になりました。いかがお過ごしでしょうか?前回は、かき氏の「Reactで時間割アプリを作ってみた」でした。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

私が書いた記事は、前回はGANについて、前々回はOpenCVについて、前々々回はUnityについて書くといったように毎回分野を変えて記述しているので、今回はLive2Dについて記述していこうと思います。

+{/* /wp:paragraph */} + +{/* wp:heading */} +

~あらすじ~

+{/* /wp:heading */} + +{/* wp:paragraph */} +

自分の描いた絵が動くと嬉しいですよね。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

というわけで、Live2Dやったことないけどやってみました。

+{/* /wp:paragraph */} + +{/* wp:heading */} +

~キャラについて~

+{/* /wp:heading */} + +{/* wp:paragraph */} +

今回動かすキャラは、「Angel-Rein」ちゃんです。
春のハッカソンで「嫌われているE-Learningを擬人化して対話することで好きになろう企画」の自然言語で会話する対話Botを作成することになりました。
その時に、新しいキャラを制作することが好きな私がデザインしたのがReinちゃんです。
マフラー付けて冬っぽい服装ですが、考案したのは春で、描いたのは夏ごろです。

+{/* /wp:paragraph */} + +{/* wp:image {"id":627,"sizeSlug":"full","linkDestination":"none"} */} +
名前の由来は、E-Learningのアナグラム
+{/* /wp:image */} + +{/* wp:paragraph */} +

デザインやキャラの詳細については、ここを参照してください。(別ページへ飛びます。)

+{/* /wp:paragraph */} + +{/* wp:heading */} +

~出来たもの~

+{/* /wp:heading */} + +{/* wp:paragraph */} +

※読み込みに時間がかかるかも。お許しを

+{/* /wp:paragraph */} + +
ここに画像が表示されるはず +
ランダムAというデフォルトで用意されているアニメーションを再生したもの
+
+ +{/* wp:paragraph */} +

▼表示されない方はこちらから(高画質版)

+{/* /wp:paragraph */} + + +{/* wp:html */} + +{/* /wp:html */} + +{/* wp:paragraph */} +

又はようつべリンクから

+{/* /wp:paragraph */} + +{/* wp:heading */} +

~感想~

+{/* /wp:heading */} + +{/* wp:paragraph */} +

むずい! 正直Blenderの方が簡単とさえ思えました。というか実際Blenderの方が簡単だと思います。
3Dを絵を変形させて表現するというのが難しい。
ここがこう回転すればこうなるといったようなことを頭の中で考えながら作成しなければならず、立体図形把握能力が求められる作業だと感じました。

+{/* /wp:paragraph */} + +{/* wp:image {"id":618,"sizeSlug":"full","linkDestination":"none"} */} +
+{/* /wp:image */} + +{/* wp:paragraph */} +

見てください、この点の数!たった腕を動かすだけでこれだけのキーを打ち込まなければなりませんでした。(もっと賢い方法はあるのかもしれませんが)
袖が動いて前と後ろが切り替わる所とか、それによって袖がどう動くかとか、腕がより俯瞰した位置ならどう見えるかなどなど考えて動かすとこうなりました。
Blenderなら立体図形を作成してしまえば、動き方に応じて図形を編集する必要は無いですが、live2dは立体図形は手元にないけど図形を動かすとこう見えるだろうという予測を立てなければならないです。
もっとも可動範囲を狭くする、例えば腕の振れ幅を10度だけにする、顔もほんのちょっとしか動かないとかいったことをすれば簡単になると思いますが、回転や拡大縮小以外の複雑に変形しながら動く場合には、それだけで数時間飛ぶ作業量を要求されたりします。
あと、原画はキャラ設定画像としてなるべく正面で描いた絵なのですが、少し見栄えよく見せようと顔が傾いていたりします。これのせいで、対称編集が出来ないといった書く段階で知りたかった事柄も相まって難易度を底上げしてしまったようです。
物理演算を入れる作業については、あまり細かいところを気にしなかった(気にしている余裕がなかった)からか、結構楽々に設定することができました。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

しかし、この図形を想像しなければいけない部分とかどうにかならないのでしょうか。真に絵を描ける人はこの辺の能力が高いのかもしれませんね。
昔Live2D Euclidとかあって、自分の絵を3D化できるという話を聞いて心躍ったのですが、あれはどうやら既に公開停止になっているようです。何が原因で頓挫したのかは分からないですが、上手くいけばメタバース時代の覇権を握れたかもしれないと思えるだけに残念です。
それにしても、世の中のVtuberはLive2dであそこまで動かせてすごいんだなぁ~って今回作成してみて感じました。

+{/* /wp:paragraph */} + +{/* wp:heading */} +

~総括~

+{/* /wp:heading */} + +{/* wp:html */} +

Blenderではなく、Live2Dを使用する場面というのは恐らく以下の場面でしょう。

+
    +
  1. あまり動かさない、又は動く部位が回転や拡大縮小といった単純な変形で構成されることが多い場合

  2. +
  3. 絵を動かしたい、又は3Dの見た目は好きじゃない、3Dでは表現できないデザインを動かしたい場合

  4. +
+{/* /wp:html */} + +{/* wp:paragraph */} +

少しでもご参考になれば幸いです。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

筆者:上月さん

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

+{/* /wp:paragraph */} diff --git a/src/content/blogs/611/123530619-7b7e9b00-d737-11eb-83cc-0bfd10d8c3be.gif b/src/content/blogs/611/123530619-7b7e9b00-d737-11eb-83cc-0bfd10d8c3be.gif new file mode 100644 index 0000000..1ac2078 Binary files /dev/null and b/src/content/blogs/611/123530619-7b7e9b00-d737-11eb-83cc-0bfd10d8c3be.gif differ diff --git a/src/content/blogs/611/live2dten.png b/src/content/blogs/611/live2dten.png new file mode 100644 index 0000000..9f2cb94 Binary files /dev/null and b/src/content/blogs/611/live2dten.png differ diff --git a/src/content/blogs/611/randomPose8fps1200.gif b/src/content/blogs/611/randomPose8fps1200.gif new file mode 100644 index 0000000..7e3895a Binary files /dev/null and b/src/content/blogs/611/randomPose8fps1200.gif differ diff --git a/src/content/blogs/659.mdx b/src/content/blogs/659.mdx new file mode 100644 index 0000000..b84b843 --- /dev/null +++ b/src/content/blogs/659.mdx @@ -0,0 +1,150 @@ +--- +title: fishshellを触ってみた +description: | + 本記事のタイトルにも書いてある通りfishshellについて話していこうと思います。本記事は調べたらそのまま出てくるような内容をまとめたような形になってしまうかもしれないですが、そのような場合は温かい目で見守ってください。 + + shell + + まず、shellとはざっくりいうと自身がPCに対して行ってもらいたい命令をOS対して出すプログラムのことです。そしてshellにはいくつか種類があり、たとえばbash,tcsh,zshなどがあります。それらには当然のように機能の面において違いがあります。今回話そうとしているfishとはそのようなshellのうちの一つです。 +author: member +tags: [advent-calendar] +--- +import Image from "@/components/common/Image.astro" +import publicdomainq from "./659/publicdomainq-0016115svg.jpg" +import sample1 from "./659/sample1-1024x562.png" +import sample2 from "./659/sample2-1024x482.png" +import fish2 from "./659/fish2-860x491-1.jpg" +import fish3 from "./659/fish3-860x491-1.jpg" +import Screenshot from "./659/スクリーンショット-2021-12-25-15.32.41-1024x716.png" + +{/* wp:paragraph */} +

執筆者:NamiFuji

+{/* /wp:paragraph */} + +{/* wp:image {"id":668,"sizeSlug":"full","linkDestination":"none"} */} +
(フリー素材です)
+{/* /wp:image */} + +{/* wp:paragraph */} +

この記事はOUCC Advent Calendar 2021の25日目の記事です。前回は上月さんの「Live2Dを触ってみた」でした。さて本日はクリスマスです。皆さんは本日はどのようにお過ごしの予定でしょうか?私はこの前買ったパズルを完成させる予定です。人によってはクリぼっちで最悪だなんて言っている人がいますが、私の考えではクリスマスにひとりで過ごすということは全く恥じることではないと思います。なぜかというとクリスマスというのは本来イエス=キリストの誕生を祝うことが目的であるので、そもそもクリスマスに大勢で集まらなければならないと考えること自体が本来の目的とずれているからです。なので一人であるということ自体に対してなんら問題もなく、逆に誰かといなければと考えること自体が周りの考えに振り回されているということになり、それ自体が問題となるからです。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

さて、余談は置いておいて、本記事のタイトルにも書いてある通りfishshellについて話していこうと思います。本記事は調べたらそのまま出てくるような内容をまとめたような形になってしまうかもしれないですが、そのような場合は温かい目で見守ってください。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

+{/* /wp:paragraph */} + +{/* wp:paragraph {"fontSize":"large"} */} +

shell

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

まず、shellとはざっくりいうと自身がPCに対して行ってもらいたい命令をOS対して出すプログラムのことです。そしてshellにはいくつか種類があり、たとえばbash,tcsh,zshなどがあります。それらには当然のように機能の面において違いがあります。今回話そうとしているfishとはそのようなshellのうちの一つです。

+{/* /wp:paragraph */} + +{/* wp:paragraph {"fontSize":"large"} */} +

fishのどこがいいのか

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

さてこれからfishについて話していこうとおもいますが、なぜbashやzshではなくfishなのかと疑問に思う人がいるかもしれません。その理由を端的にいうと、fishは他のshellと比べてとても扱う(カスタマイズをする)のが容易であるからです。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

fishのデフォルトの機能としてシンタックスハイライトの機能がついており、それによってコマンドやオプションが間違っているのか一目で確かめることができます。さらにコマンドを入力する際に過去のコマンド履歴からインタラクティブに補完を見ることもできます。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

補完機能の例

+{/* /wp:paragraph */} + +{/* wp:image {"id":666,"sizeSlug":"large","linkDestination":"none"} */} +
+{/* /wp:image */} + +{/* wp:paragraph */} +

入力時

+{/* /wp:paragraph */} + +{/* wp:image {"id":667,"sizeSlug":"large","linkDestination":"none"} */} +
+{/* /wp:image */} + +{/* wp:paragraph */} +

間違った入力をした時

+{/* /wp:paragraph */} + +{/* wp:paragraph {"fontSize":"large"} */} +

fishの簡単なカスタマイズの方法

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

実行環境:M1mac Monterey

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

1,iterm2かターミナルでfish_configとコマンドを入力する。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

2,ブラウザが開かれるので、そこから設定を行う

+{/* /wp:paragraph */} + +{/* wp:image {"id":662,"sizeSlug":"full","linkDestination":"none"} */} +
+{/* /wp:image */} + +{/* wp:image {"id":663,"sizeSlug":"full","linkDestination":"none"} */} +
+{/* /wp:image */} + +{/* wp:paragraph */} +

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

以上のような簡単な操作だけでもまぁまぁ見た目を変えることができる。

+{/* /wp:paragraph */} + +{/* wp:paragraph {"fontSize":"large"} */} +

fishのカスタマイズ方法

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

さきほどはfishの簡単なカスタマイズ方法を説明しましたが、この方法ではカスタマイズの自由度がとても狭いです。そのためつぎはさらに自由度の高いカスタマイズ方法について話そうと思います。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

それは~/.config/fish/config.fishファイルに直接設定を書いていく方法です。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

たったこれだけだと、文章として寂しいので私個人が実際にいじった部分をのせようと思います。

+{/* /wp:paragraph */} + +{/* wp:image {"id":665,"sizeSlug":"large","linkDestination":"none"} */} +
+{/* /wp:image */} + +{/* wp:paragraph */} +

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

現時点の私の設定ファイルは見ての通り、あまり書かれていません。そのためこれからさらに使いやすいように設定ファイルをいじるのが私の目標です。

+{/* /wp:paragraph */} + +{/* wp:paragraph */} +

今までに述べた方法以外にも、プラグインを入れるというカスタマイズ方法もあります。みなさんもこれを機にfishをつかって、みなさんの使いやすいようにカスタマイズしてみてください。

+{/* /wp:paragraph */} diff --git a/src/content/blogs/659/fish2-860x491-1.jpg b/src/content/blogs/659/fish2-860x491-1.jpg new file mode 100644 index 0000000..7e0bdbd Binary files /dev/null and b/src/content/blogs/659/fish2-860x491-1.jpg differ diff --git a/src/content/blogs/659/fish3-860x491-1.jpg b/src/content/blogs/659/fish3-860x491-1.jpg new file mode 100644 index 0000000..fe3f592 Binary files /dev/null and b/src/content/blogs/659/fish3-860x491-1.jpg differ diff --git a/src/content/blogs/659/publicdomainq-0016115svg.jpg b/src/content/blogs/659/publicdomainq-0016115svg.jpg new file mode 100644 index 0000000..06472ce Binary files /dev/null and b/src/content/blogs/659/publicdomainq-0016115svg.jpg differ diff --git a/src/content/blogs/659/sample1-1024x562.png b/src/content/blogs/659/sample1-1024x562.png new file mode 100644 index 0000000..1992aff Binary files /dev/null and b/src/content/blogs/659/sample1-1024x562.png differ diff --git a/src/content/blogs/659/sample2-1024x482.png b/src/content/blogs/659/sample2-1024x482.png new file mode 100644 index 0000000..83ccdc2 Binary files /dev/null and b/src/content/blogs/659/sample2-1024x482.png differ diff --git "a/src/content/blogs/659/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-25-15.32.41-1024x716.png" "b/src/content/blogs/659/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-25-15.32.41-1024x716.png" new file mode 100644 index 0000000..486c049 Binary files /dev/null and "b/src/content/blogs/659/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-2021-12-25-15.32.41-1024x716.png" differ diff --git a/src/content/blogs/775.md b/src/content/blogs/775.md new file mode 100644 index 0000000..3c7c9b8 --- /dev/null +++ b/src/content/blogs/775.md @@ -0,0 +1,38 @@ +--- +title: Oracle Cloudにsign up出来なかった話 +description: | + 結論から言うと出来ました。 + ブラウザの問題でした。 + + ~あらすじ~ + 実は既に自宅にNASで若干サーバーっぽい物構築しているのでそれでいいかなと思ってました。 +author: member +tags: [oracle-cloud] +--- + +

結論から言うと出来ました。
ブラウザの問題でした。

+ + + +

~あらすじ~

+ + + +

実は既に自宅にNASで若干サーバーっぽい物構築しているのでそれでいいかなと思ってました。
しかし無料の演算能力がある鯖が欲しくなって、自宅のは心許ないので、大企業様のOracle社のCloudを使ってみようと思い立ちました。

+ + + +

~苦戦~

+ + + +

様々なサイトを参考にsign upを試みました。
しかしどうも上手くいきません。
何故か東京とTokyoの二つ選択肢があるけどどちらがいいんだろうとか、英語にした方良いのだろうかと試行していました。
その中で一つ分かったことは、電話番号は最初の0は除いて記述することです。
しかしそれだけでは登録できませんでした。
「アカウントの作成には最大で15分かかります」的な表示が出てきてそれ以上進まない。
メールが来るのかと3日間待っても来ないし、chatがあったので、なけなしの英作文能力で質問したら、今審議中で1日かかるよと言われて、結局一日待っても何も起きない。
(最大で15分と書いてあるのに、1日かかると言われるのはこれ如何に)
※Chatは対応してくれるときとしてくれない時があります。2020年4月の一年間無料の締め切り間近の楽天モバイルよりかははるかに対応してくれる印象。

+ + + +

~解決~

+ + + +

私の使っているブラウザのVivaldiが悪いのでは?と思い、KC3冬のハッカソンでデバッグ用にインストールしたChrome Canaryを使用して登録してみました。
その時に違和感が。
Vivaldiの時はメールアドレスを同じやつ何度入れてもメールアドレス検証でエラーを吐かなかったのに、Chromeでは吐いた。
これはもしや...?と思い登録情報を埋めて登録していく...
メールが到着、そこには「Get Started Now with Oracle Cloud」!
秒で届きました。一体今までの苦労は何だったのか。
しかし、ブラウザ間で動作違うってよくありますよね。
実際ChromeとChrome Canaryですら動作異なりますもんね。
だから私はVivaldi、Chrome、Chrome Canary、Firefox、Edge、IE、OperaとかPCに入れてるんですよね。
その日の怒りのノリで書いたこの記事が参考になれば幸いです。

筆者:上月
前回の記事:Live2D触ってみた

+ diff --git a/src/content/blogs/796.md b/src/content/blogs/796.md new file mode 100644 index 0000000..5f284c5 --- /dev/null +++ b/src/content/blogs/796.md @@ -0,0 +1,354 @@ +--- +title: 初学者のためのC# +author: miyaji +description: 初心者向けの基本的なC#の文法を紹介します +tags: + - csharp + - for-beginer + - dotnet +--- + +## C#とは + + C#はC++からJavaになる際に追加されたガーベージコレクション(GC)や中間言語を介して共通の実行環境で実行することなどを参考にMicrosoftが開発した言語です。C#はIL(中間言語)にコンパイル後.Net Framework上で実行されます。この.Net Framewokというのは標準でWindowsにインストールされており、そのためC#とその統合開発環境のVisual Studioを使うことで簡単にWindowsアプリケーションが開発・公開ができます。また、OUCCで主に使用しているUnityというゲーム作成に使われるフレームワークで使用する言語にも採用されています。 + +## 基本的な書き方 + +```csharp +using System; // ファイル内でほかの名前空間のものを完全修飾型名を使わずに使用できるようにする + +namespace Hoge // 名前空間はこうやって宣言する。 +{ + public class Program // 処理は必ずクラスの中に関数を置いて書く + { // 波カッコで範囲を示す + + public int HogeHoge { get { return _hogeHoge; } set { _hogeHoge = value; } } // プロパティの宣言方法 + private int _hogeHoge; // フィールドの宣言方法 + + public static void Main() + { + Console.WriteLine("Hello World"); // 1文の最後は ; (セミコロン)で終わる + var odds = Enumerable.Range(0, 100) + .Where(i => i % 3 == 0) + .ToArray(); // こんな感じで複数行にわたって書くことも可能。 + /* + 複数行コメントはこうやる + */ + } + } +} +``` + +## StructとClass + + 大きく分けてStructとClassの2種類があり、したのようにいろいろ違いはあります。StructはClassよりも動作が早いのですが参照型でないためにおこる様々な問題があるためオブジェクトを自分で定義する際は何か重要な問題がない限りClassで作ることをお勧めします。 + +structとclassの違い + +||struct|class| +|----|----|---| +|オブジェクトの型|値型|参照型| +|データが保存されるメモリ|スタック|ヒープ| +|継承|interfaceの実装のみ|class,interfaceともに可能| +|コンストラクタの定義|引数ありのものだけ可能|なんでも可能| +|nullableか|nullを入れられない|nullを入れられる| + +structの問題点 +- スタックに保存されるのでメモリを多く占有する大きなオブジェクトを入れると逆に遅くなる。 +- 参照型でないので関数やプロパティでとってきたものを変更してももとのオブジェクトを変更できない。(classでは可能) +- 継承ができない +- 引数なしのコンストラクタを作れない +- nullを入れられない + +他の問題を見たい方は[C#に潜むstructの罠](https://techblog.kayac.com/trap-around-struct-in-csharp)などを参考にしてみてください。 + +## よく使う型 + +この中ではstringのみがclassでそのほかはstructです。 + +|エイリアス|実装|リテラル|説明| +|-|-|-|-| +|byte|System.Byte|`0`(収まる範囲内のみ)|符号なし整数(8bit) 主にバイナリデータのために使われます| +|short|System.Int16|`0`(収まる範囲内のみ)|整数(16bit)| +|int|System.Int32|`0`(収まる範囲内のみ)|整数(32bit)| +|long|System.Int64|`0`(収まる範囲内のみ)|整数(64bit)| +|float|System.Single|`0f`|小数型(32bit)| +|double|System.Double|`0.0`又は`0d`|小数型(64bit)| +|decimal|System.Decimal|`0m`|小数型(128bit)| +|bool|System.Boolean|`true, false`|真偽値(2bit)| +|char|System.Char|`'j'` (シングルクォーテーションで囲む)|UTF-16の文字(16bit)| +|string|System.String|`"java"` (ダブルクォーテーションで囲む)|UTF-16の可変長文字列| + +### 使用例 + +```csharp +int x = 1; +var x = 1; // varキーワードを使えば自動的に型を推測してくれる +System.Int32 x = 1; // こう書くこともできるが普通はしない +``` + +### 詳細(Microsoft公式ページ) + +- [整数値型](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/integral-numeric-types) byte, short, int, long +- [浮動小数点数値型](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types) float, double, decimal +- [真偽値型](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/bool) bool +- [文字型](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/char) char +- [文字列型](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/reference-types#the-string-type) string + +## 配列 + +C#で配列はclassであり、大きさは定義時に決定されます。書き方は以下の通りです。 +```csharp +int[] arr = new int[5]; //大きさ5の配列 +string[] arr = new string[] { "a", "b", "c", "d", "e" }; //このように書いて初期化することも可能です。 + +var temp = arr[0]; //このように書くことで配列の要素にアクセスできます。 +``` + +### 多次元配列 + +`int[,]` `int[,,]`のように書くことで多次元配列を作れます。たとえば`int[3,4]`とすると3×4多次元配列になります。 + +### ジャグ配列 + +`int[][]`のように書くことでジャグ配列(ギザギザ配列)を作れます。これは配列の配列となっているので内側の配列の要素の数はそれぞれ違っても構いません。 + +## 演算子 + +定番の`+ - * / %(余り)`はありますが、pythonにはある累乗の`**`はありません。また、静的型付け言語なので以下のような整数同士の割り算は小数点以下が切り捨てられます。どちらかをdoubleにキャストしましょう。 +```csharp +int a = 10; +int b = 3; +int result = a / b; // 3 +double result = (double) a / b // 3.333... +``` +また、自分自身に`+ - * / %`を行う`+= -= *= /= %=`や、自分自身に1だけ足したりひいたりする`++ -- `などもあります。 +```csharp +int i = 0; +i += 1; //これは +i = i + 1; //これと同等 + +i++; //これは +i = i + 1; //これと同等 +``` +比較演算子として`< <= > >= == !=`があります。これらは前後のオブジェクトを比較して真偽値(`bool`)を返します。`<= >=`は数学における`≦ ≧`に相当し、`== !=`は数学における`= ≠`に相当します。また、`&& ||`はそれぞれ真偽値における論理積・論理和をあらわし、`!`は真偽値の直前につけることで真偽値を反転させることができます。 + +※論理積 二つともが`true`のとき`true`を返す +※論理和 二つのうち一方が`true`のとき`true`を返す。 + +## ifとかforとか + +### 条件分岐 + +C言語と違い条件式に指定できるのは真偽値だけです。`if`ステートメントと`switch`ステートメントが実装されており、詳しくは[Microsoft公式](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/statements/selection-statements)に書いてあります。 + +```csharp +int x = 10; +if(x < 0) +{ + //ここに処理を書く +} +else if (x < 10) { /* else ifを使うことでいくつものパターンに対応できる */ } +else + return 0; // 終わるときはelseで終わる。1文で終わるなら 波カッコ{} は不要 + +switch(x) //たくさんの条件で分岐したいときに使う +{ + case 10: // xが10の時の処理 + break; + case 20: // xが20の時の処理 + break; + default: // xが上のすべてと異なったときの処理 + break; +} +``` + +### 繰り返し + +C#には繰り返しの処理として`for`ステートメント, `foreach`ステートメント, `while`ステートメント, `do-while`ステートメントが実装されています。[Microsoft公式](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/statements/iteration-statements)を見るとここより詳しい情報を得られます。 + +```csharp +for(var i = 0; i < 100; i++) // (初期化処理 ; 終了条件 ; ループが終わるごとに実行される) +{ + // 処理を書く +} + +var arr = new int[]{ 0, 1, 2, 3, 4 }; +foreach(var item in arr) //コレクションのループ +{ + item++; +} +foreach((var item, var i) in arr.Select((num, index) => (num, index))) //インデックス付きのコレクションのループ +{ + item += i; +} + +while(true) +{ + // 条件を満たす間繰り返す。 +} +do +{ +  // 最初の一回実行され後条件を満たす間繰り返す。 +}while(true) +``` + +## デリゲート + +C#では関数オブジェクトを格納するものとして`delegate`というもがあり、下のように定義し、使うことが可能です。 +```csharp +public delegate string Hoge(int x);//引数がint型 返り値がstring型の関数型Hoge + +public class Program +{ + public static void Main() + { + Hoge func = new Hoge(Foo); //クラスをインスタンス化するときみたいにかける。 + Hoge func = Foo; //こうもかける。 + } + + public static string Foo(int x) + { + return x.ToString(); + } +} +``` +このように定義できますが、実際は`Func`と`Action`を使うことが多いです。この2つはジェネリクスを用いて(厳密には違いますが)下のように定義されており、どんな型でもその場で指定して入れることができるので大変便利です。 +```csharp +public delegate void Action(T1 arg); //Actionは返り値がvoid +public delegate TResult Func(T1 arg1, T2 arg2); //Funcは返り値がTResult(最後の型) + +//使い方 +public class Program +{ + public static void Main() + { + Func func = Foo; //こんな感じで書けます。 + } + + public static string Foo(int x, int y, int z) + { + return x.ToString(); + } +} +``` + +## コレクション + +コレクションはデータをまとめて扱うためのクラスでジェネリクスなしのものは`System.Collection`名前空間に、ジェネリクスありのものは`System.Collection.Generics`名前空間にあります。代表的なコレクションはリストと辞書型があります。 + +### リスト + +リストは可変長配列のようなもので、配列とは違い検索メソッドやソートメソッドが実装されてたりします。 +```csharp +var arr = new List(); +arr.Add(3); //Addで追加 +var temp = arr[0]; //これで中身を見る +arr.Remove(3); //引数と最初に一致したものを削除 +``` +詳細は[Microsoft公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1?view=net-6.0)で確認してください。 + +### 辞書型 + +辞書型はキーと値をセットで保持することができるコレクションです。 +```csharp +var dic = new Dictionary(); +dic.Add("key", "value"); //Addで追加 +var temp = dic["key"]; //これで取得 +dic.Remove("key"); //引数と一致したキーを持つ値を削除 +``` +詳細は[Microsoft公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2?view=net-6.0)で確認してください。 + +## プロパティ + +プロパティはclassやstructのメソッドをあたかもフィールドであるかのように扱う機能です。 +```csharp +public class Hoge +{ + public int Number + { + get + { + return _number; + } + private set // アクセス修飾子を片方だけ変えることが可能 + { + if(value < 0) // 入ってきた値は valueキーワード に格納されている + value = 0; + _number = value; + } + } + private _number; + + public int Id { get; private set; } // getとsetだけ書いて中身は書かないとコンパイル時に + public int Id { get{ return _id; } set{ _id = value; } } // これみたいに展開される + private int _id; + + public void HogeHoge() + { + Number = 10; //setプロパティが呼ばれる + } +} +``` +フィールドではなくプロパティで実装することのメリットはset時に制約をつけたりget時にnullの場合などで条件分岐したりできることがあります。また、`interface`にはフィールドは定義できないですがプロパティは実際は関数なので定義できます。 + +## 名前空間 + +C#ではコードを名前空間で分割することができす。下のようにクラスやメソッドと同じように宣言することができます。名前空間では同じ名前空間にあるもの、または`using`を使って宣言したものだけが制限なく使えます。別の名前空間のものを使用する際は`A.Hoge`のように名前空間から指定するか`using A;`という文言を書いておく必要があります。 +```csharp +using System; +namespace A +{ + public class Hoge + { } +} +``` + +## yield return + +`yield return`で値を返すことで簡単に`IEnumerator`を作ることができます。`return`の代わりに`yield return`を使うと`IEnumerator`が自動的に生成され、`foreach`ステートメントで使用できます。 +```csharp +public static void Main() +{ + foreach(var i in GetEnumerator()) + { + // 処理 + } +} + +private static IEnumerator GetEnumerator() +{ + int i = 0; + while(true) + { + yield return i++; + } +} +``` +UnityではCoroutineという機能で使わています。 + +## 継承 + +C#はオブジェクト指向の言語なので継承が実装されています。継承とはあるクラスから性質を受け継いだ新しいクラスことで、派生とも呼ばれています。例としては以下のようなものがあります。 +```csharp +class Person +{ + public string name; // 名前 + public int age; // 年齢 +} + +class Student : Person +{ + public int id; // 学籍番号 +} +``` +[継承 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/oo_inherit.html)より + +時間がなかったので継承はあとで書きます。 + +## 参考させていただいたサイト + +- 構造体(struct)とクラス(class)の違い + https://www.sejuku.net/blog/59663 +- 継承 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C + https://ufcpp.net/study/csharp/oo_inherit.html diff --git a/src/content/blogs/806.md b/src/content/blogs/806.md new file mode 100644 index 0000000..e4eca5f --- /dev/null +++ b/src/content/blogs/806.md @@ -0,0 +1,113 @@ +--- +title: 3Dモデルの調整をしながらVRChat用モデルからVRMへ効率良く変換する +author: member +description: | + この記事は多分OUCCアドベントカレンダーの最終日の記事になります。 + プロローグは暇な人だけ読んでね + それ以外の人は本題へ + ~プロローグ?~ + ~3Dモデル制作以前 + 去年のハッカソンでは、何かと不満を言われるE-Learningと和解しようという企画にて、自然言語で会話できるBotを制作しました。その過程で会話相手として、E-Learningの化身、angEL-reinちゃん(名前はE-Learningのアナグラムから)が生まれました。 +tags: [advent-calendar, csharp, unity, vrm, vrchat] +--- + +この記事は多分OUCCアドベントカレンダーの最終日の記事になります。 + +プロローグは暇な人だけ読んでね + +それ以外の人は[本題](#本題)へ + +## ~プロローグ?~ + +### ~3Dモデル制作以前 + +去年のハッカソンでは、何かと不満を言われるE-Learningと和解しようという企画にて、自然言語で会話できるBotを制作しました。
+その過程で会話相手として、E-Learningの化身、angEL-reinちゃん(名前はE-Learningのアナグラムから)が生まれました。私が生みました(生産者表示)
+この名前微塵も流行らず、代わりにいーちゃんと呼ばれているのですが、このいーちゃんを音声で入出力して会話できるようにして学祭に出そうという話になりました。そこで私はRustサーバーを作って非常に遅い言語生成処理の高速化を行ったりしたわけですが、そんな話は今回どうでも良く、それよりやはり音声での会話をするならば、会話する相手が見えた方がいいですよね?古来より偶像崇拝があるように概念を相手にするよりかは、視覚的に見えるものを相手にした方が良いに違いない。
+というわけで、れいんちゃんの3D化計画を極秘裏に進めました。
+以前の記事で既にLive2D化した話はしましたが、我慢できずに3D化に踏み切ってしまいました。 + +### 3Dモデル完成(仮)まで + +まずVROIDで素体を生成し、Blenderで服などを制作しました。
+私は3Dモデルを作るのはこれで2回目なので初めてというわけでは無いですが、やはりそれなりに苦戦はしました。特に前回と同様ウェイトペイントでは常に苦戦させられ、今回も最後まで難敵となりました。
+まあ兎に角色々あってFBXモデルが完成しました。
+VRChatに出したかったのでまずVRChat用の改変をしつつシェーダの調節をしていきました。
+その結果完成したのがこちら + +![](./806/354419281815302673.png) + +![](./806/1613480438549804970.png) + +![](./806/4228700505022295435.png) + +ちなみに私は目にこだわる人なので、目は虹彩を奥に配置し、反射光を前面に出すなど立体的にしています + + + + +その後単眼カメラによる姿勢推定アプリを制作する、又はキャラクタを後世の人に使ってもらうためにVRMモデルへの変換を行いました。 + +## 本題 + + Blenderで制作して完成したと思っても、実際に動かしてみたりするとウェイトペイントが上手くいってなくて服が突き抜けたり、頂点にウェイトが割り当てられてなかったり、テキスチャがおかしかったりと、様々な問題が発生してBlenderでの修正を再三に迫られる場面は多いです。
+ そのためにBlender側ではLazy Weight Toolなどを使って個々の頂点についてウェイトを塗りなおしたりして修正したものを出力してUnityに読み込ませます。そのUnityへ読み込ませる際にちょっとした工夫をすると作業量を緩和できます。 + +## fbxファイルのBlender→Unity + + fbxファイルをunityに読み込むと、モデルをScene上に配置できるようになります。VRChatを想定した場合、その配置したモデルにPhysboneなどのコンポーネントを設定していくことになります。
+ しかしこの方式では、後で修正をかけたモデルで上書きして読み込む際にfbxファイルと共にScene上のオブジェクトもリセットされてしまい、またコンポーネントの設置などをしなければならなくなります。
+ これでは非常に非効率なので、fbxファイルを上書きで読み込んだ際にScene上のオブジェクトのコンポーネントがはがれないようにしたいです。 + + そんな時に便利なのがPrefab Variantです。
+ Projectビューからfbxファイルを右クリック→Create→Prefab Variantで生成できます。
+ この生成したものをドラッグアンドドロップでSceneに配置してコンポーネントを張り付けてみてください。
+ こうすることでfbxファイルを上書き更新しても、Scene上のモデルだけが更新され、コンポーネントは剥がれなくなります。 + +![](./806/01-300x258.png) + +## VRChatモデル→VRMモデル + +基本的には [VRM Converter for VRChat](https://booth.pm/ja/items/1025226) を使用しますのでこれを既にUnityへインポートしている前提で記述します。 + +### 初めてのexport + + まず変換するVRChatモデルを選択した状態でツールバーのVRM0→Export VRM file from VRChat avatarで適当に入力してAssetディレクトリ内に用意したフォルダ(フォルダ1)にexportします。
+ この際もしかしたら未使用シェイプキーにチェックを入れてexportした方がいいかもしれません。
+ 兎に角これでフォルダ1内にVRMファイルとそのprefabが生成されます。エラーが出ても、何も変えずにもう一度実行すると何故かうまくいったりします。
+ Unity上だけで表情やマテリアル、SpringBoneなどの設定を変更するくらいなら、そのPrefabをSceneに配置・編集して、そのモデルを選択した状態でツールバーVRM0→export to VRM0でフォルダ1に出力すると、フォルダ1のVRMを上書き修正することができます。 + +![](./806/02-300x198.png) + +### 2回目以降のexport + +1.  モデルを変更した場合、またVRChatモデルからVRMへの変換をする必要があります。
+  この変換においてVRM0→Export VRM file from VRChat avatarで出力する場所はフォルダ1とは異なるフォルダ2へ出力した方が良いです。
+  何故なら、フォルダ1に出力してしまうとせっかく以前に設定した表情や物理などのコンポーネントが上書きされてしまうからです。
+  この時、フォルダ1には旧、フォルダ2に新モデルが入っていることになります。 +2.  生成された新モデルのPrefabファイルをSceneにドラッグアンドドロップで配置。 +3.  ツールバーのVRM0→Open CopyVRMSetting Wizardで以前のデータからSpringBoneや表情などの情報を新モデルへコピーします。
+  この時に、Sorceにはフォルダ1の旧Prefabアセット(Projectビュー上)を選択し、Destinationには新モデルオブジェクト(Sceneビュー上)を選択しないとエラーが出ます。
+  ここまででコピーできていないのはマテリアルのみです。 +4.  マテリアル情報を新モデルにコピーしていくのですが、使用マテリアルが多ければ多いほどこの作業が非常に面倒です。
+  よってそれをやってくれるツールを自作しました。
+  ここ(https://github.com/sachsen/TransferInspectorMaterials) から.csファイルを入手して、readmeに書かれている通りに導入してください。 +5.  ツールバーTools→Open Inspector Material Transfer Windowとします。
+  sizeにコピーするSkinnedMeshRendererの数を入力し、Sorceにコピー元の、Destinationにコピー先のSkinnedMeshRendererを指定してCopy!ボタンを押すとマテリアル情報がコピーされます。なお、マテリアル自身は複製されません。 +6.  新しいモデルを選択してツールバーVRM0→export to VRM0でフォルダ1へ出力、上書きします。
+  これでVRMファイルが新しくなって置き換わります。 + +![](./806/03-300x230.png) + +## 完成 +3Dモデルはこちらからぐりぐり見れます。 +https://hub.vroid.com/characters/7942564502413041514/models/2799418893141239533 +文化祭での様子 + + + +もっといい方法があるかもしれないですが、私はこの方法でやりました。 + +よければお使いください。 + +著者:上月 diff --git a/src/content/blogs/806/01-300x258.png b/src/content/blogs/806/01-300x258.png new file mode 100644 index 0000000..9a63d0d Binary files /dev/null and b/src/content/blogs/806/01-300x258.png differ diff --git a/src/content/blogs/806/02-300x198.png b/src/content/blogs/806/02-300x198.png new file mode 100644 index 0000000..5a24362 Binary files /dev/null and b/src/content/blogs/806/02-300x198.png differ diff --git a/src/content/blogs/806/03-300x230.png b/src/content/blogs/806/03-300x230.png new file mode 100644 index 0000000..f4e5303 Binary files /dev/null and b/src/content/blogs/806/03-300x230.png differ diff --git a/src/content/blogs/806/1613480438549804970.png b/src/content/blogs/806/1613480438549804970.png new file mode 100644 index 0000000..9a1b4bf Binary files /dev/null and b/src/content/blogs/806/1613480438549804970.png differ diff --git a/src/content/blogs/806/354419281815302673.png b/src/content/blogs/806/354419281815302673.png new file mode 100644 index 0000000..91a324c Binary files /dev/null and b/src/content/blogs/806/354419281815302673.png differ diff --git a/src/content/blogs/806/4228700505022295435.png b/src/content/blogs/806/4228700505022295435.png new file mode 100644 index 0000000..c661669 Binary files /dev/null and b/src/content/blogs/806/4228700505022295435.png differ diff --git a/src/content/blogs/835.md b/src/content/blogs/835.md new file mode 100644 index 0000000..47fec72 --- /dev/null +++ b/src/content/blogs/835.md @@ -0,0 +1,86 @@ +--- +title: OUCC の 3 年間を振り返る [前編] +description: | + 執筆者: watamario15 (2022 年度部長) + + これは OUCC Advent Calendar 2022 の 1 日目の記事です。明日は中編をお届けします。 + + 今年もこの季節がやって参りました。部室を手放した昨年からもう 1 年経つのですね。課題に追われる日々は、本当に過ぎ去るのが早いものです。さて、今日は、私が在籍していたこの 3 年間、OUCC がどのような事態に陥り、変遷を遂げてきたかをまとめておきたいと思います。先に言っておきますが、かなりの長文になります。どこの団体でもそうだと思いますが、OUCC も例に漏れず、色々な危機に瀕することとなりました。 + + OUCC とは + 初日ですので、ざっくりと OUCC の紹介をしておきます。 +author: member +tags: [advent-calendar] +--- +執筆者: [watamario15](https://github.com/watamario15) (2022 年度部長) + +これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859) の 1 日目の記事です。明日は中編をお届けします。 + +今年もこの季節がやって参りました。部室を手放した[昨年](/blog/490)からもう 1 年経つのですね。課題に追われる日々は、本当に過ぎ去るのが早いものです。さて、今日は、私が在籍していたこの 3 年間、OUCC がどのような事態に陥り、変遷を遂げてきたかをまとめておきたいと思います。先に言っておきますが、かなりの長文になります。どこの団体でもそうだと思いますが、OUCC も例に漏れず、色々な危機に瀕することとなりました。 + +## OUCC とは +初日ですので、ざっくりと OUCC の紹介をしておきます。 + +OUCC は、[大阪大学文化系公認団体](https://www.osaka-u.ac.jp/ja/campus/circle-club/kounin)「[コンピュータクラブ](https://oucc.org)」の略称です。「コンピュータに関連する多種多様な事柄を通じ、部員相互の技能向上、並びに親睦を図り、もって人格形成に寄与し、健全な学生としての成長を促す」が設立の目的です。...要するに、コンピュータ関連の活動は大体何でも対象としています。部の運営に一定の人手が必要であることと、イベントなどに誰も参加しないと悲しいことになってしまうこととで、参加必須となるような活動もいくつかありますが、基本的には何をするか、あるいは何もしないかというのも自由な緩いクラブです。 + +学祭などの行事を除き完全オンラインで活動しています。部費は、サーバ代やドメイン代などの設備維持のため、年間 2000 円ほど頂いています (十分格安だと期待しています)。部員数は 25 人ほどで、学部は情報系がほとんどという訳でもなく、文系含め様々な学部の人が所属しています。入部には阪大生であることと部費の納入が必要ですが、活動場所自体は[公開の Discord サーバー](https://discord.gg/jBM2NP7ZxK)を使用しており、大阪大学の関係者ですらなくとも (荒らしやスパムでなければ) 誰でも参加可能なので、興味のある方は是非覗いてみてください。 + +なお、OUCC はそれなりに歴史があるクラブであることが知られています。普通、こう言う話には設立年が併記されるものですが、できません。記録が残っていないのです。一体何故なのでしょうか... 一応、1985 年ごろの OUCC の OB と名乗る方が新聞記事で取り上げられていたことから、1985 年時点ではすでに存在していたことが示唆されているものの、やはり具体的にいつ設立されたのかは謎のままです。 + +## 2020 年度 +2020 年度は、COVID-19 のパンデミックが発生した年であり、また[私が大阪大学基礎工学部情報科学科に入学した](https://gist.github.com/watamario15/b57dc1a9698e1b489c1a518f5d6a5905)年でもあります。中学でブラッククラブに所属していたという黒歴史を抱えていることと、他人に何かをやらされることが基本的に嫌いなため、クラブ・サークルへの参加には消極的でしたが、コンピュータに興味は持っていたため調べていたところ、OUCC を発見しました。講習会をやるとあったので、面白そうだなと思い Discord 新歓サーバー (前節で紹介した公開サーバーと同じ。当時は新歓用だった。) に入りました。その後、講習会、(3 週間の) ハッカソンイベントを経て、自由な雰囲気なら悪くなさそうだと思い入部しました。当時の入部金は 5000 円でした。 + +ちなみに、ハッカソン (3 週間をハッカソンと呼んでいいかどうかは疑問だが) では「通」というテーマがあり、C# によるチャットアプリ、AI とのチャットアプリ (うろ覚え)、音ゲー、アクション RPG が開発され、私は「C# によるチャットアプリ」に所属しました。まあ、「多さ課題が苦」で知られる大阪大学定番の課題地獄の真っ最中だったこともあり、一応の完成を見たのは前者 2 つだけでしたが... + +![C# によるチャットアプリの動作画像](./835/messaging.jpg) + +### KC3 2020 (9 月) +例年通り、[KC3 2020](https://kc3.me/news/171/) に参加しました。私が以前を知らないので何とも言えないですが、COVID-19 パンデミック前の 2019 年度までは対面実施だったものがオンライン開催となったようです。私はあくまでも受講生としての参加でしたが、OUCC としては「[HerokuでLINEとDiscordをつないでみよう](https://kc3.me/study/137/)」と「[経験ゼロからウェブページを作ってみよう](https://kc3.me/study/148/)」と「[3DCG入門](https://kc3.me/study/151/)」を出していました。 + +### 他大学との連携 (9 月) +さりげなく [ANU CSSA](https://cssa.club) と緩やかな関係 (実質的に、相互の Discord サーバーに部員が参加し合っているだけ) を構築しているのですが、それが始まったのがこの年です。8 月末に相手方からメールで連絡があり、面白そうだということで関係を結ぶことにしました。不思議なことに、当時新入部員であった私がいつしか主導していました。最初は[競プロイベント](https://www.hackerrank.com/cssa-x-oucc-contest)を開いたのですが、それ以降は交流案もなく、緩やかな関係に留まっています。まあ、それでも相手方の運営方針、活動状況、文化、英語圏 (のインテリ層) から見た現況など、色々と学べることは多いので有意義ではあると思っています。 + +### 夏の勉強会 (9 月) +COVID-19 下だからといって活動を何もしないという訳にはいかないので、オンラインで勉強会が開かれました。とはいっても、何人かのグループを作り、期日までに何かの技術を学んで報告資料を作成する、といった感じでした。自分は Python をやりました。 + +![Python 発表内容](./835/python.png) + +### 財政危機 (10 月) +10 月に入ると、当時の会計から以下のような報告が為されました。 + +![財政危機](./835/finance.png) + +何というか、やばいという言葉だけで片付けてはいけないレベルに致命的です。学生が 42 万をホイホイと出せる訳がありません。そもそも、なぜこんなことになったのでしょうか。鍵になるのは「補助金」「部員数」「学祭」「部室」です。 + +OUCC は、当時部室を学外に所有していました。これは、学内の部室は他の団体と共有になるために高価な PC 等を置きづらい、ネット回線を引きづらい、などが理由としてあったようです。しかし、これの代償は極めて大きく、家賃としてコンスタントに月 5 万が吹っ飛びます。石橋阪大前駅からそれほど離れていない「駅チカ」物件としては破格ですが、それでも全予算を自力で確保する学生団体としてはかなり厳しい額です。 + +しかし、昔は普通に賄えていたようなのです。まず、これは噂の域を出ない (記録が残っていない) のですが、大学から公認団体に対して補助金が出ていた時代があったようです。企業による支援金があったという話もあります。次に、部員数もかつてはかなり多く、100 人いた時代もあったと言われています (これも例によって記録が残っていない)。さらに、年 2 回の学祭の食品模擬店でもかなり (10 万円以上) 儲けていたようです。そういうこともあり、部室を維持できていたようです。 + +ところが、2020 年時点ではそれらがすべて崩れていました。まず、大学からの補助金は皆無で、協賛企業もありません。そして、部員数についても、正確な記録は行われていなかったものの 10 人 + 新入生 6 人程度でした (2 年は何と 1 人)。学祭も感染拡大防止のため中止されました。その結果収入源が無くなり、危機的状況に陥っていたのです。 + +### 部室をどうするか (11 月) +部室の家賃を払えないとなると、その解決策は「部室を引き払う」です。その際問題になるのが部室にある備品ですが、当時の部長が大学の学生センターと連絡を取り、倉庫スペースを貸してもらえるという話がありました。なお、この時点では学内に部室の空きはありませんでした。余りに狭く、本当に最低限しか置けないスペースでしたが、金がない以上仕方ないということで、一旦この方針になりました。 + +しかし、OB の方々とも連絡を取ったところ、部室には思い入れがあるので支援したいという方が何人か現れました。あまり記録はない (なぜ?) ものの、30 年近く借りていたことを示唆する資料もあるので、それだけ部室に思い出を持った方もいたわけです。部員としても、残せるなら残したいというのが本心だったため、何度か話し合いを重ねたのちに、「支援をお願いし、今後様子を見ながら来年 5 月頃にまた再検討する」という結論になりました。結果、多大なる支援を頂くことができ、2021 年までは維持可能な財源を確保することができました (本当に感謝です...)。ここで、事態は「一時的に」収まることになります。 + +ちなみに、部室を維持するようにしたことにより、部費は高額なまま据え置かれました。入部金は 5000 円だったと書きましたが、これは新入部員向け特別価格です。既存部員には前期、後期それぞれ 15000 円でした。~~そりゃぁ部員も減るよ...~~ + +#### 部室環境 +![部室の概観](./835/clubroom.jpg) + +一応、部室の話が出たからには当時の部室がどのようであったかの説明をしておきましょう。まず、立地としては阪急線を挟んで大阪大学豊中キャンパスの反対側にあり、阪急石橋阪大前駅から徒歩 5 分程度の場所でした。部室そのものは 2 階建ての建物の 3 階です。ん?今何か変なことを言いましたか?まあ、画像から薄々察せるかとは思いますが、屋上付きの建物の屋上に置かれたプレハブです。建付けは素晴らしく、全て閉め切ってあるのに台所の下から猫が侵入して鍋で生活していたそうです。夏は屋上からの照り返しで 45℃ を超える暖かさで、一度部室に入ると靴下の裏が埃で真っ白になるなど、環境も快適でした。ちなみにエアコンなんて豪華なものはありません。 + +とはいえ、こう見えて面積は割と広く、色々なところに目を瞑れば駅チカで格安の、学生団体には十分な部室でした。講習会やハッカソンを行ったり、布団があるので泊まる人が居たり、大量のゲーム設備 (後述) で交流を深めたり、と COVID-19 のパンデミック前には大いに活用されていたようです。 + +### Advent Calendar (12 月) +毎年恒例 [OUCC Advent Calendar 2020](https://adventar.org/calendars/5546) が行われました。自分は「[SHARP Brain 用アプリケーションの作成方法](/blog/303)」なる記事を書きました。裏話としては、この内容は今では [Brain Wiki](https://brain.fandom.com/ja/wiki/Brain_Wiki) にあるのですが、それは私が後で Brain Wiki の管理者を引き継いで内容を反映したからであって、丁寧に開発方法をまとめた記事は当時まだありませんでした。部員以外にも、部室の話で (何故か失われていた) OB さんとのコネが復活したため、昔の OB さんも記事を書いてくださいました。~~その割に全然 25 記事に達していないのは内緒。~~ + +### 金曜部室 (1 月) +COVID-19 によって活動がかなり縮小したことが懸念事項となり、その解決策が話し合われました。その結果、金曜日の夜に Discord に集まって交流会をしたり雑談会をしたりといった緩い集会を開き、部員同士の交流を維持しようとする試み「金曜部室」が始まりました。これは、時期に合わせて履修相談会にしたり LT 会を開催したりと一定の成功を見せ、ネタが無くなってマンネリ化した 2021 年度の終わりまで続きました。 + +なお、これ以前にも一時的に「もくもく会」が木曜日に開かれていました。目的ややることも概ね似ていたため、金曜部室はある意味でそれの再興ともいえます。 + +## まとめ +2020 年前半については自分の入部前だったりして曖昧な情報しかない ~~(というかほぼ自分語り)~~ ですが、それでもオンライン活動への移行や財政再建など、激動の 1 年でした。まさかコンピュータクラブがこんな状況に陥っていようとは、誰が予想しただろうか... まあ、国際的な関係構築など、良い面もありましたが。 + +前編はここまでです。続きは [OUCC の 3 年間を振り返る [中編]](/blog/870) にお進みください。 diff --git a/src/content/blogs/835/clubroom.jpg b/src/content/blogs/835/clubroom.jpg new file mode 100644 index 0000000..1963018 Binary files /dev/null and b/src/content/blogs/835/clubroom.jpg differ diff --git a/src/content/blogs/835/finance.png b/src/content/blogs/835/finance.png new file mode 100644 index 0000000..d0b1fea Binary files /dev/null and b/src/content/blogs/835/finance.png differ diff --git a/src/content/blogs/835/messaging.jpg b/src/content/blogs/835/messaging.jpg new file mode 100644 index 0000000..5bcff4b Binary files /dev/null and b/src/content/blogs/835/messaging.jpg differ diff --git a/src/content/blogs/835/python.png b/src/content/blogs/835/python.png new file mode 100644 index 0000000..39fdbe8 Binary files /dev/null and b/src/content/blogs/835/python.png differ diff --git a/src/content/blogs/870.md b/src/content/blogs/870.md new file mode 100644 index 0000000..afa313c --- /dev/null +++ b/src/content/blogs/870.md @@ -0,0 +1,275 @@ +--- +title: OUCC の 3 年間を振り返る [中編] +description: | + 執筆者: watamario15 (2022 年度部長) + + これは OUCC Advent Calendar 2022 の 2 日目の記事です。昨日は前編をお届けしました。明日は後編をお届けします。 + + 2021 年度 + 2021 年度には、曖昧な数え方になっていた「部員」「OB」を明確化したり、それに併せて 10 年以上誰も触ってこなかった部の規約を実情に沿うように大幅に改正したり、部室を引っ越したり、既に経験者がいなくなっていた学祭に参加したり、活動形態を変更したり、顧問が交代したりと OUCC にとって大きな局面となりました。 +author: member +tags: [advent-calendar] +--- + +執筆者: [watamario15](https://github.com/watamario15) (2022 年度部長) + +これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859) の 2 日目の記事です。昨日は[前編](/blog/835)をお届けしました。明日は後編をお届けします。 + +## 2021 年度 +2021 年度には、曖昧な数え方になっていた「部員」「OB」を明確化したり、それに併せて 10 年以上誰も触ってこなかった部の規約を実情に沿うように大幅に改正したり、部室を引っ越したり、既に経験者がいなくなっていた学祭に参加したり、活動形態を変更したり、顧問が交代したりと OUCC にとって大きな局面となりました。ちなみに、当時私は役職上は 2020 年度の流れで ANU CSSA との橋渡し役を担っており、副部長 (当部における実質リーダー) ではなかったのですが、なぜか部の方向性を大幅に担っていたり副部長より部を回していたりと不思議な立ち位置にいました。 + +### 新歓 (講習会、チーム開発など, 4-6 月) +2020 年度に新入部員 (我々世代) がそれなりに入ったため、人数的には 2020 年度よりマシでした。しかし、注意しなければならないのは「2 年目部員がほとんど」というところです。講習会できるネタを持っていない部員も多く、割り当てにはかなり苦労しました。結果、自分は C, C++, Python の 3 つの講習会を受け持つことになりました() なお、この年度から新たな取り組みとして、2020 年に大学公認団体に加わった[阪大競技プログラミング部 RAINBOU](https://rainbou.org/) から [@small_onions](https://twitter.com/small_onions) さんを招き、競プロ講習会を実施しました。同じ大学の情報系団体として、交流を深めていきたいものです。 + +チーム開発では、[パスワードマネージャ](https://github.com/OUCC/password-manager)、会話ボットの新規開発と、2020 年度のアクション RPG、既存ゲーム「阪大大戦」の改善の 4 つのチームに分かれ、1 か月間の開発を行いました。「ハッカソン」の名は用いていないので、期間が長くとも問題はありません (キリッ。ちなみに、自分はパスワードマネージャでした。 + +![Password Manager](./870/passman.png) +![会話ボット](./870/echan-wiki.png) + +なお、この頃は講習会のハイライトやイベントの告知など、頻繁に Twitter 投稿を行いました。その甲斐あってか新入生が 10 人ほど入部し、OUCC に活気が戻ってきました。 + +### 部室をどうするか (5 月) +> 「支援をお願いし、今後様子を見ながら来年 5 月頃にまた再検討する」 + +さて、その時が来ました。「様子」としては、5 月のいちょう祭 (学祭) も結局中止となり、明らかにアウトでした。しかし、今回はまだ 2020 年度ほど極限状態ではないので、検討の時間がありました。2020 年の流れを受けて、何とか残すことはできないかと、選択肢を洗い出しました。 + +- 協賛 +- HP 広告料収入 +- 企業との交渉 +- クラウドファンディング +- 有償 OB 会の設置 + +なんというか、無理!!って言いたくなるような選択肢です。協賛では部室維持につながるような額は期待できず、広告料、企業との交渉、クラウドファンディングは余りに難易度が高く、「多さ課題が苦」の部員が十分にそれに貢献できるとも期待できません。有償 OB 会は [KMC](https://www.kmc.gr.jp/) で実際に採用されているなど有力でしたが、加入メリットの捻出が課題です。しかし、部室を手放すと以下の懸念がありました。 + +- 備品置き場所問題 +- 学祭時の商品保管用冷蔵庫 +- 2 度とあの部室を取れないかもしれない + - 大家さんとの契約更新の際の反応は、学生の入居は騒がしい等で迷惑になったり、老朽化による安全性が心配だったりとあまり積極的ではなかったようで、手放すと立地にしては (家賃的に) 超好条件だったあの部室をもう 2 度と借り直せなくなる恐れがありました + +しかし、今回は耳寄り情報がありました。何と、他部の解散により学内の部室 (共用室) に空きができたのです。学外に確保していた部室より遥かに狭い (4m x 3m) ため、活動スペースが取れないばかりか物品も結局ほとんど処分しなければ収まらず、インターネットもなく、共有空間なので高額機器や金銭の保管に少し抵抗が生まれるなどの問題点はありましたが、金がない以上贅沢は言えません。 + +![共用室](./870/sharedroom.jpg) + +- 共用室に興味を持っている団体は他にもあり、判断を待ってもらえるのは今年限り +- 収支を計算するとマイナス 40 万超 (年間) なので、仮にクラウドファンディングで 50 万儲けても 1 年しか伸ばせず、もし 100 万儲けられたとしても 2, 3 年延ばすのみ + - しかもその時点で共用室は取れなくなる +- 部室維持が困難になったのは COVID-19 のパンデミック前からの話であり、収束しても厳しいことに変わりはない + - 結構前から、部費半期 1 万円であったことが判明した + - 部費の高さで入部をためらう声もあり、部室維持のために部員が減るのは本末転倒である + +以上の思考の元、部室維持は長期的に非現実的だということを部員一同が認識し、2021 年末を以って部室を手放し、物品は共用室に移送することで合意しました。 + +しかし、話はこれで終わるほど単純ではありません。大量の物品をどうやって残す/売る/捨てるの判断をするのか、私物が紛れていないか、どうやって運ぶのか、どうやって捨てる/売るのか。そこにこそ、最大の砦が待ち構えていたのです... + +### 活動形態の変更 (8 月) +部室を手放すということは、完全に Discord が活動場所になるということです。そこで、Discord サーバーの整理を始めました。まず、役割の同じチャンネルが複数あったり、全く使われていないチャンネルがあったりと、散らかり放題だった内部サーバーを、実情に合わせて再編しました。そして、「新歓サーバー (公開)」と「メインサーバー (内部)」の 2 つが存在していたのですが、これらの役割を変更し、前者をメインサーバー、後者を議論用サーバーに変更しました。これには、以下の背景があります。 + +まず、新歓サーバーはその名の通り、2020 年に新歓目的で作成されたサーバーでした。そして、内部サーバーが活動のメインであり、こちらは 2019 年に Slack から移行する形で作成されました。新歓サーバーは、おそらく新歓期間終了後破棄することを想定されていたものですが、新歓時期終了後にも新たな参加者が入ってくることが結構あり、また公開サーバーであるという側面から先述の ANU CSSA の方との交流にも利用され、その結果、破棄されず 2021 年の新歓にも使用されました。しかし、新歓時期にしか使用しないとなると、OUCC の活動風景が唯一見える新歓サーバーは新歓時期を過ぎると閑散とし、これによって新たな参加者も発言しにくくなり、多大な機会損失が生じているのではないかという懸念がありました。 + +現代では、誰でも参加できる高度なオンラインコミュニティが無数に存在します。部費を払わないと参加できないオンライン活動のクラブは、この点で大きなディスアドバンテージになります。これは OUCC に限らず、[多くのクラブ・サークルが直面した問題](https://bizspa.jp/post-521768/)です。そもそも、私は「それによって価値を失ったクラブ・サークルは、そのまま消えてしまえばいい」という考え方です。これは、OUCC に対しても同じです。しかし、OUCC には「同じ大学のコンピュータに興味のある人と情報交換ができたり、(主に) 情報系学科なら履修や講義の相談ができたりする」という価値を見出していました。なので、そこに重点を置くことを考えました。具体的には、「活動を公開空間で行い、部員以外でも誰でも参加できるようにする。つまり、コミュニティとしての存続を目指す。」ということです。とはいえ無料で運営できる状態ではないので、部として参加する外部イベントへの参加、活動方針の決定、備品利用等の「部員」にのみ提供される付加価値をいくらか残すことで、部費を払って入部するメリットも確保しました。 + +### KC3 2021 (9 月) +[KC3 2021](https://kc3.me/news/315/) も、2020 年度と同じくオンライン開催となりました。この回も私は受講生側でしたが、当時の部長 (2020 年度とは違う) が JavaFX の講習会「[初心者向けGUIプログラミング -某番組のシステムをまねてみよう](https://kc3.me/study/301/)」を開いていました。 + +### 部室の整理 (9-10 月) +部室には大量の物品が存在し、共用室への移動時には大量の処分を行わなければいけないことが分かっていました。そのため、「今どのような物品が存在し、どれが優先度が高いか」を明らかにする必要がありました。ちなみに、「部室をどうするか」から 4 か月も経っているのは、学期中には碌な活動ができないという「多さ課題が苦」ならではの制約によるものです。これが、後に地獄を招くことになるのですが... + +さて、まず、整理には 4 日間を確保しました。行う内容は以下です。 +- 必要な物を優先度の高い順に整理する + - よく分からないもの・判断に迷うものは適宜 OB さんにもメンションしながら頻繁に質問する +- 明らかなゴミを除き、写真と共に選別結果ごとにリスト化する + - 大きい物品は採寸結果も + - 1 つ 1 つのリスト化は非現実的なので、小物類はまとめて写真を撮るだけでもいい +- 古い PC を起動し、スペックを確認する + - 使えそうでないものは USB 等にデータの救出を行う + - 起動しないものは HDD を取り出せばいいと思われるが、大したデータはなくそのまま捨ててもいい +- コード類はどこに繋がるものかわかればその機器に繋ぐ + - 最悪まとめて箱詰めでも良い +- OB さんに原則 25, 26 日に自分の所有物を回収してもらう + - 都合が合わない方は 11/14 までの範囲で柔軟に調整するが、できる限り早くにお願いする + - 11/14 までに連絡がないものは、部の備品として処分などの取り扱いを行うことも併せて告知する +- 業者に運んでもらうものを決める + - 見積もり訪問が来るので、値段が変わらない範囲を探る + +できそうに見えた方も多いことでしょう。実際、我々もできると思って 4 日間としましたから。しかし、現実はそう甘くはありませんでした。 + +![物品量](./870/stuff.jpg) + +はい、無理です。まず足の踏み場がないので、整理やリスト化などの作業を行うためのスペースすらなく、リスト化作業もかなり滞りました。遠い昔の世代が遺した得体の知れない物体も大量に存在し、これもまたリスト化作業の停滞を招きました。最終的に、リスト化は「ある程度」進みましたが、「優先度の高い順に整理」は無理でした。結局、学期が始まってからも部員が頻繁に通ってリスト化が済んでいないものをリストに追加する作業が続くこととなりました (自分も 65 枚ぐらい撮りました)。ちなみに、このリストは最終的には 41 ページに渡る巨大文書となりました。 + +![物品リスト](./870/stuff-doc.png) + +リスト化できたら、これに優先順位をつける作業に入ります。これは、部会で投票方式で行いました。時間が掛かることは分かっていたので、限界まで時間短縮するためにテンポよく短時間の投票を繰り返す方式にしたのですが、それでも 14:00 に開始して 22:30 終了という、過去に例を見ない恐ろしく長丁場な部会となりました。 + +![物品の優先順位投票](./870/stuff-vote.png) + +### 引っ越し (10 月) +必要なものが決まれば引っ越しですが、単純に量が多いことと冷蔵庫のような大型物品を含むことから、学生だけでは非現実的で業者に頼むことは必須でした。格安業者は不安だったため、大手の業者で相見積もりを取って決めました。壊れた冷蔵庫 (冷蔵庫は 3 台あり、そのうち 1 つは壊れていた) の処分を含めて 32890 円になりました。家電リサイクル法~~とかいうクソ~~が絡む物品を含んでいることを考えると、まあ妥当な額です。ちなみに、箱詰め資材が届くのが引っ越しの 2 日前の夜という感じで、そこから (大幅処分の上でも依然) 大量の物品を箱詰めする訳なので、かなりギリギリでした。近くに住んでいる部員が夜遅くまで献身的に働いてくれたことで、辛うじて間に合いました。~~ブラック労働~~ + +しかし、これで引っ越しが完了した訳ではありません。処理しなければならない不要物品が大量に残っているし、さらに事前に伝えておいた冷蔵庫とホワイトボード以外は箱に入るものしか運んでもらえず、結局プリンタなどは部員で運ぶことになりました。この辺のこと、ちゃんと確認しておかないといけないという教訓ですね。まあ、それでも助かったことは間違いないです。 + +![残った物品](./870/stuff-after-moving.jpg) + +### まちかね祭 (11 月) +いきなり何の関係もない話題に飛びますが、実際にこのタイミングに学祭が割り込んできたのです。実際には準備があるので、8 月から議論が始まっていました。引っ越しと学祭出展の 2 刀流はもう... しかも、この学祭、食品模擬店とゲーム有償展示の 2 店舗同時出店なんですよね。両方の準備をしなければならないし、何より少ない部員で 2 店舗を準備日含めて 4 日間割り当てないといけない。はっきり言って無謀ですが、この学祭は完全に資金獲得を目的としており、財政がギリギリという背景から、何としてもそうせざるを得なかったのです。 + +この学祭はただ大変だっただけではなく、2 年ぶりということで、学祭経験者がもはや 0 でした。ゲーム展示の方は、部として持っているゲーム (VR、シューティング) と夏休みに新規開発した占いを出すということで、企画自体はまあ何とか決まりました。問題は食品模擬店です。まず何を売ればいいのか、色々と議論の後に唐揚げに決まった後も何 kg 仕入れればよいのか、調理にあたって必要なものは何か、買い出しはいつどこでどうやればいいのか、全てが手探りでした。あまりに不安要素が大きかったため試食会を部室で開き、調理方法などを確認しました。 + +そして迎えた本番、COVID-19 が小康状態であったことや久し振りの学祭ということもあって、とんでもない客入りでした。唐揚げは~~原価率 25% で~~飛ぶように売れ、ゲーム展示にも長蛇の列ができました。私は食品模擬店を担当しており、ゲーム展示の担当ではなかったのと、現場が限界運営で状況報告をする余裕がなかったようで、全く状況は分からなかったですが、とりあえず盛況だということは間違いなかったようです。 + +![食品模擬店](./870/machikane2021-chicken.jpg) +![ゲーム展示](./870/machikane2021-game.jpg) + +もうとにかく「大変」の 2 文字だった学祭ですが、その効果は絶大でした。売上 249849 円で 180650 円の利益を出したのです。もはや我々にも信じられない数字でした。頑張った甲斐があるというものです (そして当時来てくださったお客さんにはもう感謝してもしきれません)。そしてこれによって得た盤石な財政は、以降の引っ越し作業を大いに救うことになります。 + +### 不要物品の処分・売却・譲渡 (11-12 月) +学祭が終われば、不要物品の処理です。この時点で OB さんによる回収期限は終わっていたので、あまりに高価だと判明した物品以外は部員と OB さんが自由に持って帰ってもいいという方針にしました。それでも残ったものを処理する形になります。 + +まず、粗大ごみは大変です。ゴミ処理場まで運ぶのには車が必要になり、処分費用も掛かります。電化製品なら家電リサイクル法~~とかいうクソ~~も絡んできます。今回は、CM でおなじみの[ジモティー](https://jmty.jp/)を利用し、部室まで引き取りに来てもらうことを前提にタダで出しました。結果、鉄くずを集めているらしい業者っぽい方が全て回収してくれて、この辺の物品は特に大きなテレビ台などを除き無事処理できました。 + +続いては、金になるもの (書籍、ゲーム、ゲーム機等) の処理方法です。それぐらい残しておいてもいいじゃないかと思うかもしれないですが、量が尋常ではないのです。書籍もゲームも、「それぞれ」200 以上はあったのではないでしょうか。もはや数えることすらできませんでした。ゲーム機も PS2 が 5 機ぐらいあったりと意味不明でした。一体どの世代が何のために... オタクの楽園ではありますが、こんなものを狭い共用室に運べるわけがないので処分が必要になります。金になるなら売りたいというのが、常に財政がギリギリの貧乏クラブの発想で (そもそも、だから部室を引き払うことになったわけで)、ボドゲと一部の漫画は[ボドゲ研](https://wikiwiki.jp/handai_simu/)と[漫研](http://handaimanken.web.fc2.com/)に売りました。しかし、先述の学祭で資金を獲得したことで、「何としてでも金になるものは売らないとまずい」というよりは、「あと 1 か月で引き払わないといけないのにこれでは間に合わない」の方が強くなっていたため、特に高額なもの以外は業者に一括で丸投げする方針になりました。というか、期日が近づくにつれてどんどん適当になっていきました。まあ、本当に売ることを考えるとヤフオクやメルカリになりますが、これはあまりに大変なので非現実的でした。なお、この方針でさえ期日ギリギリだったので、学祭で大失敗していればもう... かなり悲惨な結果だったことでしょう。 + +![大量のゲームソフト](./870/games.png) +![大量のゲーム周辺機器](./870/game-consoles.png) + +一応、当時のメモを掲載しておきます: +> TODO: +> - 書籍類/ゲームソフトの分類(種類別)、その後シリーズごとに出品用写真を撮り箱詰め。 +> - 箱詰めは、部屋に散乱して作業の大きな妨げとなっているため行う。どれがどの箱に行ったか分かるようにすること。 +> - 見落とされていた専門書は共用室へ移動エリアに置く。 +> - 書籍類/ゲームソフトのうち高価な物を探す。 +> - 上の作業で写真が届くのと並行に、現地にいない人が解析すると効率が良さそう。 +> - ゲーム機/周辺機器の分類と、出品用写真の撮影。 +> - これも、現地にいない人が同時に価格解析すると効率良さそう。 +> - PC/モニタ/HHKB/ゲーム系/例のレンジの動作確認。 +> - 共用室に運ぶエリアに置いた物品と高価値物品の移送。また、そこにはないがクーラーボックスや座布団と椅子と机(とモニタ)も運ぶ。 +> +> - あまり価値のないゲームソフト/ゲームハード/書籍類/トレカは BOOK OFF か HARD OFF に一括で投げる。 +> - 不要な家具類はヤフオクかジモティーで出品する(最悪0円でもいい)。引き取り手が無ければ粗大ごみ。 +> - 重要度の低いボドゲをボドゲ研かメルカリ/ヤフオクに売る。 +> +> - 大量のゴミ(粗大ゴミ含む)の処分。 +> - 行政サービスを使うか民間業者を使うか。行政サービスなら手続きとかいろいろあるし休日や年末年始は受けてくれない可能性があるし、申込期限もあるので注意。 +> - 鍵の取り外しと、マナーとして最低限の掃除。 + +さて、残りはシンプルに「ゴミ」です。それの量は、「引っ越し」の節の最後に示した画像から察してください。一部、引っ越し業者の箱に入らなかったために部員が自力で運んだ物品、ギリギリになって発掘されたり議論が漏れていたりしたために検討時間が取れなかった物品、処分方法不明な自動車関連の缶系物品など、共用室に運び込んだ物はありますが、ほとんどはゴミです。これを、自治体のゴミ収集で何とかできるでしょうか。そもそも、部員の力で運び出せるでしょうか。...無理です。どう考えても無理です。ということで、ゴミ処理の業者を呼ぶことになりました。業者決めというのは例によって大変なのですが、今回はコネがありました。そう、ジモティーのときに粗大ごみを引き取ってくれた業者です。ここの業者に相談したところ、何と大量の書籍の売却、粗大ゴミの回収を一挙に引き受けてくれるということで、これでようやく先が見えました。さらにこの業者は、粗大ごみ以外の大量のごみも引き受けてくれて、部室が一気に片付きました。軽トラック大盛 2 回分で 24000 円と良心的な価格で、学祭の利益をもってすれば余裕でした。この業者に巡り合えていなければどうなっていたか、考えるだけでも恐ろしいです。ジモティーへの出品がきっかけでこの結果にたどり着いたことを考えると、人生何がどう繋がるか、分からないものですね。 + +![大量処分後の部室](./870/stuff-done.jpg) + +### 部室の退去 (12 月) +さて、前節の業者によるゴミ回収が 12/18 で、退去日は 12/25 (年末年始休暇に入るので 25 が限度だと大家さんに言われたため) でした。残りの物品も、授業の合間を縫っていくつか運び、退去日の 25 日に何人かで集まって運び終わりました。本当にギリギリですが、何とかなりました。 + +しかし、最後に事件が起きました。物品移送の後、共用室で棚を組み立てていたときのことです。退去の立ち合いをしていた部員から、連絡が入りました。 + +> 2021/12/25 15:07 +> 下駄箱は元からあったものでは無いので運び出してくれと言われました +> 人手が要ります + +怪しいかもしれないとは思いつつ、しかしこれはさすがに備え付けだろうと思って処分しなかった下駄箱が、なんと当日にこう言われた訳です。傘立ての壺があったのですが、これについても同様でした。契約当時を知る OB さんとは既に連絡が取れなくなっており、というか誰かも分からず、大家さんに確認を取るも返事がなく、当日にこの有様... 現場は大混乱でした。契約が切れた以上当日中に撤去する必要があり、しかし共用室に入るサイズではありません。先日の業者も、こんなタイミングでいきなり呼んで来てもらえるとは期待できないし、そもそもこの日は年末ということもあり条件は最悪です。 + +しかし、どうにかするしかないので、最寄りのリサイクルショップを半ば賭けで目指しました。最寄りとはいえ、大荷物をタイヤがボコボコの台車で徒歩で運ぶとなるとかなり遠いです。何とか着いても、壺は無償引き取りできたものの、やはり下駄箱は無料引き取りもできず、有償処分も引き受けていないと言うことでした。途方に暮れていると、見かねた店員さんが知り合いの業者をあたってくれ、8000 円出せば処分を引き受けてくれる人を見つけてくれました。下駄箱 1 つ 8000 円とは普通の感覚ではぼったくりですが、タイミングがあまりに最悪で他の選択肢は川に投げるしかないという状況にあったため、金を積めばそんな状況を救ってくれるというだけでもものすごく有難かったのです。何なら数万円でも出すつもりでした。というわけで、この条件で引き受けてもらうことにしました。これも、学祭による盤石な資金が後ろ盾にあったためにできた判断であり、先の学祭の成功は重要な鍵になりました。 + +という訳で、一悶着ありましたが、何とか部室の引っ越しが完結しました。 + +![引っ越し後の共用室](./870/sharedroom-now.jpg) + +...はい、結局新たなオタクゴミ屋敷になりました。そもそも活動スペースが取れないことは想定内であり、倉庫として運用するつもりだったため自然な結果ではありますが、運び込んだ備品を使うスペースすらないため、物品の保持基準を更に厳しくして断捨離する必要がありそうです。とはいえ、これには 1 年経った今も手を付けられていません。 + +### Advent Calendar (12 月) +毎年恒例 [OUCC Advent Calendar 2021](https://adventar.org/calendars/6722) です。今回は部室の引っ越しのクライマックスと被ったことでかなり厳しかったです。その結果、12 記事しか集まらず、それも後半のみという寂しい感じになりました。しかし、OUCC 部員でない方が 1 つ記事を埋めてくれたのには、公開コミュニティ化の手応えを感じました。 + +ちなみに、私は「[テトリスの電子辞書移植](/blog/490)」という記事を書きました。締め切り直前に書き始め、ブログシステムのトラブルによって結局間に合わなかった迷作です。 + +### 役職再編 (12-1 月) +実際の運営状況を反映し、旧来の役職体系を再編しました。それぞれの責任範囲を明確にし、「これは誰がやるのか」問題を減らそうとも試みました。「これは誰がやるのか」というのが曖昧なものって、結局誰もやらないので私に回ってきていたんですよね。そういう意味でも、運営の健全化において重要でした。なお、部室係はここで廃止したものの、半年後に需要が出てきたため復活させました。 + +旧: +``` +・部長 +・副部長: 部会の司会進行、部の運営・意思決定、他役職のサポート +・国際交流: ANU CSSAとのやり取り +・国内交流: 外部(大学・他企業)との交流(これまでの渉外と同) +・会計: 部のお金の管理 +・Webサーバー係: Webページ更新など +・出版係: 部誌・広告作成 +・部室係(部室に近い人) +・店舗・副店舗 +・展示・副展示 +``` +新: +``` +# 新3年配当 + +部長 +- 副部長への職務継承、アドバイス、手助け + +店舗 +- 学祭の食品模擬店の正責任者 +- 総会の出席、検便の回収、シフト決め等を行う + +展示 +- 学祭の展示の正責任者 +- 総会の出席、シフト決め等を行う + + +# 新2年配当 + +副部長 +- 部の代表者 +- 部会などイベントの計画・開催 +- 他の人の手が回ってないこと全部 + +会計 +- 会計記録 +- 部費徴収 +- 部長、副部長、会計による会計会議への参加 +- バイトの斡旋 +- その他、金銭に関わること + +渉外 +- 部外の方との橋渡し(郵便受けの確認やメール対応、会議など) +- 教室確保(共用室の利用届更新を含む) + +Intl PR +- ANU CSSA とのやり取りを含む国際交流 +- 留学生のサポート + +広報 +- Twitter (@OUCC, @OUCC1) や OUCC BLOG の対応と情報発信 +- 新歓(サーオリを含む)の取り仕切り + +サーバ +- サーバの管理・運用 + - セキュリティ更新とクラッキング被害有無の確認/対応 + - bot の管理 +- OUCC が管轄する GitHub, GitLab, Discord, Slack, etc の管理 + - これらの Owner 権限あるいは類する最高権限を持つことを想定 + +出版デザイン +- Web サイトの管理・更新(部誌制作の代わり) +- 紹介動画制作、サーオリ/学祭等のサムネイル/ビラ制作 +``` + +### 部費システムの大幅変更 (2 月) +まず、何度か軽く触れましたが、当時は + +- 春夏学期・秋冬学期それぞれ、会計が決めた額の部費を支払う + - 大阪大学は~~形だけの~~ 4 学期制なのでこの呼び方になりますが、前期・後期と読み替えても支障はありません +- 新規入部者は「入部金」という、部費よりも安く設定した料金を支払うことで参加でき、これを当期の部費納入と見做す + +というシステムでした。そして、その部費は部室の家賃を賄うために 15000 円まで跳ね上がっていたのでした。 + +しかし、月 5 万の部室を手放した今、そこまで部費を吊り上げる必要はありません。もっと安価にできます。そして、半期単位での集金は会計への大きな負担になっていました。この時点で出費を考えると、 + +- サーバレンタル料 +- ドメイン (oucc.org) 代 +- 学祭費用 + +でした。学祭費用は大抵の場合学祭の利益で相殺されることと、却って利益になることの方が多いため考えないことにすると、残りは年間 3 万円程度でした。ということは、全体で年間 3 万円を部費として徴収できれば、OUCC は安定して存在できる訳です。そこで、部員 15 人は確保できるだろうと見込み、以後固定で年間 2000 円とすることにしました。今まで年額に直すと 3 万円前後徴収していたことを考えると、超大幅値下げです。部費はオープンコミュニティ化における大きな障壁だったため、この値下げは重要でした。また、有効期間を厳密に年度単位 (4/1 - 3/31) としたことで手続きも分かりやすくなり、この期間に部費を納入した人数として部員数の正確な統計も得られるようになりました。 + +### まとめ +2021 年度の「活動」は、まあ見ての通り、ほとんど「部室」でした。折角沢山入ってきてくれた新入部員に労働しか与えられなかったという点は申し訳ないなぁという気持ちですが、こうする他ありませんでした。改めて、自分の世代で出した遺産の処理をその世代のうちに済ませておくことの大切さを感じました。 + +一方で、運営関連では雑だった部分を是正したり、公開コミュニティ化したりと、時代に合わせた大幅な改革を行いました。これによって入部できない人も活動に参加してくれるようになったりと、一定の手応えは感じています。公開コミュニティ化については、2022 年現在においても不十分なところはあります。例えば、課題の質問は剽窃や講義の規則 (第三者に資料を渡してはいけない etc) 等の懸念があったり、単に恥ずかしかったりで公開サーバーでは行いづらく、結局内部サーバーでの会話の方が多くなってしまっている現状があります。また、公開コミュニティ化する上では開発プロジェクトは OSS 化したいものですが、外部公開を想定して開発していなかったためにソースコードがぐちゃぐちゃだったり、著作権周りが怪しかったりで開発に携わった部員が消極的なことも多く、既存プロジェクトについてはあまり実現しませんでした。この辺をより推進するのは、2022 年度以降に託されました。 + +中編はここまでです。続きは [OUCC の 3 年間を振り返る [後編]](/blog/871) にお進みください。 diff --git a/src/content/blogs/870/echan-wiki.png b/src/content/blogs/870/echan-wiki.png new file mode 100644 index 0000000..35f150c Binary files /dev/null and b/src/content/blogs/870/echan-wiki.png differ diff --git a/src/content/blogs/870/game-consoles.png b/src/content/blogs/870/game-consoles.png new file mode 100644 index 0000000..4f1b557 Binary files /dev/null and b/src/content/blogs/870/game-consoles.png differ diff --git a/src/content/blogs/870/games.png b/src/content/blogs/870/games.png new file mode 100644 index 0000000..550b9d4 Binary files /dev/null and b/src/content/blogs/870/games.png differ diff --git a/src/content/blogs/870/machikane2021-chicken.jpg b/src/content/blogs/870/machikane2021-chicken.jpg new file mode 100644 index 0000000..7f53800 Binary files /dev/null and b/src/content/blogs/870/machikane2021-chicken.jpg differ diff --git a/src/content/blogs/870/machikane2021-game.jpg b/src/content/blogs/870/machikane2021-game.jpg new file mode 100644 index 0000000..3123bc7 Binary files /dev/null and b/src/content/blogs/870/machikane2021-game.jpg differ diff --git a/src/content/blogs/870/passman.png b/src/content/blogs/870/passman.png new file mode 100644 index 0000000..6c33932 Binary files /dev/null and b/src/content/blogs/870/passman.png differ diff --git a/src/content/blogs/870/sharedroom-now.jpg b/src/content/blogs/870/sharedroom-now.jpg new file mode 100644 index 0000000..60d2bdc Binary files /dev/null and b/src/content/blogs/870/sharedroom-now.jpg differ diff --git a/src/content/blogs/870/sharedroom.jpg b/src/content/blogs/870/sharedroom.jpg new file mode 100644 index 0000000..0c85ff7 Binary files /dev/null and b/src/content/blogs/870/sharedroom.jpg differ diff --git a/src/content/blogs/870/stuff (1).jpg b/src/content/blogs/870/stuff (1).jpg new file mode 100644 index 0000000..421b349 Binary files /dev/null and b/src/content/blogs/870/stuff (1).jpg differ diff --git a/src/content/blogs/870/stuff (2).jpg b/src/content/blogs/870/stuff (2).jpg new file mode 100644 index 0000000..421b349 Binary files /dev/null and b/src/content/blogs/870/stuff (2).jpg differ diff --git a/src/content/blogs/870/stuff (3).jpg b/src/content/blogs/870/stuff (3).jpg new file mode 100644 index 0000000..421b349 Binary files /dev/null and b/src/content/blogs/870/stuff (3).jpg differ diff --git a/src/content/blogs/870/stuff-after-moving.jpg b/src/content/blogs/870/stuff-after-moving.jpg new file mode 100644 index 0000000..ebdf0a8 Binary files /dev/null and b/src/content/blogs/870/stuff-after-moving.jpg differ diff --git a/src/content/blogs/870/stuff-doc.png b/src/content/blogs/870/stuff-doc.png new file mode 100644 index 0000000..0a8870a Binary files /dev/null and b/src/content/blogs/870/stuff-doc.png differ diff --git a/src/content/blogs/870/stuff-done.jpg b/src/content/blogs/870/stuff-done.jpg new file mode 100644 index 0000000..829a952 Binary files /dev/null and b/src/content/blogs/870/stuff-done.jpg differ diff --git a/src/content/blogs/870/stuff-vote.png b/src/content/blogs/870/stuff-vote.png new file mode 100644 index 0000000..c9ac939 Binary files /dev/null and b/src/content/blogs/870/stuff-vote.png differ diff --git a/src/content/blogs/870/stuff.jpg b/src/content/blogs/870/stuff.jpg new file mode 100644 index 0000000..421b349 Binary files /dev/null and b/src/content/blogs/870/stuff.jpg differ diff --git a/src/content/blogs/871.md b/src/content/blogs/871.md new file mode 100644 index 0000000..d9f08e2 --- /dev/null +++ b/src/content/blogs/871.md @@ -0,0 +1,62 @@ +--- +title: OUCC の 3 年間を振り返る [後編] +description: | + 執筆者: watamario15 (2022 年度部長) + + これは OUCC Advent Calendar 2022 の 3 日目の記事です。昨日は中編をお届けしました。 + + 2022 年度 + 2022 年度は、2021 年度に進めた改革の続き、2021 年度には部室の処理があったためにできなかった「コンピュータクラブ」としての活動の再興、そして後輩への継承を進めました。私は部長となりましたが、恐らく部の運営に関わる最後の年になるため、引継ぎを考えて関与量は 2021 年度よりはかなり減らしました。 +author: member +tags: [advent-calendar] +--- + +執筆者: [watamario15](https://github.com/watamario15) (2022 年度部長) + +これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859) の 3 日目の記事です。昨日は[中編](/blog/870)をお届けしました。 + +## 2022 年度 +2022 年度は、2021 年度に進めた改革の続き、2021 年度には部室の処理があったためにできなかった「コンピュータクラブ」としての活動の再興、そして後輩への継承を進めました。私は部長となりましたが、恐らく部の運営に関わる最後の年になるため、引継ぎを考えて関与量は 2021 年度よりはかなり減らしました。 + +### 新歓 (講習会、チーム開発など, 4-6 月) +2021 年度と同じ流れですが、部員数がかなり回復したことで、講習会担当者の割り振りはものすごくスムーズでした。結果、1 人で 3 つ担当するとかいう 2021 年度の私のような人は生じず、1 人 1 つ以下で回せました。COVID-19 もある程度落ち着いてきていたため、副部長が中心となり、大学の教室を借りて 3 年ぶりの対面講習会も実施されました。2021 年度に引き続き、RAINBOU による競プロ講習会 ([@KowerKoint2010](https://twitter.com/KowerKoint2010)) も実施しました。また、チーム開発も全員参加ではなく、興味のある人の任意参加としました。2021 年度までは「自由な緩い部活」を謳いながら、人数の都合上強制参加のイベントがそれなりにあるという矛盾状態にあったのですが、2022 年度の人数なら任意参加でもできると判断しました。これによってか、あるいは流行りのクロスプラットフォーム開発環境 [Flutter](https://flutter.dev/) を選んだのが良かったのか、今回は全て少なくとも「使える」レベルの一定の完成度に達しました。 + +![新歓イベント](./871/welcome-2022.png) +![対面講習会](./871/lecture-inperson.jpg) + +各開発プロジェクトのリンクはこちらです: +- [目覚まし](https://github.com/OUCC/alarm2022) +- [単語帳](https://github.com/OUCC/EnglishWordCard2022) ([deployment](https://oucc.github.io/EnglishWordCard2022/)) +- [電卓](https://github.com/OUCC/calculator2022) ([deployment](https://oucc.github.io/calculator2022/)) + +ちなみに、こうして掲載できていることからわかるように、この開発は完全に OSS で行われました。このまま OSS で開発することが当たり前となり、公開コミュニティ化が推進されていくと嬉しいものです。 + +### いちょう祭 (5 月) +部室を手放したことで財政的には安定していましたが、それは「存続できる」という意味であって、何か古い機器の更新など、設備投資ができる状態ではありません。入部障壁を下げるために部費を減額した以上、学祭は重要な収入源となります。この時期は新歓という意味でも重要です。という訳で、まちかね祭に引き続き久し振り (3 年ぶり) に開催されたいちょう祭にも出展することになりました。 + +さて、いちょう祭自体は 3 年ぶりですが、やることはまちかね祭と同じです。なので、特に問題なく...行きませんでした。まず、懲りずに食品模擬店と展示を両方出展したので、やはりカツカツでした。そして、一番は思ったより客足が無かったことと、唐揚げが他の 5 店舗と被ったことでした。被りについてはギリギリまで知らされなかったためどうしようもなかったのですが、結果大量に余り利益が出ませんでした。まあ、原価率 25% なので大赤字とはならず、15163 円の赤字で済みましたが。 + +![食品模擬店](./871/icho2022-chicken.jpg) + +これで懲りたので、以降は「いちょう祭ではゲーム展示 (新歓、活動紹介) のみを行い、まちかね祭では食品模擬店 (活動資金の獲得) のみを行う」という方針になりました。 + +### 夏の開発 (8 月) +2 年前から続くアクション RPG の改良、2021 年度の会話ボットの強化、画像判別の新規制作が行われました。これらは 11 月のまちかね祭での出展を目指して制作され、実際に使用しました。2022 年度のまちかね祭に関しては、副部長が記事を作成しているそうなのでここでは省略します。ちなみに、まちかね祭では食品模擬店という方針にしたと先ほど書いたところですが、これについては、部員がもう食品は懲り懲りだということで、今年度限りでまちかね祭もゲーム展示とする方針になりました。 + +### KC3 2022 (9 月) +毎年恒例 [KC3 2022](https://kc3.me/news/387/) です。今年度はハイブリッド形式となり、2 年ぶりに対面開催が復活しました。OUCC からは [@kakikaki85](https://twitter.com/kakikaki85) による「[画像認識で遊んでみよう](https://kc3.me/study/451/)」と私のニッチな「[電子辞書でプログラミング](https://kc3.me/study/485/)」を出しました。高い技術力を持った関西の情報系学生が一堂に集まったことで、刺激を受けた部員も多かったはずです。 + +### まとめ +まちかね祭の話を省略するので、12/1 時点で書ける内容はこの辺りです。遺産の処理が終わったこと、部員数が回復したこと、財政的にも余裕ができたことで、部の運営は随分と安定するようになりました。後輩も積極的に運営を支えてくれており、来年度以降も期待できます。 + +## 今後の展望 +私が目指していたものは、「同じ大学のコンピュータに興味のある人と情報交換ができたり、(主に)情報系学科なら履修や講義の相談ができたりする」コミュニティでした。これは、従来の「クラブ・サークル」としての在り方とは一線を画すものであり、同時に現代の多くのコミュニティの姿でもあります。特に Discord 等のオンラインコミュニティ形成に便利なサービスが登場したことによって可能になったものでしょう。今ではソフトウェアを GitHub で公開して Twitter で発表する、ということが誰でもできるようになったため、既に技術を持っている人は大抵自分でプロジェクトを決めて開発するようになり、クラブ・サークルに所属する流れは縮小に向かっているのだと思います。冒頭に述べたとおり、私も元はクラブ・サークルへの所属に消極的でした。では、それを邪魔することなく、意見交換などができるコミュニティとしての OUCC ならどうでしょうか。これなら、既に技術を持っている人でも入部、あるいはそこまでいかなくとも公開コミュニティへの参加までは検討してもらえるのではないかと期待しています。そして、そういうコミュニティは、時代が変わっても常に需要があるものだと思うんですよね。そういう意味で様々な改革を進めましたが、まだ不完全な部分は多いです。これをどういった方向に発展させていくのか、あるいはまた根底から覆して全く別の OUCC に改革するのか、これは次世代に託します。 + +様々な苦難を経て、ようやく安定した基盤を確立できました。余裕ができてこそイノベーションのきっかけが生まれるので、これは重要です。来年度以降、この基盤の上にどういった情報系コミュニティ OUCC が生まれるのか、是非とも期待したいところです。 + +## おわりに +12/5 - 12/11 にかけて、[Osaka University Giving Campaign 2022](https://osaka-u.giving-campaign.jp/) なるイベントが開催されます。今回が初めてのイベントであり、我々としてもつい先日大学からメールがあったところなのでよく分からないところも多いですが、東大初のベンチャー企業 [Alumnote](https://corporate.alumnote.jp/) が、スポンサー企業から集まった寄付金を得票数によって分配するイベントのようです。胡散臭さがすごいですが、主催は大阪大学となっており、大阪大学の内部ツール KOAN でも学生センターから通知が行われたため、怪しいイベントではないでしょう。既に述べたように、OUCC は資金面において安定して存在できる状態にはありますが、設備投資が行える状態にはありません。最新機器 (考えているものは Apple Silicon Mac や VR 機器) を導入することができれば、OUCC はコミュニティとしての価値のほかに、新しい技術を気軽に試し、学び、新たなイノベーションに繋げる遊び場としての価値も持つことができるようになります。本記事で紹介した OUCC のここ 3 年間の活動や、今後の展望に賛同いただける方は、「大阪大学コンピュータクラブ」にぜひご投票をお願いいたします。各日「正午から 30 分に最も多くの票を集めた団体」に追加で資金分配が行われる「デイリーチャレンジ」なるものがあるようなので、もし可能であればこの時間に投票いただけると有難いです。 + +最後に、OUCC の公開 Discord サーバーの招待リンクを掲載しておきます。荒らしやスパムでなければ、阪大関係者でなくとも誰でも参加可能としておりますので、他大学の方でも高校生以下の方でも、興味のある方は気軽にご参加ください。なお、スパム対策として「自己紹介」チャンネルで簡単な自己紹介を投稿した参加者にのみ、他のチャンネルに書き込めるようになるシステムとなっておりますので、その点はご協力をお願いします。 + +招待リンク: https://discord.gg/jBM2NP7ZxK diff --git a/src/content/blogs/871/icho2022-chicken.jpg b/src/content/blogs/871/icho2022-chicken.jpg new file mode 100644 index 0000000..720e362 Binary files /dev/null and b/src/content/blogs/871/icho2022-chicken.jpg differ diff --git a/src/content/blogs/871/lecture-inperson.jpg b/src/content/blogs/871/lecture-inperson.jpg new file mode 100644 index 0000000..c677274 Binary files /dev/null and b/src/content/blogs/871/lecture-inperson.jpg differ diff --git a/src/content/blogs/871/welcome-2022.png b/src/content/blogs/871/welcome-2022.png new file mode 100644 index 0000000..966797d Binary files /dev/null and b/src/content/blogs/871/welcome-2022.png differ diff --git a/src/content/blogs/875.md b/src/content/blogs/875.md new file mode 100644 index 0000000..cc3d008 --- /dev/null +++ b/src/content/blogs/875.md @@ -0,0 +1,93 @@ +--- +title: Arduino Uno R3 で Japanino の水晶発振子を有効化する +description: | + 執筆者: watamario15 (2022 年度部長) + + これは OUCC Advent Calendar 2022 の 4 日目の記事です。結局誰も入れてくれなかったので、自分のストックをそのまま放出します。昨日までは、3 編に分けて OUCC の 3 年間と展望をお届けしておりました。そちらも興味があれば見ていってください。 +author: member +tags: [advent-calendar, arduino] +--- + +執筆者: [watamario15](https://github.com/watamario15) (2022 年度部長) + +これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859) の 4 日目の記事です。結局誰も入れてくれなかったので、自分のストックをそのまま放出します。昨日までは、3 編に分けて OUCC の 3 年間と展望をお届けしておりました。そちらも興味があれば見ていってください。 + +(ここから本文) + +昔入手した [Japanino](https://otonanokagaku.net/japanino/) という付録マイコン、単体では何もできない (当たり前) ので放置していたが最近ふと調べてみると、水晶発振子が搭載されているのに使われていないという情報を発見した。そもそもこのマイコンを活用できていない以上何の意味もないわけだが、使えるはずのものが使われていないというのはどうにも気持ち悪いものだ。で、方法を調べてみると fuse ビットを書き換えると有効化できるようだが、それには書き込み装置か別の Arduino が必要らしい。ただ「使えるはずのものが使われていないというのはどうにも気持ち悪い」というだけで購入するようなものではない。ということで、結局諦めていたのだった... + +話は変わるが、2022 年春夏学期、実験 B の授業が始まった。COVID-19 の感染状況が読めない中、いつオンラインにせざるを得なくなっても対応できるように毎回部品類を持ち帰るシステムとなった。また、今年からボードを Arduino (Uno R3) に切り替え、内容を一新したらしい。そして、毎回持ち帰る部品類には当然 Arduino も含まれている。 + +...ここで何か気付くだろうか。 + +> fuse ビットを書き換えると有効化できるようだが、それには書き込み装置か別の Arduino が必要らしい。 + +**あるじゃないか!!まさに今、手元に!!** + +ということで、[\[Japanino\] 外部水晶発振子を使う: 案山子のメモ帳](http://kamemo.cocolog-nifty.com/blog/2010/06/japanino-9afa.html)を参考に 2022 年にこの作業を実施してみたログを残したいと思う。 + +## 要件 +- Japanino (持ってなかったらそもそも読んでないと思うけど) +- Arduino Uno R3 (他のボードは知らない) +- PC (Uno R3 にスケッチを書き込み、シリアルモニタから操作する) +- ジャンパワイヤ6本 + +なお、この手順に従ったことによって発生した損害に関して私は一切責任を負わない。**自己責任で実施すること。** + +## 手順 +1. 普通に最新の IDE を https://www.arduino.cc/en/software から入手する。Japanino 用は Uno R3 に対応していないので使えない。 +1. https://playground.arduino.cc/Code/Programmer2/ の一番下にある [programmer2.txt](https://playground.arduino.cc/uploads/Code/programmer2/index.txt) をダウンロードする。japanino-quartz.ino みたいなファイル名にして、その名前のフォルダに入れておくとそのままスケッチとして開ける。 + - もし削除されてダウンロードできなくなった等の際には、Internet Archive を使う。 +1. ダウンロードしたファイルをスケッチとして Arduino IDE で開き、以下のような編集を加える。 + - 240 行目ぐらいの謎の隙間に `#define BYTE 0` と書く。別に `void DebugLCD::clear()` より前であって、`#ifdef` の中でなければどこに書いてもいいけど。 + - 450 行目付近の `void DoSTK()` 関数内の `case 'a':` 直後に `break;` を追記する (`case 'a': break;` でいい)。タイプミスで bootloader をふっ飛ばさないようにするための保険。 + - 1000 行目付近の `void Fuse_Arduino_Style()` 関数内の `case atmega168:` で、`CMD_Write_Fuse_High( 0xdf);` を `CMD_Write_Fuse_High( 0xdd);`、`CMD_Write_Fuse_Low( 0xef);` を `CMD_Write_Fuse_Low( 0xc6);` に書き換える。 + - 1100 行目付近の `loader8` と `loader168` (大量の数値が並んでるところ) に `const` 修飾を加える。要するに `unsigned char PROGMEM loader8[]` を `const unsigned char PROGMEM loader8[]` に、`unsigned char PROGMEM loader168[]` を `const unsigned char PROGMEM loader168[]` にすればよい。 +1. Arduino Uno R3 に書き込む。 +1. 以下のように Arduino Uno R3 と Japanino をジャンパワイヤで結線する。Arduino Uno R3 を PC に接続していれば、この結線によって Japanino にも電源供給されるはず。 + ``` + Arduino Japanino + +5V --- +5V + GND --- GND + D10 --- Reset + D11 --- D11 + D12 --- D12 + D13 --- D13 + ``` +1. Arduino Uno R3 を PC につないだままの状態で、シリアルモニタを開いて 19200 baud に設定する。もし外してしまっても再接続すればよい。 +1. `*s` を送信してシグネチャを確かめる。Arduino IDE 2 では Ctrl + Enter が送信。 + - 何も表示されない場合は Arduino Uno R3 を外して Arduino IDE を閉じ、再度 Arduino IDE を立ち上げて Arduino Uno R3 を接続してシリアルモニタを開き、コマンドを再送信してみる。もしそれでもうまくいかなければ、Japanino 用 IDE 等の古いバージョンのシリアルモニタを開いて試してみる。 + - Arduino Uno R3 に書き込んだスケッチはずっと動いているので、IDE の再起動やバージョン変更に伴うスケッチの再コンパイルは不要。 +1. `*A` を送信する。`Writing` から始まる文字列が表示されるはず。 + - 小文字にすると全く違う意味となり、手順3で該当箇所の修正を行っていない場合は最悪 bootloader が吹っ飛ぶので注意。 +1. `*u` を送信し、以下の出力と一致すれば成功(ただし => 以降は補足のための追記)。 + ``` + Lock Bits: 11111111 => FF + Fuse Low: 11000110 => C6 + Fuse High: 11011101 => DD + Fuse Extn: 11111000 => F8 + ``` + 逆に以下なら元のままで、変更できていない。以上の手順を再確認してほしい。 + ``` + Lock Bits: 11111111 => FF + Fuse Low: 11010010 => D2 + Fuse High: 11011110 => DE + Fuse Extn: 11111000 => F8 + ``` + +念のため、書き込んだときに自分が得た出力を掲載する。はじめ最新 IDE では `*s` と `*A` が利かず Japanino の IDE で実行した画像となっているが、その後最新 IDE でも利くようになった。謎。 + +![出力](./875/fuse.webp) + +あいにく私は精度を確認できる機器を持ち合わせていないため、本当にこれでうまくいっているのかどうかは分からない。実際に確認できた人がいれば、Twitter 等で教えてほしい。 + +## おまけ - Japanino を 2022 年最新環境で使う +以上の作業では Japanino にスケッチを書き込む必要がないため、Japanino 用の環境構築は必要なかった。しかし、実際に Japanino 用に開発を行う際には環境構築が必要になる。以下にその手順を記す。 + +### ドライバ +Japanino 用 IDE に付属するドライバは古いので、https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers の「ダウンロード」から最新のドライバを取得することを推奨する。Windows なら「CP210x Universal Windows Driver」、macOS なら「CP210x VCP Mac OSX Driver」だろう。 + +ちなみに、インストールは Windows に関しては .inf ファイルを右クリック (Windows 11 ならさらに「その他のオプションを表示」) で「インストール」を選択してもいいし、Japanino を接続すればデバイスマネージャーに警告表示になっているデバイスが現れるはずなのでそれを選択し、「ドライバの更新」からダウンロードしたドライバを選択してインストールしてもよい。前者は何も表示されないのでちょっと心配になるが、Japanino を接続して Arduino IDE が認識すればインストールできている (最新版 IDE なら不明なボード扱いになるが問題ない)。macOS は知らないので、自分で調べてほしい。多分普通のドライバインストールと同じ。 + +### IDE +Japanino 用 IDE を使ってもいいのだが、Arduino IDE 2 が使えるようになった今あの太古の昔の IDE は使いたくないだろう。でも朗報だ。**普通に接続して表示されたポートを選び、ボードとして「Arduino Pro or Pro Mini」を選択した上で「ツール -> Processor」から「ATmega168 (3.3V, 8 MHz)」を選べば普通にコンパイルと書き込みが行える。**これは VSCode で行う場合も同じ。 diff --git a/src/content/blogs/875/fuse.webp b/src/content/blogs/875/fuse.webp new file mode 100644 index 0000000..fa0b12c Binary files /dev/null and b/src/content/blogs/875/fuse.webp differ diff --git a/src/content/blogs/879.md b/src/content/blogs/879.md new file mode 100644 index 0000000..a496b01 --- /dev/null +++ b/src/content/blogs/879.md @@ -0,0 +1,140 @@ +--- +title: 音MADの話 +description: | + 執筆者: ちょくぽ + + これは OUCC Advent Calendar 2022 の 12/9 の記事です。 + 記事中の〇はただの検索避けです + + 音MADをつくろう + 音MADを作る動機はファンアートなどと同じですが、音MADに使われる技術は他のことにも使えます。基本的にDAWとvocalshifterの技術なので。 + + 合成音声に歌わせる・変な声を出させる + 歌の調整をする(人間でも合成音声でも) + 普通の動画で音ハメ +author: member +tags: [advent-calendar, mad, reaper] +--- + +執筆者: ちょくぽ + +これは [OUCC Advent Calendar 2022](http://https://adventar.org/calendars/7859 "OUCC Advent Calendar 2022") の 12/9 の記事です。 +記事中の〇はただの検索避けです +# 音MADをつくろう +音MADを作る動機はファンアートなどと同じですが、音MADに使われる技術は他のことにも使えます。基本的にDAWとvocalshifterの技術なので。 +- 合成音声に歌わせる・変な声を出させる +- 歌の調整をする(人間でも合成音声でも) +- 普通の動画で音ハメ + +などなど…… +## 前提 +Q. 音MADって著作権的にどうなの? +A. 元ネタ(素材)の作者に訴えられた場合、確実に負けます。 +音MADを作るなら、著作権者に目を付けられないよう、黙認されるよう常に心がけましょう。(要するに二次創作と同じ) + +Q. 音MADって儲かるの? +A. 商用利用が許可されている素材だけで作れば広告を付けることはできますが、それが面白くなる確率はかなり低いです。そもそも儲けようと思わない方がいいです。著作権的にも。 + +Q. 消されないの? +A. 消されます。よっぽどでない限り動画削除だけで済ませてくれますが…… + +原作者や他のMAD製作者への、可能な限りのリスペクトor配慮をしましょう。 +二次創作界の空気感としてもそういう所は特に大事です。というかどの界隈でも発信をするなら半年ROMれ。 + +海外のフェアユースの思考は日本の感覚とかけ離れているので参考にしてはダメです + +## 音MADの技術の情報はどこで手に入る? +音MADでググるのも良いですが、ニ〇二コだと音楽+コメント付きなので情報が多いです(経験談)。素材はほとんど淫〇ですが。 +というか、音MAD自体サムいネタで遊ぶのがメインのような界隈です。勘違いしないように + +淫〇や2〇兄貴周りは面白い情報がちょくちょくあります +~~2〇式動画講座が有能すぎ~~ +純粋な作曲に関する情報も、当然役に立つのでありです + +## 素材集め + +素材を集めます。 +1. 原曲 +MADの原曲となる曲を探して、必要な長さのmp3やmp4を入手します。ボカロなどは作者が配布しているケースがありますが、すべての音を手元で作ればかっこいい……(地獄)。 + +2. 音声素材 +MADの楽器の音やボーカルにするために、素材を集めます。楽器にするならキャラクターの声質や音圧を重視し、環境音をドラムにしましょう。 +キャラクターに歌わせたいなら、一文字一文字あつめるのが一番早い。歌詞をガン無視して面白いセリフを音合わせする方が楽。 + +3. 動画素材 +音MAD制作は音作りがすべてではありません。原作に寄せた動画素材を集めたり、MP4を透過したり……同じジャンルのMAD動画も参考にしましょう。手描きは自信があれば。 + + +二次創作を許可しているコンテンツは探せばかなり多いです。 +実際によく使われている素材は、BB配布素材のように権利者に削除する気がないもの、権利者がtwitterでMAD動画に言及しているものなど、セーフ寄りのグレーがほとんどですが…… +(ニ〇二コで流行っている例のアレの多くは許可されているわけではないので注意) + +## ツール + +- REAPER +DAWならなんでもいいですが、REAPERがおすすめです。有料として紹介されることが多いですが、普通に無料で使えます。 + +- VocalShifter +音声が一定の音程になるよう調整し、素材にできる。音の外しや調子など細かな調整もできる。 + +- Wavetone +テンポ測定や耳コピが必要なら。 + +- 動画編集ソフト +Aviutlなんてソフトは過去の産物なので、普通に最近出たソフトを使いましょう。私はAviutl使います。どれも機能はだいたい一緒です。 + +## メイン +REAPERの操作は覚えれば便利な操作が書ききれないほどあるので、適宜調べてください +![file](./879/image-1670156389510.png) + +web上の適当なオンラインBPM計測などで音楽に合わせてクリックしてテンポを解析したら、REAPERに設定します。 + +原曲(写真上)をREAPERにドロップすれば、グリッド線がなんとなく波形に合います。 + +REAPER上ではマウスの他に Alt+ドラッグ、S、ctrl+shift+n、ctrl+D、F2、Alt+S などの操作をよく使います。適当に試して体で覚えましょう。 + +![file](./879/image-1670157034340.png) + +素材を母音などで分割し、音楽に合うように配置(大抵の場合、八分音符より細かい調整は必要ないです) +原曲の力を借りているので当然、これだけでMADとして聞けるレベルになります。実際、分割と配置のみでランキング上位になるような音MADも多いです。 + +エフェクト(ここではVST)でリバーブを付ける、パン(FXの左のつまみ)をトラックごとに左右にずらすなどすると聞きやすくなります + +![file](./879/image-1670158158026.png) + +次に、音程を変えてみましょう +vocalshifterに素材を渡して素材をダブルクリックすると、ピッチ補正ができます。 +黄色い線でピッチを平坦にすれば、音程を変えやすい素材として利用できます。黄色い線(今はD4)がこの音声の音程なので、覚えておきます。 + +![file](./879/image-1670159435358.png) + +これで作成したピッチ調整済wavファイルをREAPERに持っていきます。複数アイテムを選択してF2から一括でwavファイルを変更できます。 + +アイテムを選択してShift+0、Shift+9で音程を1ずつ変えられるので、MIDIファイルや楽譜、WaveToneなどとvocalshifterの黄色い線を見比べながら調整しましょう。単純作業です。 +![file](./879/image-1670160077059.png) + +これができたら音作りはできたも同然です。 +細かい技術は最初から調べるのではなく、とりあえず触ってから学んだ方が意欲も学習速度も上がります。 + + +場所によって黄色の線を数音高くしたり低くすることでビブラートや感情をつけられます。 +クオリティ高い音MADでは、次の手順を踏むものが割とあります。 +- vocalshifterで平坦にした声をREAPERで並べ、切り貼りタイミング合わせだけする +- それを再度vocalshifterに戻し、音程をつける +- 音程が大きく飛ぶところではしゃくりや裏返り、伸ばすところではビブラートなどをつける + +スケールを外すと目立ちすぎるので、外すときの音は考えましょう。(これ以上は音楽理論の話) + + +Aviutlの編集は割愛しますが、BPMを指定してグリッド線を小説ごとにする設定項目があります。活用しましょう。 +音が鳴るたびに素材を左右反転させる、ちょっとだけ大きくして跳ねさせる、などすると視覚的に楽しくなります。 +あとイージングを親の仇のように多用しましょう。 +モーショングラフィックス関連のプラグインも沢山あるので、Aviutlで何かを始めるときは即座にプラグインを検索しましょう。 + +## おわりに +いかなる創作においても、数字を見るのはやめましょう。作るのが楽しいのです。 +数字は作品のクオリティとは関係なく、題材と宣伝が全てです。マジで。 + +[OUCC Advent Calendar 2022](http://https://adventar.org/calendars/7859 "OUCC Advent Calendar 2022") + +次回のアドベントカレンダーは12/11、Ayaka氏です! diff --git a/src/content/blogs/879/image-1670156389510.png b/src/content/blogs/879/image-1670156389510.png new file mode 100644 index 0000000..64108c6 Binary files /dev/null and b/src/content/blogs/879/image-1670156389510.png differ diff --git a/src/content/blogs/879/image-1670157034340.png b/src/content/blogs/879/image-1670157034340.png new file mode 100644 index 0000000..7a39ef3 Binary files /dev/null and b/src/content/blogs/879/image-1670157034340.png differ diff --git a/src/content/blogs/879/image-1670158158026.png b/src/content/blogs/879/image-1670158158026.png new file mode 100644 index 0000000..4aac323 Binary files /dev/null and b/src/content/blogs/879/image-1670158158026.png differ diff --git a/src/content/blogs/879/image-1670159435358.png b/src/content/blogs/879/image-1670159435358.png new file mode 100644 index 0000000..bb35672 Binary files /dev/null and b/src/content/blogs/879/image-1670159435358.png differ diff --git a/src/content/blogs/879/image-1670160077059.png b/src/content/blogs/879/image-1670160077059.png new file mode 100644 index 0000000..7909fad Binary files /dev/null and b/src/content/blogs/879/image-1670160077059.png differ diff --git a/src/content/blogs/890.md b/src/content/blogs/890.md new file mode 100644 index 0000000..1c76884 --- /dev/null +++ b/src/content/blogs/890.md @@ -0,0 +1,227 @@ +--- +title: 最近のC#のMainの書き方バリエーション +description: | + 執筆者: しおかい + + これは OUCC Advent Calendar 2022の7日目の記事です。 + 空いてたので即興で書きました。 + + 最近の(と言っても.NET6とかまでの話ですが)C#にはいろいろ機能が追加されていまして、Hello Worldもいろいろな書き方が出来るようになっています。 + dotnet new consoleして出来たProgram.csに +author: member +tags: [csharp, advent-calendar, dotnet] +--- + +執筆者: [しおかい](https://twitter.com/Gs_itisitcat) + +これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859)の7日目の記事です。 +空いてたので即興で書きました。 + +最近の(と言っても.NET6とかまでの話ですが)C#にはいろいろ機能が追加されていまして、Hello Worldもいろいろな書き方が出来るようになっています。 +`dotnet new console`して出来たProgram.csに + +```csharp +Console.WriteLine("Hello World"); + +``` + +の1行しかなく、にもかかわらず実行できるのを見て戸惑った人も居るのではないでしょうか。 + +という事で、今回はHello Worldを短く書くための3つの機能を紹介し、最終的に上記の1行コードにしていきます。 +なお以下では特記無き限り`Main`は返り値`void`、引数`string[]`としました。 + +## 0.プレーンな書き方 + +最も基本的な書き方はおそらく以下のようになると思います。 + +```csharp + +using System; + +namespace Plane +{ + public class Sample + { + public static void Main(string[] arg) + { + Console.WriteLine("Hello World"); + } + } +} + +``` + +`System`を`using`し`Console.WriteLine`でHello Worldしています。 +特に言う事は無いでしょう。 + +## 1.ファイルスコープ名前空間 + +上記ではnamespaceでスコープを括っているが、ファイルスコープ名前空間という機能を使えばこの括りを外せ、インデントを1段減らすことが出来ます。 + +```csharp +using System; + +namespace Plane; +public class Sample +{ + public static void Main(string[] arg) + { + Console.WriteLine("Hello World"); + } +} +``` + +これは、ファイル全体が名前空間で括られているのと同じ扱いになります。 + +一応デメリットとして、ファイルスコープ名前空間を使うと1ファイルに1つしか名前空間を(通常の名前空間もファイルスコープ名前空間も)指定できませんが、普通1ファイルに複数名前空間を指定することは無いので問題ないでしょう。 + +## 2.ImplicitUsings + +C#10から`global using`という機能が追加されました。 +これは例えば + +```csharp +global using System; +``` + +とすると、同じプロジェクトにある全てのファイルで`using System`しているのと同じことになります。 +.NET6ではこれを利用して`ImplicitUsings`という機能が提供されています。 +これは読んで字のごとく「暗黙的なusing」であり、いくつかの名前空間を.NETが勝手に`global using`してくれるというものです。 + +コンソールアプリケーションでは + +```csharp +using System; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +``` + +が自動的に行われた扱いになります。 +内容はプロジェクトの種類によって異なる様です。 +これを利用すると、Hello Worldは以下のようになります。 + +```csharp +namespace Implicit; +public class Sample +{ + public static void Main(string[] arg) + { + Console.WriteLine("Hello World"); + } +} +``` + +`using System`が無くなりました。 +幾分すっきりしましたね。 + +## 3.トップレベルステートメント + +C#9から、トップレベルステートメントと言って、名前空間やクラスや関数の外、トップレベルの場所に直接式(ステートメント)を書けるようになりました。 +すなわち、先ほどのHello Worldは、Mainの中身だけ抜き取って以下のように書けます。 + +```csharp +Console.WriteLine("Hello World"); +``` + +これが始めに出てきた1行コードの正体です。 +実際にはコンパイル時にclassとMainが自動生成されている様です。 +注意点として、トップレベルステートメントより上に名前空間やクラスを定義するとエラーになります。 + +```csharp +// これはエラー +namespace TopLevel; +Console.WriteLine("Hello World"); +``` + +```csharp +// これもエラー +namespace TopLevel +{ + +} +Console.WriteLine("Hello World"); +``` + +```csharp +// これもエラー +namespace TopLevel +{ + Console.WriteLine("Hello World"); +} +``` + +```csharp +// これはセーフ +Console.WriteLine("Hello World"); +namespace TopLevel +{ + +} +``` + +また、トップレベルステートメントを書けるのは1プロジェクトに1ファイルまでです。 +なお、関数や`using`は上に定義できます。 + +```csharp +// これはセーフ +void Hello() => Console.WriteLine("Hello World"); +Hello(); +``` + +この関数はプロジェクト全体から見ることが出来ますが、アクセスは出来ないようになっています。 + +ちなみにこのトップレベルステートメント、`await`を使うと自動生成Mainは勝手に`async`になってくれます。 +なので + +```csharp +Console.WriteLine("Hello"); +await Task.Delay(5000); +Console.WriteLine("World."); +``` + +のようにTaskも使用できます。 + +ただし、`ref`は直接使用できません。 + +```csharp +var hoge = new[]{0, 1, 2}; +// エラー +ref var e = ref hoge[^1]; +e++; +Console.WriteLine(hoge[^1]); +``` + +```csharp +// これはセーフ +void Hoge() +{ + var hoge = new[]{0, 1, 2}; + ref var e = ref hoge[^1]; + e++; + Console.WriteLine(hoge[^1]); +} +Hoge(); +``` + +## 終わりに + +というわけで、C#でHello Worldを簡潔に書けるようになる機能3つを紹介しました。 +決まり切ったことを省略できるのは便利で嬉しいことです。 + +大きく見た目の変わるトップレベルステートメントはともかく、ファイルスコープ名前空間とImplicitUsingsは便利なので使っていきたいと思います。 + +## 参考 + +- [【C# 10.0】ファイル スコープ名前空間 (一斉置換設定) | ++C++; // 未確認飛行 C ブログ](https://ufcpp.net/blog/2021/11/fix-all-file-scoped-namespace/) +- [名前空間 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/sp_namespace.html) +- [名前空間キーワード - C# リファレンス | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/namespace) +- [【C# 10.0】 ImplicitUsings (自動 global using) | ++C++; // 未確認飛行 C ブログ](https://ufcpp.net/blog/2021/11/implicitusings/) +- [C# 10.0 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/cheatsheet/ap_ver10/) +- [.NET 6 以降での C# コンソール アプリ テンプレートの変更 - .NET | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/core/tutorials/top-level-templates) +- [C# 9.0 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/cheatsheet/ap_ver9/) +- [【C# 10.0】 トップ レベル ステートメントの変更点 | ++C++; // 未確認飛行 C ブログ](https://ufcpp.net/blog/2021/11/top-level-csharp10/) +- [最上位レベルのステートメント - C# チュートリアル | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/tutorials/top-level-statements) diff --git a/src/content/blogs/901.mdx b/src/content/blogs/901.mdx new file mode 100644 index 0000000..9f9daa7 --- /dev/null +++ b/src/content/blogs/901.mdx @@ -0,0 +1,295 @@ +--- +title: pythonとArduinoと画像認識でタワーディフェンスゲームの自動化をしてみた +description: | + 前書き + この記事はOUCC Advent Calendar 2022の8日の記事です。担当はMrMocchyです。 + 作成したプログラムはGithubに上げていますので全体をご覧になりたい方はこちらへどうぞ。 + この記事ではゲームの自動化という内容を扱っています。これはゲーム開発者が想定していないだろう遊び方ですが、やっていることはプレイヤーの操作をプログラムに代替させているだけです。リソースを違法に爆増させるような類のチートではないのでお目こぼしください。 + また、このゲームをやったことがないと何言ってるのか分からない部分も多いとは思いますが、そういうものだと思ってください。 +author: member +tags: + - python + - automation + - advent-calendar +--- +import Image from '@/components/common/Image.astro' +import Screenshot from "./901/スクリーンショット-4-1024x555.png" + +### 前書き +この記事は[**OUCC Advent Calendar 2022**](https://adventar.org/calendars/7859)の8日の記事です。担当はMrMocchyです。 +作成したプログラムはGithubに上げていますので全体をご覧になりたい方は[こちら](https://github.com/MrMocchy/AutoInfinitode2)へどうぞ。 +この記事ではゲームの自動化という内容を扱っています。これはゲーム開発者が想定していないだろう遊び方ですが、やっていることはプレイヤーの操作をプログラムに代替させているだけです。リソースを違法に爆増させるような類のチートではないのでお目こぼしください。 +また、このゲームをやったことがないと何言ってるのか分からない部分も多いとは思いますが、そういうものだと思ってください。 + +### 自動化したゲームについて +自分は[**Infinitode 2**](https://infinitode.prineside.com/ "Infinitode 2 公式サイト")というタワーディフェンスゲームを長いこと遊んでいるのですが、これはゲーム性として「プレイして得たリソースでタワーを強化し、次のプレイへ」という周回を繰り返す、盆栽ゲーと呼ばれることもあるタイプです。ステージごとにマップも敵の種類も大きく変わる、タワーと敵の相性により与えるダメージが0%~200%になる、無限の強化と無限の敵、etc...、とまあここはレビューサイトではないので切り上げますが、自分にとっては非常に奥の深いゲームだと思っているわけです。 +しかしやりこんでいくとステージごとにある程度の最適解のようなものが見えてくるわけで、それを自動化に定評のあるらしいpythonを用いて放置ファームしようというわけです。 + +### プログラム全体の流れ +上で書いた最適解、すなわちどこに何をするのか、というのをcsvに羅列してそれを順に行わせます。 +csvファイルには[行動、座標、オプション](後ろ2つはあったりなかったり)を列挙しています。別の[行動、カテゴリ、ホットキー]を並べたhotkeys.csvから読み込んだ辞書型を参照して、[座標、カテゴリ、ホットキー]などを持つクラスのリストとして読み込みます。そして現在の所持金などからその行動をできるか判断して実行するというループでプレイさせます。 +現在の所持金や設置・アップグレードのコストなどはPyOCRを使って画面から文字認識で読み取っています。 + +### 操作の自動化 +Infinitode 2にはホットキー機能があり、キーボード入力一つでタワー設置やアップグレードからゲーム進行速度変更までできます。これを**pyautogui**で操作しました。しかし、移動の矢印キーはホットキーで変更できず、pyautoguiが利きませんでした。調べた結果、自作キーボードなどに用いられる**Atmega32U4**というマイコンを積んだ**Arduino**なら操作できるのではと考え、amazonで[Arduino Pro Microの互換機らしきもの](https://www.amazon.co.jp/gp/product/B07J55YWKZ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 "KEYESTUDIO 5V Pro Micro Atmega32U4 マイコン 開発ボード + USBケーブル キット for Arduinoと互換性 アルディーノ アルドゥイーノ アルデュイーノ アルディーノ")を購入しました。あとは + +- [Arduinoを USB/HIDデバイス(仮想キーボード)として活用する](https://qiita.com/pronechia/items/b7a3722391af8e04e292) +- [PC⇔Arduinoのシリアル通信をPython3でやってみた](https://qiita.com/k_zoo/items/cbeda6736d727113b7cd) +- [WindowsのコマンドラインからUSBデバイスについて調べる方法](https://ascii.jp/elem/000/004/085/4085974/) + +を参考に、pythonからArduinoにシリアル通信で文字を送り、それに応じたキーボード入力操作をさせました。 + +```python +# control.py抜粋 +import os +import serial +import time + +#シリアル通信のセットアップ +ser = serial.Serial() +#デバイスマネージャでArduinoのポート確認 +readlines = os.popen("powershell \"Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like \'*Arduino*\'} | Select-Object Caption\"").readlines() +if readlines == []: + print("error @ control") + print("Arduino was not found") + exit() +PORT = readlines[3][15:-2]#"COM5"の形のポートを取得 +ser.port = PORT +ser.baudrate = 9600 #Arduinoと合わせる +ser.setDTR(False) #DTRを常にLOWにしReset阻止 +ser.open() +#終了時に ser.close() をする + +def moveBy(dx,dy): + string=b"" + if dx<0: + string+=b"l"*(-dx) + else: + string+=b"r"*dx + if dy<0: + string+=b"d"*(-dy) + else: + string+=b"u"*dy + ser.write(string) + #ゲーム側のカーソル移動を待つ + time.sleep(0.2*(abs(dx)+abs(dy))) +``` +```c +//move/move.ino +//Arduino側プログラム +#include "Keyboard.h" +void setup() { + Serial.begin(9600); + Keyboard.begin(); +} +void loop() { + if (Serial.available() > 0) { + switch (Serial.read()) { + case 'r': + Keyboard.write(KEY_RIGHT_ARROW); + break; + //以下略 + } + } +} + +``` + +### 画像認識部分 +- [Tesseract+PyOCRで簡易OCRを試してみる](https://qiita.com/nabechi6011/items/3a367ca94dbd208efcc7) +- [PyocrとTesseractで精度の高いOCRを作ってみよう](https://myafu-python.com/work/text-extraction/) +- [PythonでOCRを実行する方法](https://gammasoft.jp/blog/ocr-by-python/) + +などを参考に、ゲーム画面から現在の所持金やコストなどの文字の部分を切り取って文字認識で読み込みました。 +ゲーム内で`3:4`のように表示された座標を読み取る際に特にうまく読み取れないことが多かったので、認識精度を上げるためにいろいろ試しました。その中で効果があったと思われるものを挙げます。 + +- 切り取る画像の範囲を読み取りたい文字列いっぱいにまで狭める。 +- 黒字に白文字は誤認識しやすいようなので、で反転して二値化。(`from PIL import Image`を使用) +- 上の二値化ついでに画像を横に拡大して、細い半角の文字を細めの全角くらいにする。(数字の認識力は向上したが、コロンを誤認識することも増えたので結局使わなかった) +- 切り取る部分によって二値化の閾値を調整 +- `tesseract_layout`という読み取る方法(?)を変更する引数は、いろいろ試したけど結局`6`でよさげだった。 + +また、指定の画像を画面から見つけるのを用いて、設置コストの画面切り替えやポーズ画面の判定をしたりしています。 + +```python +# ocr.py抜粋 +def getImage(_left,_top,_right,_bottom): + #ウィンドウが前面にあるか入力前にチェックし、なければカウントダウンして終了 + foregroundCheck() + # ウィンドウサイズを取得し、ずれを調整 + f = ctypes.windll.dwmapi.DwmGetWindowAttribute + rect = ctypes.wintypes.RECT() + DWMWA_EXTENDED_FRAME_BOUNDS = 9 + f(ctypes.wintypes.HWND(hwnd),ctypes.wintypes.DWORD(DWMWA_EXTENDED_FRAME_BOUNDS),ctypes.byref(rect),ctypes.sizeof(rect)) + # 取得したサイズでスクリーンショットを撮る + image = ImageGrab.grab((rect.left+2+_left, rect.top+31+_top, rect.left+2+_right, rect.top+31+_bottom)) + return image + +def getTextFromImage(rect,border,show=False) -> str: + img=getImage(rect[0],rect[1],rect[2],rect[3]) + if img == None: return + img=img.convert("RGB") + size=img.size + img=img.resize((size[0]*2,size[1]*2)) + size=img.size + img2=Image.new("RGB",(size[0],size[1])) + #2値化して精度を上げる + for x in range(size[0]): + for y in range(size[1]): + r,g,b=img.getpixel((x,y)) + if r+g+b > border*3: + r,g,b=(0,0,0) + else: + r,g,b = (255,255,255) + #img2.putpixel((x*2+1,y),(r,g,b)) + img2.putpixel((x,y),(r,g,b)) + txt = tool.image_to_string(img2,lang,builder=pyocr.builders.TextBuilder(tesseract_layout=6)) + #指定範囲の調整用に切り取った画像と二値化後の画像を並べて表示 + if __name__ == '__main__' or show: + imgs=Image.new("RGB",(img.size[0]+img2.size[0],img.size[1])) + imgs.paste(img,(0,0)) + imgs.paste(img2,(img.size[0],0)) + imgs.show() + return txt +``` + +### その他 + +csvファイルから読み込んだプレイ動作のアルゴリズムは`Algo`という名のclassのリストで保存。 +設置と同時のアビリティ取得や複数回アップグレードなどの特殊な命令は、複数のAlgoを続けてリストに追加している形です。 +```python +#csvdata.py抜粋 +with open(f"csv/{stage}.csv","r") as file: + reader = csv.reader(file) + + line = [row for row in reader] + + for lineNo in range(line.__len__()): + l=line[lineNo] + if l == []: + continue + if not hotkeys.dic.__contains__(l[0]): + error(f"line {lineNo+1} : \"{l[0]}\" is not defined (csv/{stage}.csv)") + if l.__len__() > 2: + #posありのとき + pos=(int(l[1]),int(l[2])) + elif l.__len__()==2: + #posなしでoptionありのとき + l.__add__(["",l[1]]) + if l.__len__() > 3: + #オプションがある時 + if hotkeys.dic[l[0]][0]=="u": + for i in range(int(l[3]) if hotkeys.dic[l[0]][0]=="u" else int(l[3])): + algos.append(Algo(line=lineNo,name=l[0],pos=pos,cate=hotkeys.dic[l[0]][0],hotkey=hotkeys.dic[l[0]][1:],curLoop=i,maxLoop=int(l[3]))) + elif hotkeys.dic[l[0]][0]=="t": + algos.append(Algo(line=lineNo,name=l[0],pos=pos,cate=hotkeys.dic[l[0]][0],hotkey=hotkeys.dic[l[0]][1:])) + algos.append(Algo(line=lineNo,name=f"ability{l[3]}",pos=pos,cate="a",hotkey=hotkeys.dic[f"ability{l[3]}"][1:])) + elif hotkeys.dic[l[0]][0]=="a": + algos.append(Algo(line=lineNo,name=f"ability{l[3]}",pos=pos,cate="a",hotkey=hotkeys.dic[f"ability{l[3]}"][1:])) + continue + algos.append(Algo(line=lineNo,name=l[0],pos=pos,cate=hotkeys.dic[l[0]][0],hotkey=hotkeys.dic[l[0]][1:])) +``` +行動を実行する前にそれを可能か現在地、コスト、ゲームの状態(ポーズ画面やウィンドウがバックグラウンドにあるなど)を画面から読み取ってから判断します。 +実行に成功したかを読み取って成功するまで繰り返すという方法も取れますが、あんまりスマートではないと思ってやめました。一応学習目的でもあるので。 +```python +#main.py抜粋 +def canDo(a:csvdata.Algo): + tile = ocr.getTileName() + if a.cate == "g": + return True + elif ocr.isPause: + return False + elif tile == "": + return False + #現在のタイルに不適切な行動の判別と、コスト取得 + elif tile == "PLATFORM": + if not(a.cate=="t" or a.cate=="m"): + a.print() + control.error("unable to do \""+a.name+"\" on "+tile) + price = ocr.getPuttingPrice(a) + elif tile == "SOURCE": + if a.cate != "d": + a.print() + control.error("unable to do \""+a.name+"\" on "+tile) + price = ocr.getPuttingPrice(a) + elif tile=="ROAD" or tile =="BASE" or tile=="PORTAL" or tile=="MUSIC": + a.print() + control.error("unable to do \""+a.name+"\" on "+tile) + elif hotkeys.dic[tile.lower()][0] == "t": + if a.cate == "a": + #アビリティはノーコスト + return True + elif a.cate != "u": + a.print() + control.error("unable to do \""+a.name+"\" on "+tile) + price = ocr.getUpgradePrice() + elif hotkeys.dic[tile.lower()][0] == "d": + if a.cate != "u": + a.print() + control.error("unable to do \""+a.name+"\" on "+tile) + price = ocr.getUpgradePrice() + #コスト的な実行不可能の判断 + coin = ocr.getCoinNum() + if price == None: + return False + if coin == None: + return False + if a.name == "bounty": + return coin > price*(bountyNum +1) + if coin-saving-price>0: + return True + return False +``` +また、ウィンドウがアクティブでなくなったときはカウントダウンして終了、ポーズ画面になるとコンソールにcontinueと入力すると続ける、などのユーティリティ的機能をつけました。 +```python +# ocr.py抜粋 +def foregroundCheck(): + def waitAndRecheck(): + time.sleep(1) + if hwnd == win32gui.GetForegroundWindow(): + return True + return False + if hwnd != win32gui.GetForegroundWindow(): + if waitAndRecheck(): return + print("exit in") + if waitAndRecheck(): return + print("3...") + if waitAndRecheck(): return + print("2..") + if waitAndRecheck(): return + print("1.") + if waitAndRecheck(): return + error("Infinitode2 window is not foreground") + +isPause = False +def pauseCheck(): + global isPause + if pyautogui.locateOnWindow(imagePass("endgame"),"Infinitode 2",grayscale=False,confidence=0.95): + isPause = True +``` + +そして肝心のプレイのアルゴリズムのcsvですが、未完成です。最初の数分はプレイできているのでそのまま追加すれば大丈夫だろうとは思います。ファーム効率のいいステージはマップも広いのでもっと大変ですが。 + +### プレイ画面 + +
+ +
AutoInfinitode2プレイ画面
+
+{/* [caption id="attachment_903" align="alignnone" width="840"] AutoInfinitode2プレイ画面[/caption] */} +右下の操作ログ以外は単なるプレイ画面なんですが。地味ですね。 +所持金(上部のコインのアイコン)の認識のため、全てのエフェクトを非表示にしているので映像でも地味です。 + +### TODO +- ステージのプレイアルゴリズムの完成 +- ゲームオーバー後に自動的にリスタートするループ +- 変数とかクラスの名前、ファイルの整理 +- ファーム用ステージのプレイアルゴリズム作成 + +### 後書き + +夏にBlenderのアドオン開発で初めて本格的に触ったpythonですが、やはり自動化にも手を出してみたいを思って始めました。特に普段の作業で自動化の需要がなかったのでゲームの自動化にしました。 +切り抜く画像の座標合わせを始め、何かとゲーム画面を参照しながらやらなきゃならなかったので起動しっぱなしだったんですが、プレイしていないのにSteamでのプレイ時間が20時間くらい伸びてました。起動したまま飯食ってた時間も含めているので実際は不明ですが。 + +以上、pythonとArduinoと画像認識でタワーディフェンスゲームの自動化をしてみた、でした。 +ご読了ありがとうございました。 diff --git "a/src/content/blogs/901/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-4-1024x555.png" "b/src/content/blogs/901/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-4-1024x555.png" new file mode 100644 index 0000000..f221270 Binary files /dev/null and "b/src/content/blogs/901/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210-4-1024x555.png" differ diff --git a/src/content/blogs/908.md b/src/content/blogs/908.md new file mode 100644 index 0000000..9bbaba4 --- /dev/null +++ b/src/content/blogs/908.md @@ -0,0 +1,150 @@ +--- +title: dotnet-scriptを使ってC#でも書き捨てプログラムを +description: | + 執筆者: しおかい + + これは OUCC Advent Calendar 2022の12日目の記事です。 + 本題まで長いので読み飛ばしていただいて結構です。 + + 動機 + 大学の講義というものは、工学部・基礎工学部に限らずプログラムを書かされることは間々あります。 + そういったときに、特に言語を指定されなければ自分の慣れている言語で書きたいものです。 +author: member +tags: [csharp, advent-calendar, dotnet] +--- + +執筆者: [しおかい](https://twitter.com/Gs_itisitcat) + +これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859)の12日目の記事です。 +~~[本題](#本題)まで長いので読み飛ばしていただいて結構です。~~ + +## 動機 + +大学の講義というものは、工学部・基礎工学部に限らずプログラムを書かされることは間々あります。 +そういったときに、特に言語を指定されなければ自分の慣れている言語で書きたいものです。 + +ところで、筆者にとってその「慣れている言語」というのがC#なわけですが、これがどうにも講義で使うのには相性が良くないのです(個人の感想です)。 + +講義でプログラムを求められる状況では、うちの場合大抵その一回限りの使い捨ての、コンソールアプリとすら言わないような実行して出力を見るだけといったようなものを書くことになります。 +C++やPythonであれば、(予め環境構築が終わっていれば)適当に1つファイルを作って書き捨て、実行すればそれでいいので何も思うところはありません。 + +ところがC#(.NET)では、一番簡単なコンソールアプリでも、専用にフォルダを用意し、`dotnet new console`してプロジェクトを作らねばなりません。 +しかも、プログラムが記述されたファイルと実行ファイル以外にいろいろファイルやフォルダが生成される始末で、「書き捨て」をするには余りに仰々しすぎるのです。 + +## 試行錯誤 + +もっと、それこそC++やPythonのように、プログラムが記述されたファイルと、せいぜいコンパイル後の実行ファイル程度でどうかしたい。 +そう思った私は、「そもそもdotnet経由で実行しようとするからプロジェクトが要るのでは」と思い、csc.exe(CSharp Compiler)を直接叩いてコンパイルしようと思い立ちました。 +実際これでコンパイル、実行自体はできるのですが、いくつか問題がありました。 + +### インテリセンスが効かない + +まず、始めにやってみて気が付いたのは、単に`.cs`のファイルを開くだけでは、VSCodeでインテリセンス等が全くと言っていいほど効かないのです! +C#と言えば静的解析(ほんとに?)。 +それが効かないのは余りに面倒でした。 + +ではcscを叩く方法でC#にインテリセンスを効かすにはどうするか。 +[いくつか方法はある](https://code.visualstudio.com/docs/languages/csharp#:~:text=Selecting%20a%20project,load%20them%20all.)のですが、最も単純なのは、`*.csproj`をワークスペースに配置することです。 +これは`dotnet new console`すれば簡単に生成できます。 +結局`dotnet new console`が必要なものの、1回で済むならだいぶ状況は良くなったと、初めはそう思いました。 + +### フォルダ内にエントリポイントがあるファイルを複数置けない + +この方法の問題点は何か。それは、VSCodeで開いたフォルダ全体が1つのプロジェクトとして認識されるため、エントリポイントを1つしか持てないということです。 +言い換えれば、`Main`のあるファイルがフォルダ内に複数あると、VSCode上でエラー表示が出るのです。 + +もちろん実際にはcscでコンパイルするのでエラーは無視できるのですが、うっとうしいですし、本当にエラーになっているものを見逃すかもしれません。 +適当にファイルの中身の切り貼りを自動化すれば、一応大した手間なくエラーも無くコンパイルもできる状態にはできるものの、各`.cs`ファイルは単体でコンパイル/実行不可能なうえ、自動化用の諸々(当時私は専用のC#プログラムとtask.jsonで行っていました)がフォルダ内に散乱して、結局当初の目的をあまり達成できていませんでした。 + +### 光明 + +さてそうこうしいたある時、「そういえばC#をインタープリタ的に実行できるのがあった気がする」と思い出しました。 +それについて調べたところ、dotnet-scriptというものを見つけ、これがまさに自分の求めていたものでした。 +[注釈1]:ところで、先ほど「いくつか方法はある」といったところに[C# scripts (CSX)](https://code.visualstudio.com/docs/languages/csharp#:~:text=MSBuild%20projects-,C%23%20scripts%20(CSX),-On%20startup%20the)と書いてあり、これがそのdotnet-scriptのファイルなのですが、ここに書いてあったことにこれを書いている今気が付きました。 +(OUCC BLOGってMarkdonwのfootnote記法使えないのか……) + +というわけで、今回このC# scriptsについての紹介になります。 +**(ここまで前置き)** + +## 本題 + +### インストール + +C# scripts([dotnet-script](https://github.com/dotnet-script/dotnet-script))とはどういうものなのかの話の前に、簡単にインストール方法を説明しておきます。 +といっても、[.NET6か.NET7のSDK](https://dotnet.microsoft.com/en-us/download)をインストールすれば、あとはコマンドラインから`dotnet tool install -g dotnet-script`をするだけです。 + +### できること + +dotnet-scriptでは以下のことができる[ようです](https://ufcpp.net/study/csharp/cheatsheet/apscripting/)。 + +- アプリケーションへの埋め込み +- Interactive実行(これが先ほど言った「インタープリタ」的実行) +- スクリプト実行(主目的) + +このうちアプリケーションへの組み込みは今回説明しません。 + +### Interactive実行 + +コマンドラインで`dotnet script`または`dotnet-script`と入力することで、インタプリンタ環境が起動します。 +文法は通常のC#とほぼ同じです。 +リテラルや変数を`;`無しで打つと値を表示してくれます。 +またおそらくImplicitUsing(後述)によるものですが、初めからある程度using済みなので、少し変わった電卓程度の用途には十分使えます。 + +なお起動後初めの出力が異様に遅いので、適当に数字を打って出力させておくといいでしょう。 + +一応後述のスクリプトファイルを読み込んだり、NuGet参照したもできますが、あまり複雑なことをするには(当然ながら)向いてはいません。 +せいぜい打ち間違いに強い電卓でしょう(個人のry)。 + +なお終了は`#exit`で行えます。 + +### スクリプト実行 + +さて本題、求めていたスクリプト実行です。 +VSCodeの場合、ワークスペースで`dotnet script init`とすれば、直下に`omnisharp.json`と`main.csx`が、`.vscode`下に`launch.json`が生成されます。 + +これができればあとは好きにC#を書いていけます。 +新規にスクリプトファイルを生成するのは`dotnet-script new filename`でできます。 +(普通にファイルを作っても問題ありませんが、たまにスクリプトファイルとして認識してくれずインテリセンス等が効かなくなることがあります。その場合、VSCodeを開きなおせば問題ありません。) + +注意点として、Mainを書くと、実行時に +`warning CS7022: プログラムのエントリ ポイントは、グローバル コードです。エントリ ポイント 'test.Main(string[])' を無視します。`と言われて読み飛ばされてしまうので、トップレベルステートメントの記法を使用しましょう。 +また、同じワークスペースで拡張子が`.cs`のファイルを開いてしまうとインテリセンス等が効かなくなる場合があるので、拡張子を間違えないようにしましょう。 +スクリプトファイルの拡張子は`.csx`です。 +万一インテリセンスが効かなくなっても、`.cs`なファイルを閉じてからVSCodeを開きなおせば問題ありません。 + +またImplicitUsingと思われる暗黙的にusingされている名前空間もあります。 +一覧を見つけられなかったので、VSCodeのオートコンプリートを使って、aからzまで一文字打っては補完候補を見ていくという~~頭の悪い~~手法で調べたところ、dotnet-scriptで暗黙的にusingされているのはおそらく以下の通りです。 + +```csharp +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; +using System.Text; +using System.Diagnostics; +using System.Dynamic; +using static System.Console; +``` + +コンソールアプリケーションとも少し違うようです。 +`System.Console`が`using static`されているおかげで、標準出力が`WriteLine()`で済むので楽です。 + +NuGet参照も使え、ファイル先頭に`#r "nuget: PackageName, 1.0.0"`のように書くことで参照できます。 +ただし、これを追記した後はVSCodeを開きなおさないと、名前空間等をVSCodeが認識してくれないのが難点です。 + +また、実行は`dotnet-script filepath`で行えます。 +VSCodeなら`dotnet script init`していれば`lounch.json`が生成されているはずなのでF5でもいいでしょう。 + +一応コンパイル(発行)も`dotnet-script publish filepath`で行えます。 +ただし何故かワークスペース直下にあるファイルをpublishできないので、コンパイルしたい場合は一段下の階層に入れましょう。 + +詳細な記法は[GitHub](https://github.com/dotnet-script/dotnet-script)を見るといいと思います(ほぼトップレベルステートメントと変わりませんが)。 + +トップレベルステートメントやImplicitUsingが分からない場合、[アドベントカレンダー7日目の私の記事](/blog/890)を見ていただければと思います(露骨な宣伝)。 + +## 終わりに + +というわけで、dotnet-scriptによるスクリプト実行によって、C#で快適に書き捨てプログラムを書けるようになりました。 +これで、「『ファイルを作ってハイ実行』って訳にはいかないから気軽にC#を使えない」と言ってC++やPythonを使っていた皆さんも、思う存分C#を書けますね! diff --git a/src/content/blogs/918.md b/src/content/blogs/918.md new file mode 100644 index 0000000..17a6a23 --- /dev/null +++ b/src/content/blogs/918.md @@ -0,0 +1,110 @@ +--- +title: StackEditで非プログラマーと協同開発した話 +description: | + 執筆者:yuyu + + この記事は OUCC Advent Calendar 2022 の18日目の記事です。前回はみやじさんによる「ASP.NET Core を使ってREST APIを作ってみる」でした。 + + 最近の良かったことはサッカーのワールドカップで日本が出た全試合をリアタイし、サッカーに少し詳しくなれたことです。 + + もともとは「オフサイドってなんやろ」「4-4-2とは?」というレベルの知識で、選手に関しても長友選手や AbemaTV で解説を務めた本田圭佑などの時代しか知りませんでした。解説や Twitter のつぶやきを理解するためにルールや戦略論(フォーメーションなど)を調べていきサッカーの奥深さに少し気づけたかなと思います。 +author: member +tags: [advent-calendar, markdown] +--- +執筆者:yuyu + +この記事は OUCC Advent Calendar 2022 の18日目の記事です。前回はみやじさんによる「ASP.NET Core を使ってREST APIを作ってみる」でした。 + +最近の良かったことはサッカーのワールドカップで日本が出た全試合をリアタイし、サッカーに少し詳しくなれたことです。 + +もともとは「オフサイドってなんやろ」「4-4-2とは?」というレベルの知識で、選手に関しても長友選手や AbemaTV で解説を務めた本田圭佑などの時代しか知りませんでした。解説や Twitter のつぶやきを理解するためにルールや戦略論(フォーメーションなど)を調べていきサッカーの奥深さに少し気づけたかなと思います。 + +さて、今回の記事では、今年の春に非プログラマーと協同で web ページの作成を担当し、リーダーとして動いていた経験をもとに、当時意識していたことを書きたいと思います。 + +## 目次 + +1. はじめに:背景 +2. 問題点 +3. 解決策 +4. 導入:開発裏話 +5. 結果 +6. おわりに +7. リンク + +## 1. はじめに:背景 + +私は別の団体と兼部をしているのですが(以下、G隊)、G隊では春の学祭にてクイズを使った出し物をしようということになりました。教室の中で完結するのですが、スタンプラリーのように順番に数問のクイズを解いていく形式で、最初の頃は設問を印刷して来場者に自分のペースで順番に解いてもらおうという議論でした。しかし、「様々な種類のクイズを用意したい」「答えは別用紙で用意する必要がある」「感染予防のため同じ紙を何枚もすらなければならない」などの理由から紙媒体ではなく電子媒体を用い、例えばQRコードを読み取ってもらってリンク先の web ページでクイズを読めるようにしようということになりました。結果的に印刷費用を抑えられるという利点もありました。 + +## 2. 問題点 + +非常にスマートで費用もかからないので現代の価値観に合った素晴らしい企画に思われましたが、ひとつだけ問題がありました。それは web ページを作ることができる人材の不足でした。 + +当時は私一人が G 隊の web 開発を担当していました。クイズ作成は複数人のチームで分担して行っていましたが、それを web ページにする仕事はひとりでやるには業務量が多すぎました。ぜひ web ページ作成も分担したいところですが、G 隊には web プログラマーは私一人しかいなかったので HTML & CSS で対応することは困難でした。 + +## 3. 解決策 + +HTML & CSS が使えないので Markdown 記法を用いて書けるシステムを採用すべきだと考えました。 + +Markdown(マークダウン)は、文章の書き方です。デジタル文書を活用する方法として考案されました。特徴は、 + +- 手軽に文章構造を明示できること +- 簡単で、覚えやすいこと +- 読み書きに特別なアプリを必要としないこと +- それでいて、対応アプリを使えば快適に読み書きできること + +などです。Markdownはジョン・グルーバー(John Gruber)によって2004年に開発され、最初は Daring Fireball: Markdown で公開されました。その後、多くの開発者の手を経ながら発展してきました。 +Markdown とは(日本 Markdown ユーザー会) + +Markdown 記法であれば少なくとも HTML & CSS よりは非プログラマーにも簡単に web ページを作ることができます。 + +では、Markdown 記法を使うとして、どんなツールを使えばよいのでしょうか。条件をいくつか出しました。 + +共有しやすい(Git Hub 以外の方法で) + +html ファイルに変換できる(サーバーをレンタルしていなかったため、GithubPages を使う必要があった) + +無料のサービスである + +結果、"StackEdit"なるサービスを発見しました。これはブラウザ上で Markdown 記法を使って web ページを作ることができるサービスで、アプリのダウンロードが不要だったこともありがたく感じました。 + +StackEdit の素晴らしい点は Google Drive と連携できる点でした。G 隊はファイルの共有などは Google Drive で行っていたので今まで通りに各自で作成した web ページを Google Drive で共有できるというのは魅力的でした。進捗管理にも大変役立ちました。 + +また、html ファイルにエクスポートすることもできました。G 隊はサーバーをレンタルしておらず、web ページを持つために私の GitHub アカウントで GithubPages を作成して公開していました。GithubPages には html ファイルと css ファイルしか使えないという先入観がありました( md ファイルでもアップロードできたのかもしれないがよくわからん)。 + +StackEdit のエディター画面 + +デザインは凝ったものにできませんが、学祭でしか使わないページになるだろうということで妥協することにしました。 + +こうして、学祭担当のチームのみんなには StackEdit を使ってクイズのページを作成してもらい、Google Drive に共有されたファイルを私が html ファイルに変換して GitHub のリポジトリにアップロードするという体制ができあがりました。 + +## 4. 導入:開発裏話 + +ここまでは企画運営の方針に関しての話でしたが、ここからはチームのみんなに環境構築をしてもらう段階となります。導入時に参照するドキュメントを作成し、Google Drive 上に共有しました。 + +導入用ドキュメント + +意識したことは IT 用語(プログラミングの用語や web 開発の文脈の用語)を使わないよう徹底したことです。自分の知らない言葉で埋め尽くされたドキュメントは読む気にならないでしょう。例えば英語の文章において98%以上の語彙を理解して初めて適切な読解が可能になると言われています(Hu & Nation, 2000; Laufer, 2010; Schmitt, Jiang & Grabe, 2011)。知らない語彙が一定数あると読解精度が落ちるわけですが、個人的にはこの現象は外国語の文章に限らず専門的な内容の文章を読む場合でも変わらないと思っています。 + +ドキュメントの整備に加えて、質問しやすいような環境づくりも意識しました。定例会議では何か困ったことがないか尋ね、相談してもらえるようにしました。 + +準備が整ったら各自好きなタイミングでクイズを書き、Google Drive にアップロードしてもらいました。それを私がチェックするという流れです。 + +## 5. 結果 + +クイズ画面 + +クイズ画面は上のような感じになりました。スッキリとした印象で、問題を解くうえではかなり見やすい画面になっているように思います。プログラミングを使わなくてもここまでできるのは素敵ですね。 + +学祭当日は、私は忙しかったので運営として参加することはできませんでしたが盛況だったと聞いています。貢献できたようで嬉しい限りです。 + +また、この StackEdit 導入をきっかけに G 隊内において web 開発を始めてみることへの心理的抵抗感が弱まり、チームでの web 開発につなげやすくなったことは思わぬ幸運でした。 + +## 6. おわりに + +新しくプログラミングに興味を持ってもらうには、「なんだか難しそう」という食わず嫌いを払拭させ、自分にもできそうだと思ってもらうことが何よりも重要でした。これはプログラミングに限らず新たな技術を導入する時には常に心掛けるべきことでしょう。チームの抵抗感を和らげ、スムーズな導入を目指しましょう。 + +OUCC Advent Calendar 2022 、次回の担当は ciffelia さんです!お楽しみに! + +## 7. リンク + +StackEdit:https://stackedit.io/ \ No newline at end of file diff --git a/src/content/blogs/1.md b/src/content/blogs/924.md similarity index 99% rename from src/content/blogs/1.md rename to src/content/blogs/924.md index 5051453..3269856 100644 --- a/src/content/blogs/1.md +++ b/src/content/blogs/924.md @@ -6,6 +6,8 @@ tags: - csharp - asp.net - advent-calendar + - dotnet + - rest-api --- これは [OUCC Advent Calendar 2022](https://adventar.org/calendars/7859) の17日目の記事です。 diff --git a/src/content/blogs/935.mdx b/src/content/blogs/935.mdx new file mode 100644 index 0000000..288fbcc --- /dev/null +++ b/src/content/blogs/935.mdx @@ -0,0 +1,137 @@ +--- +title: Discordの読み上げBotを作っている話 +description: | + この記事は OUCC Advent Calendar 2022 の 19 日目の記事です。昨日の記事は yuyu さんの「StackEditで非プログラマーと協同開発した話」でした。 + + はじめまして、ciffelia です。今日は私が開発している Discord 読み上げ Bot「Koe」と Koe で採用している技術をご紹介させていただきます。 +author: member +tags: [advent-calendar, rust, discord-bot, docker] +--- +import Image from '@/components/common/Image.astro' +import VoicevoxLogo from "./935/logo-300x150.png" +import KoeScreenshot from "./935/koe-screenshot-1024x594.png" + +この記事は OUCC Advent Calendar 2022 の 19 日目の記事です。昨日の記事は yuyu さんの「StackEditで非プログラマーと協同開発した話」でした。 + +はじめまして、ciffelia です。今日は私が開発している Discord 読み上げ Bot「Koe」と Koe で採用している技術をご紹介させていただきます。 + +

+ Koeのロゴ + + https://github.com/ciffelia/koe + +

+ +# 読み上げ Bot って何? + +Discord のテキストチャンネルに送信されたメッセージをボイスチャンネルで読み上げてくれる Bot です。 +聞き専の人たちが送信したメッセージを合成音声で代読し、会話に参加しやすくしてくれます。 + +Koeが動作する様子を写したスクリーンショット + +# 特徴 + +- VOICEVOX を使用した高品質な音声合成 - ずんだもん、四国めたんを含む 10 人以上の音源から好みに合ったものを選択可能 +- 特定の語句の読み方を設定する辞書機能 + - 読み方が難しいユーザー名の人がいても安心 +- ネタバレ(`||`で囲むやつ)は読み上げをスキップ + +# 読み上げの仕組み + +ボイスチャットに参加した Koe は概ね以下の手順でテキストを読み上げています。 + +1. Discord API からメッセージを受信 +2. Redis から辞書データを取得 +3. 読み上げるテキストを生成 +4. Redis から声の設定(プリセット ID)を取得 +5. VOICEVOX Engine にテキストとプリセット ID を送信 +6. VOICEVOX Engine から合成音声の wav データを受信 +7. ffmpeg で音声データを変換 +8. 音声データを Opus にエンコードし、Discord に送信 + +# 使っている技術 + +## プログラミング言語: Rust + +Koe は Rust で書かれています。Rust は高速かつメモリ安全なプログラミング言語で、以下のような特徴があります。 + +- 機械語にコンパイルされる + - C や C++ と同じコンパイラ言語です。 + - Python や JavaScript のようなインタプリタ言語と比較して非常に高速に動作します。 + - ただしコンパイルは比較的遅いです。 +- GC が存在しない + - 後述するように、変数の生存期間がコンパイル時に確定するためガベージコレクタが存在しません。 + - GC がメモリ管理を行っている Go と比較して高速に動作します。 + - Discord が Go から Rust に移行してパフォーマンスを改善した話が面白いです: Why Discord is switching from Go to Rust +- 型システムがメモリ安全性を保証してくれる + - 変数がコードのどの部分で使われているのかコンパイラがチェックします。 + - メモリ安全であることが保証されないとコンパイルが通りません。 + - Rust の学習が難しいと言われる所以はこのメモリ安全性チェックにあります。 + - use-after-free をはじめとする C/C++ で起こりがちなバグを未然に防ぐことができます。 + - 他の言語に類を見ない特徴的な機能です。 +- 標準のパッケージマネージャがある + - Cargo と呼ばれるパッケージマネージャが同梱されています。 + - Cargo ではパッケージのことを crate と呼び、crates.io で検索できます。 + - Node.js の npm と同じような使い心地です。 + - npm ほど酷くはありませんが、Depenency Hell に陥ることもあります。 +- 高機能で書きやすい + - 開発が活発なため、便利な機能が他の言語から多数取り入れられています。 + - 例えば、関数型言語のように、配列に`map`や`filter`を適用できます。 + - JavaScript や C#のように、`async` / `await`で非同期処理を行うこともできます。 + - シンプルさを重視し限られた機能のみを実装する Go とは対照的です。どちらが良いか好みが分かれる部分かもしれません。 + +## Discord API: serenity / songbird + +Rust で Discord API を扱うための crate として最も有名なのが serenity です。基本的な API 呼び出し機能に加えてキャッシュ機構を備えており、Discord API の扱いにくい部分を隠蔽してくれます。 +また、Discord のボイスチャットに関する API を扱うための crate が songbird です。ボイスチャンネルに Bot として接続し音声を流す機能を備えています。 + +## 音声合成: VOICEVOX Engine + +読み上げソフトウェアとして有名な VOICEVOX から音声合成エンジンを切り出したものが VOICEVOX Engine です。 +VOICEVOX Engine に対して HTTP リクエストでパラメータを送ると、合成された音声データを返してくれます。 + +## データベース: Redis + +Redis は key-value store として使えるデータベースです。いわゆる NoSQL データベースの一つです。 +Koe では辞書やユーザーの声などの設定を保存するために使用しています。 + +## コンテナ管理: Docker + +Docker は言わずと知れたコンテナ管理ソフトウェアです。コンテナとは、超軽量な Linux の仮想マシンのようなものなのですが、簡潔かつ正確に語るのは難しいので詳細は割愛します。 +Koe ではdocker-compose.ymlを配布しており、コマンド一つで簡単に Koe、Redis、VOICEVOX Engine のコンテナを起動・停止できるようにしています。 + +## リリース自動化: GitHub Actions + +GitHub Actions は、GitHub の管理する仮想マシン上で様々なイベントをトリガーとして任意の処理を実行できるサービスです。 +Koe では以下のような処理を自動化しています。 + +- リポジトリにコードがプッシュされたとき + - コンパイルが通るかチェック + - コンテナをビルドして GitHub Container Registry にプッシュ +- 私がリリースボタンを押したとき + - 新しいバージョンをリリースするコミットを作成 + - バージョンに対応する Git のタグを作成 + - バージョンに対応する Docker コンテナのタグを作成 + - リリースノートを作成 + +## 依存しているソフトウェアのアップデート自動化: Renovate + +Koe は様々なソフトウェアに依存しています。先述した serenity, songbird, Redis に加えて、設定ファイルのデシリアライザとして Serde、HTTP クライアントとして reqwest などを利用しています。 +それらの新しいバージョンがリリースされるたびに手動で更新を行うのは面倒なので、アップデートを自動化する Renovate を導入しました。Renovate は指定した時間に自動で Pull Request を作成し、ビルドが通るとマージしてくれます。 + +# おわりに + +Koe を使ってみたくなった方はドキュメントを読めば簡単に導入できます。ソースコードが公開されているため改造も容易です。ぜひお試しください。 +また、今回ご紹介した技術の多くは Discord Bot の開発以外にも活用できるものです。これらの技術を活用し、効率的なソフトウェア開発に役立てていただければ幸いです。 diff --git a/src/content/blogs/935/koe-screenshot-1024x594.png b/src/content/blogs/935/koe-screenshot-1024x594.png new file mode 100644 index 0000000..4fb21c4 Binary files /dev/null and b/src/content/blogs/935/koe-screenshot-1024x594.png differ diff --git a/src/content/blogs/935/logo-300x150.png b/src/content/blogs/935/logo-300x150.png new file mode 100644 index 0000000..28d5a3e Binary files /dev/null and b/src/content/blogs/935/logo-300x150.png differ diff --git a/src/content/blogs/974.md b/src/content/blogs/974.md new file mode 100644 index 0000000..5e3608a --- /dev/null +++ b/src/content/blogs/974.md @@ -0,0 +1,103 @@ +--- +title: お気に入りの量産型・地雷系ファッションブランドについて語る +description: | +  この記事はOUCC Advent Calendar 2022の22日目の記事です。前回の記事はMedjedさんの「あなたの継承大丈夫?委譲で書き換えた方がよくない?」でした。 +  皆様初めまして。OUCC2回生の紅茶です。ciffeliaさんの記事はもちろん、他の部員の記事のクオリティの高さに圧倒されるばかりです。watamarioさんの「OUCC の 3 年間を振り返る [前編]」を見て、技術系だけでなく文化的な話をするのもありだと思ったので(私に技術力がないので)趣味の話をします。 +author: member +tags: [advent-calendar, fashion] +--- + この記事は[OUCC Advent Calendar 2022](https://adventar.org/calendars/7859)の22日目の記事です。前回の記事はMedjedさんの[「あなたの継承大丈夫?委譲で書き換えた方がよくない?」](https://qiita.com/raedion/items/26f9f19e92d1826c9a7e)でした。 + 皆様初めまして。OUCC2回生の紅茶です。ciffeliaさんの記事はもちろん、他の部員の記事のクオリティの高さに圧倒されるばかりです。watamarioさんの[「OUCC の 3 年間を振り返る [前編]」](/835)を見て、技術系だけでなく文化的な話をするのもありだと思ったので~~(私に技術力がないので)~~趣味の話をします。 + + 実はここ1年ほどで**「量産型・地雷系ファッション」**にハマりました。 + + 量産型とはすとぷりやあんスタなどの若い男性アイドルのライブ会場によくいる「ザ・女の子!」みたいな恰好のことで、地雷系とは「明日、私は誰かのカノジョ」に出てくるホスト狂いの女の子「ゆあてゃ」みたいなザ・女の子だけどピアスバチバチで黒の多いどこか病んだ印象の恰好のことです。 + + 今は流行が多少違いますが違いがわかりやすいツイートがあったので載せておきます。 +  [地雷系と量産型の違い](https://twitter.com/kappe_reeka/status/1268867552903495680) + + 量産型・地雷系ファッションで知らない人はいないインフルエンサー・イモちゃんが有名どころのブランドをまとめた記事があるので紹介しておきます。これで大体は網羅できています。 +  [2020年 最新版!おすすめの地雷女子向けブランド](https://potaku-cosme.com/zirai-brand/) +  [【2021年最新版】おすすめの量産型ヲタク向け洋服ブランドまとめ](https://potaku-cosme.com/osisika_katan/#toc2) + + これだけ大量のブランドがあると「どこから探せばいいのか分からない!」となる方もいらっしゃると思います。~~(OUCCに量産地雷服を着る人が私以外いるのかはツッコんではいけない)~~そこで私が個人的におすすめするブランドを書き残そうと思います。 +  + おすすめブランド一覧は、安い順(最後のみ例外)に + 1. [MA*RS](https://lilimpark.jp/) + 2. [LIZ LISA](https://www.tokyokawaiilife.jp/) + 3. [Secret Honey](https://www.rakuten.ne.jp/gold/secrethoney/) + 4. [BUBBLES](https://www.sparklingmall.jp/c/bubbles) + +の5つです。名前をクリックしていただければ公式通販サイトに飛べます。 + + + 最初に**MARS**を紹介します。 + 昔はギャル系ブランドとして有名だったのですが、時代の流れもあって次第に地雷系を押し出すようになりました。 + このブランドで特徴的なのは + - プチプラ価格で手に入る服 + - トップスの胸元の取り外し可能なサテンリボン + - 界隈で有名なインフルエンサーとのコラボ + +です。 + + 一例を挙げると、[肩開きクロスブラウス](https://lilimpark.jp/shopdetail/000000004938/rearrival/page1/recommend/) + ![肩開きクロスブラウス](https://makeshop-multi-images.akamaized.net/lilimpark/shopimages/38/49/1_000000004938.jpg?1662533627) + (画像は公式通販サイトより引用、これより下に登場する画像も同様) + + まず値段が4950円と量産型・地雷系ファッションブランドの中では安いです。ユニクロやGUに比べたら高いですが、後述のようにトップスで10000円弱は行くのが普通の世界なので**「安い」**です。 + 安い分他のブランドに比べてデザインや質感で見劣りする部分もありますが(特にボトムスで顕著)、地雷系デビューにはもってこいです。 + もっと安い服で言えばSHEINとかに有名な量産型・地雷系ブランドをパクった服が1000円とかで売られていますが、クオリティは悲惨そのものです。 + また画像を見ていただいたら分かるように、胸元にサテンリボンがついていますよね。これはMARSならではです。 + そしてこのモデルさんは「砂糖みう」と言い、界隈では割と有名な方です。 + + +次に**LIZ LISA**を紹介します。 + MARS同様昔はギャルブランドとして有名でしたが、今は量産型寄りのブランドになりました。 + このブランドで特徴的なのは + - リボンとビジュー、フリルをふんだんに使った服 + - とことん甘い、ガーリーな世界観 + - クオリティの高い小物類 + + です。 + + 界隈で非常に知名度の高い服があるので紹介しておきます。[セーラーカラーセットアップ](https://www.tokyokawaiilife.jp/fs/lizlisaadmin/125-6009-0) + ![セーラーカラーセットアップ](https://lizlisaadmin.fs-storage.jp/fs2cabinet/125/125-6009-0/125-6009-0-m-02-pl.jpg) + 画像を見ていただいたら分かるように、リボンとビジュー、フリルが目立つデザインになっていますよね。実は後ろもリボンになっていて、結んでウエストアップできる優れものです。値段は11880円と跳ね上がりましたが上下セットの中ではまだ安いほうです。 + モデルさんもフランス人形を思わせるような儚く美しい雰囲気で、服の女の子らしさを前面に打ち出したデザインも相まって本当に人形がたたずんでいるようです。 +  + 小物類も同様で、リボンとビジューをふんだんに使ったデザインになっています。 + [ジュエリー4つセットリボンクリップ](https://www.tokyokawaiilife.jp/fs/lizlisaadmin/all-goods_hair/125-9203-0) + ![ジュエリー4つセットリボンクリップ](https://lizlisaadmin.fs-storage.jp/fs2cabinet/125/125-9203-0/125-9203-0-m-01-pl.jpg) +  他のブランドの小物類が「正直100均で材料買って工作すれば作れるよね…」というものが多い中、リズリサは並大抵ではないこだわりを感じます。デザインが圧倒的に優れていると思いますし、大きさや色も豊富で見ていて楽しいです。 + + + 次に**Secret Honey**を紹介します。 + 昔はマリンテイストの服やディズニーコラボの服を販売していました。特にディズニーコラボの服はクオリティが高く、転売が大量に発生したこともあったそうです。 + このブランドで特徴的なのは + - ウエストの引き締まった、女性らしさと可愛さを両立させたクオリティの高いセットアップ + - レトロだけどトレンドを追うガーリーなデザイン + +です。 +[アクセサリーリボン長袖セットアップ](https://item.rakuten.co.jp/secrethoney/5sa503/) +[スタンドフリルラッフルセットアップ](https://item.rakuten.co.jp/secrethoney/5sa202/) +![アクセサリーリボン長袖セットアップ](https://image.rakuten.co.jp/secrethoney/cabinet/2022aw/5sa503-m14.jpg) +![スタンドフリルラッフルセットアップ](https://image.rakuten.co.jp/secrethoney/cabinet/2022aw/5sa202-m1.jpg) + Secret Honeyのセットアップは界隈では非常に有名で、種類によっては販売開始から数日で店舗から在庫がなくなることもあります。 + フリルやリボンといった女の子が憧れる要素をたっぷり詰め込んだデザインだけでなく、品質のいい布、後ろのウエストリボンやウエストがきゅっと引き締まる服の作り、程よい脚の露出によってスタイルアップ効果も抜群といった要素もあって絶大な支持を得ています。 + HEP FIVEに行ったらSecret Honeyのセットアップを着た女の子にたくさん出会えるので幸せになります。 + LIZ LISAでも「リボンとフリルをふんだんに使ったデザイン」と出てきましたが、また違った雰囲気に仕上がっていますよね。それはこのSecret Honeyのコンセプト「レトロガーリー」にあります。LIZ LISAは女の子らしさを全面的に打ち出したかわいらしいデザインになっているのに対して、Secret Honeyでは少し大人っぽい落ち着いたデザインになっています。ここにも各ブランドのデザイナーさんのこだわりを感じますね。 + その分お値段は張って、**上下セットで15000円**とか恐ろしい値段になりますが買う価値は絶対にあります。自分を大好きになれる素敵な服です。 + + + 最後に**BUBBLES**を紹介します。 + BUBBLESは量産型・地雷系ブランドとしても有名ですが、圧倒的に有名なのは黒エナメルの厚底シューズです。界隈ではたいていの人がBUBBLESの厚底を持っています。 + [ダブルバックル厚底シューズ](https://www.sparklingmall.jp/c/sparklingmall_all/sparklingmall_shoes/B18203) + ![ダブルバックル厚底シューズ](https://sparklingmall.itembox.design/product/073/000000007326/000000007326-21-xl.jpg?t=20221220190242) + 見てくださいこの厚底!!!なんと**つま先で6cm、かかとで13cm**あります。値段も7590円と可愛くないですが、圧倒的に可愛いですし、スタイルを盛れますし、可愛さ最強の自分になれます。「背が高くて履けない…」や「厚底初心者だからもっと低いのがいい」と言う方に向けて、かかとの高さが9.5cmや5cmの同デザインのものも出ているのでご安心ください。 + 他にも様々なデザインの黒厚底シューズが出ているのでぜひサイトをのぞいてみてください。 + + +以上、個人的お気に入りブランド紹介を終わります。 +皆様の量産型・地雷系ライフが良くなることを祈ります。 +最後まで見てくださりありがとうございました! + \ No newline at end of file diff --git a/src/content/blogs/988.md b/src/content/blogs/988.md new file mode 100644 index 0000000..c534753 --- /dev/null +++ b/src/content/blogs/988.md @@ -0,0 +1,222 @@ +--- +title: GolangでTello eduを遊んでみた? +description: | + この記事はOUCC Advent Calendar 2022の24日目の記事です。前回の記事はカキのたねさんの「c#でAWSLambda関数を作ってみた」でした。 + + 今回の記事のタイトルは「GolangでTello eduを遊んでみた?」です。 + なぜ?がついているのでしょうか。考えてみてください。 +author: member +tags: [advent-calendar, go, tello] +--- + +この記事はOUCC Advent Calendar 2022の24日目の記事です。前回の記事はカキのたねさんの「c#でAWSLambda関数を作ってみた」でした。 + +今回の記事のタイトルは「GolangでTello eduを遊んでみた?」です。 +なぜ?がついているのでしょうか。考えてみてください。 + +
+
+
+ +
+
+はじめまして、Namifuji です。今日は家庭でも簡単に楽しむことができるドローンtello eduについてご紹介させていただきます。 + +## まず、tello eduとはなんぞ? + +Tello、Tello eduはドローン界のAppleと言われるDJIと、CPU部分をIntelで共同開発し、Ryze Techから販売されているトイドローンです。機能的にも立派にドローンです。 +https://www.ryzerobotics.com/ +上記のURLから約1万〜2万円で購入することができます。 +そのため、皆さんのクリスマスプレゼントには持ってこいの品だと思います。 +法律の許す範囲内で楽しんでいただけたらなと思います。 +またTelloはスマホのアプリもしくはGolang、Python、Scrachを通じて操作することができます。 +さらに取得した飛行風景をVRや、スマホ、コンピュータを用いることで手軽に見ることができます。 +他にも顔識別や音声認識の機能も追加することができるようです。 + + +## 環境 +OS: macOS Ventura 13.0.0 +Goのバージョン: go1.16 darwin/arm64 +Pythonのバージョン:Python 3.10.9 + +IDE: Goland +エディタ: visual studio code + +## 準備 + Golangのフレームワークであるgobotをインストール + ```go +$ go get -d -u gobot.io/x/gobot/... +``` + +## やったこと + +1、ドローン自体の動作確認 +スマホ版のアプリからドローンに接続し、動作確認 + +結果:飛んだ 。 +
+ここで先に以下で用いるドローンの飛行写真はアプリやGolangなどで飛ばした場合とすべて共通で用います。理由としましてはドローンを飛ばすときに発生する音があまりにも大きくて、近所迷惑にならないか不安で、撮る余裕があまりありませんでした。 +
+
+![](./988/IMG_0293-1-2.jpg) + +
+
+ +2、 gobotのフレームワークを使わずに、飛ばす。 + +```go +package main + +import "net" + +func main() { + conn, _ := net.Dial("udp", "192.168.10.1:8889") + conn.Write([]byte("command")) + conn.Write([]byte("takeoff")) + conn.Write([]byte("flipoff")) +} + +``` +
+![](./988/IMG_0293-1-2.jpg) +
+結果:飛んだ 。 +
+ +
+3. gobotを使って飛ばす。 + +```go +package main + +import ( + "fmt" + "time" + + "gobot.io/x/gobot" + "gobot.io/x/gobot/platforms/dji/tello" +) + +func main() { + drone := tello.NewDriver("8888") + + work := func() { // この関数内に実行する動作を設定 + drone.TakeOff() + + gobot.After(5*time.Second, func() { + drone.Land() + }) + } + + robot := gobot.NewRobot("tello", + []gobot.Connection{}, + []gobot.Device{drone}, + work, + ) + + robot.Start() +} +``` +
+![](./988/IMG_0293-1-2.jpg) +
+結果:成功。 +
+
+ +4 pythonでも飛ぶの確認 +```python +import socket +import time + +socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +tello_address = ('192.168.10.1' , 8889) + +socket.sendto('command'.encode('utf-8'),tello_address) +socket.sendto('takeoff'.encode('utf-8'),tello_address) +``` +結果:成功 + +上記で用いたコードから分かるように、ドローンを飛ばすためのプログラム自体はとても簡単に書けます。 +接続先のipアドレスとポートを設定し、コマンドを送信するだけで遊べます。 +Golang自体も簡単なプログラムを書く程度であれば、他の言語で何か作った経験があればすぐに理解できると思います。 + +上記の例ではただ単にドローンを離陸させただけです。 + +5 それ以外にしたこと +そこでドローンを空中で回転させたり、ドローンの高度を設定できるようにします。以下のgobotのドキュメントの参考にしました。(https://pkg.go.dev/gobot.io/x/gobot/platforms/dji/tello) +それによって入力したキーに応じて空中で一回転したり、時間と共に高度を上げたり、下げたりすることができました。 +```go +package main + +import ( + "gobot.io/x/gobot" + "gobot.io/x/gobot/platforms/dji/tello" + "gobot.io/x/gobot/platforms/keyboard" +) + +func handleKeyboardInput(drone *tello.Driver) func(interface{}) { + return func(data interface{}) { + key := data.(keyboard.KeyEvent).Key + + switch key { + case keyboard.A: // 左へ移動 + drone.Left(3) + case keyboard.D: // 右へ移動 + drone.Right(3) + case keyboard.U: // 前方へ移動 + drone.Forward(3) + case keyboard.J: // 後方へ移動 + drone.Backward(3) + case keyboard.L: // 着陸 + drone.Land() + case keyboard.E: // 終了 + return + case keyboard. B: // 後ろ向きに回転 + drone.BackFlip() + default: // 移動しない + drone.Forward(0) + drone.Backward(0) + drone.Left(0) + drone.Right(0) + } + } +} + +func main() { + keys := keyboard.NewDriver() + drone := tello.NewDriver("8889") + + work := func() { + drone.TakeOff() + drone.BackFlip() + + for { + keys.On(keyboard.Key, handleKeyboardInput(drone)) + } + } + + robot := gobot.NewRobot("tello", + []gobot.Connection{}, + []gobot.Device{drone}, + work, + ) + + robot.Start() +} + +``` + +## 終わりに +当日になって始めたので、とても中身の薄い内容となってしまいました。 +そのため、春休みなど時間があるときに画像認識の機能などの機能もつけてみたいと思った。 + + +![](./988/IMG_0297-1.jpg) + +
+telloを動かすコードは数多く公開されているので、それらを使うことで簡単に動かすことも可能です。 +今回紹介したこと以外にもtelloについているカメラを使って人の顔を判別して、特定の人を追いかけるプログラムなども作ることができるようです。 diff --git a/src/content/blogs/988/IMG_0293-1-2.jpg b/src/content/blogs/988/IMG_0293-1-2.jpg new file mode 100644 index 0000000..96709f8 Binary files /dev/null and b/src/content/blogs/988/IMG_0293-1-2.jpg differ diff --git a/src/content/blogs/988/IMG_0297-1.jpg b/src/content/blogs/988/IMG_0297-1.jpg new file mode 100644 index 0000000..56217ab Binary files /dev/null and b/src/content/blogs/988/IMG_0297-1.jpg differ diff --git a/src/content/tags/advent-calendar.json b/src/content/tags/advent-calendar.json index d074b68..b33d620 100644 --- a/src/content/tags/advent-calendar.json +++ b/src/content/tags/advent-calendar.json @@ -1,3 +1,3 @@ { - "name": "アドベントカレンダー" + "name": "Advent Calendar" } diff --git a/src/content/tags/arduino.json b/src/content/tags/arduino.json new file mode 100644 index 0000000..69da9fc --- /dev/null +++ b/src/content/tags/arduino.json @@ -0,0 +1,7 @@ +{ + "name": "Arduino", + "image": { + "type": "svg", + "name": "arduino" + } +} diff --git a/src/content/tags/astro.json b/src/content/tags/astro.json new file mode 100644 index 0000000..3c737c6 --- /dev/null +++ b/src/content/tags/astro.json @@ -0,0 +1,7 @@ +{ + "name": "Astro", + "image": { + "type": "svg", + "name": "astro-icon-dark" + } +} diff --git a/src/content/tags/automation.json b/src/content/tags/automation.json new file mode 100644 index 0000000..fb5a1e8 --- /dev/null +++ b/src/content/tags/automation.json @@ -0,0 +1,3 @@ +{ + "name": "自動化" +} diff --git a/src/content/tags/blender.json b/src/content/tags/blender.json new file mode 100644 index 0000000..6fc3062 --- /dev/null +++ b/src/content/tags/blender.json @@ -0,0 +1,3 @@ +{ + "name": "Blender" +} diff --git a/src/content/tags/discord-bot.json b/src/content/tags/discord-bot.json new file mode 100644 index 0000000..e8a760c --- /dev/null +++ b/src/content/tags/discord-bot.json @@ -0,0 +1,7 @@ +{ + "name": "Discord Bot", + "image": { + "type": "svg", + "name": "discord-mark-black" + } +} diff --git a/src/content/tags/docker.json b/src/content/tags/docker.json new file mode 100644 index 0000000..e9ec35e --- /dev/null +++ b/src/content/tags/docker.json @@ -0,0 +1,7 @@ +{ + "name": "Docker", + "image": { + "type": "svg", + "name": "docker" + } +} diff --git a/src/content/tags/dotnet.json b/src/content/tags/dotnet.json new file mode 100644 index 0000000..b0b2cf2 --- /dev/null +++ b/src/content/tags/dotnet.json @@ -0,0 +1,7 @@ +{ + "name": ".NET", + "image": { + "type": "svg", + "name": "dotnet-logo" + } +} diff --git a/src/content/tags/electronic-dictionary.json b/src/content/tags/electronic-dictionary.json new file mode 100644 index 0000000..1ff8327 --- /dev/null +++ b/src/content/tags/electronic-dictionary.json @@ -0,0 +1,7 @@ +{ + "name": "電子辞書", + "image": { + "type": "svg", + "name": "laptop" + } +} diff --git a/src/content/tags/fashion.json b/src/content/tags/fashion.json new file mode 100644 index 0000000..df03442 --- /dev/null +++ b/src/content/tags/fashion.json @@ -0,0 +1,3 @@ +{ + "name": "ファッション" +} diff --git a/src/content/tags/for-beginer.json b/src/content/tags/for-beginer.json new file mode 100644 index 0000000..96c626a --- /dev/null +++ b/src/content/tags/for-beginer.json @@ -0,0 +1,3 @@ +{ + "name": "初心者向け" +} diff --git a/src/content/tags/git.json b/src/content/tags/git.json new file mode 100644 index 0000000..79210da --- /dev/null +++ b/src/content/tags/git.json @@ -0,0 +1,7 @@ +{ + "name": "Git", + "image": { + "type": "svg", + "name": "git" + } +} diff --git a/src/content/tags/go.json b/src/content/tags/go.json new file mode 100644 index 0000000..a1d6826 --- /dev/null +++ b/src/content/tags/go.json @@ -0,0 +1,16 @@ +{ + "name": "Go", + "image": { + "type": "svg", + "name": "Go-Logo_Aqua" + }, + "site": { + "url": "https://go.dev/" + }, + "document": { + "url": "https://go.dev/doc/" + }, + "github": { + "url": "https://github.com/golang/go" + } +} diff --git a/src/content/tags/mad.json b/src/content/tags/mad.json new file mode 100644 index 0000000..323302a --- /dev/null +++ b/src/content/tags/mad.json @@ -0,0 +1,3 @@ +{ + "name": "音MAD" +} diff --git a/src/content/tags/markdown.json b/src/content/tags/markdown.json new file mode 100644 index 0000000..e769213 --- /dev/null +++ b/src/content/tags/markdown.json @@ -0,0 +1,7 @@ +{ + "name": "Markdown", + "image": { + "type": "svg", + "name": "Markdown-mark" + } +} diff --git a/src/content/tags/mixamo.json b/src/content/tags/mixamo.json new file mode 100644 index 0000000..6859e66 --- /dev/null +++ b/src/content/tags/mixamo.json @@ -0,0 +1,3 @@ +{ + "name": "Mixamo" +} diff --git a/src/content/tags/oracle-cloud.json b/src/content/tags/oracle-cloud.json new file mode 100644 index 0000000..aa3ef64 --- /dev/null +++ b/src/content/tags/oracle-cloud.json @@ -0,0 +1,3 @@ +{ + "name": "Oracle Cloud" +} diff --git a/src/content/tags/python.json b/src/content/tags/python.json new file mode 100644 index 0000000..3ebe57c --- /dev/null +++ b/src/content/tags/python.json @@ -0,0 +1,18 @@ +{ + "name": "Python", + "description": "Python はインタープリタ型の高水準汎用プログラミング言語です。", + "image": { + "type": "svg", + "name": "python-logo-only" + }, + "site": { + "url": "https://www.python.org/", + "text": "Python | Official Site" + }, + "document": { + "url": "https://www.python.org/doc/" + }, + "github": { + "url": "https://github.com/python" + } +} diff --git a/src/content/tags/reaper.json b/src/content/tags/reaper.json new file mode 100644 index 0000000..8005b80 --- /dev/null +++ b/src/content/tags/reaper.json @@ -0,0 +1,3 @@ +{ + "name": "REAPER" +} diff --git a/src/content/tags/rest-api.json b/src/content/tags/rest-api.json new file mode 100644 index 0000000..efbd26c --- /dev/null +++ b/src/content/tags/rest-api.json @@ -0,0 +1,7 @@ +{ + "name": "REST API", + "image": { + "type": "svg", + "name": "rest-api-icon" + } +} diff --git a/src/content/tags/rust.json b/src/content/tags/rust.json new file mode 100644 index 0000000..f28af36 --- /dev/null +++ b/src/content/tags/rust.json @@ -0,0 +1,7 @@ +{ + "name": "Rust", + "image": { + "type": "svg", + "name": "rust-logo-blk" + } +} diff --git a/src/content/tags/tello.json b/src/content/tags/tello.json new file mode 100644 index 0000000..f7bffb4 --- /dev/null +++ b/src/content/tags/tello.json @@ -0,0 +1,8 @@ +{ + "name": "Tello", + "description": "Tello、Tello eduはドローン界のAppleと言われるDJIと、CPU部分をIntelで共同開発し、Ryze Techから販売されているトイドローンです。", + "site": { + "url": "https://www.ryzerobotics.com/", + "text": "Tello公式ウェブサイト - Shenzhen Ryze Technology Co.,Ltd." + } +} diff --git a/src/content/tags/unity.json b/src/content/tags/unity.json new file mode 100644 index 0000000..f4b8928 --- /dev/null +++ b/src/content/tags/unity.json @@ -0,0 +1,10 @@ +{ + "name": "Unity", + "image": { + "type": "svg", + "name": "U_ProfileIcon_Positive" + }, + "site": { + "url": "https://unity.com" + } +} diff --git a/src/content/tags/vrchat.json b/src/content/tags/vrchat.json new file mode 100644 index 0000000..a700cd6 --- /dev/null +++ b/src/content/tags/vrchat.json @@ -0,0 +1,3 @@ +{ + "name": "VRChat" +} diff --git a/src/content/tags/vrm.json b/src/content/tags/vrm.json new file mode 100644 index 0000000..b3c91cb --- /dev/null +++ b/src/content/tags/vrm.json @@ -0,0 +1,3 @@ +{ + "name": "VRM" +} diff --git a/src/content/tags/workshop.json b/src/content/tags/workshop.json new file mode 100644 index 0000000..f9c21b0 --- /dev/null +++ b/src/content/tags/workshop.json @@ -0,0 +1,3 @@ +{ + "name": "講習会" +}