呉高専ICT科学部の昔今
どうも、んぐ(@ngng628) です。
この記事は高専IT系部活 #kosenit Advent Calendar 2018の記事です。
呉高専のコンピュータ部「ICT科学部」のポエムを部長が勝手に書きます。
本当は、使っているツールとかそういうことのほうが良いのかなと思いましたが、書いてしまったのでそのまま出します。
ICT科学部とは
スペック
- 部員数:35人(1年~3年:16人, 4年:2名, 5年:17名)
- 顧問1名(2名説もあり)
- 活動時間:平日放課後から19:00まで(行うことが可能である)
- デスクトップ3台+ノート2台(Win10が1機, 他はWin7)
- 無線LAN環境(アンテナ0本から1本)・デスクトップは有線LAN
- 部費は部員から年3000円徴収
- 加えて、学生会から10万円程度の部費 + 後援会から高価な(5万以下程度?)物品支給1点
活動内容
- 高専プロコンへの参加
- ETロボコンへの参加
- 地域の学校のホームページ作成支援
- 高専祭や学校主催イベントで即興合成写真作成
- (あと、無線部門があるのですが、よく把握していないので割愛させていただきます)
部員の学科は電気情報工学科が多く占めており、ちらほら機械工学科がいます。
というわけで
僕の知っている範囲ではありますが、呉高専ICT科学部の昔今を書いていきます。
ポエムだとしても、少しでも多くこういう記事があると、良い気がしたので そこはかとなく書きつくして いきます。
過去その①
僕もあまり良く知らないんですが、先輩から聞く話によると、つい最近までいわゆる「ゲーム部」状態で、思い思いのゲームで遊んだりアニメ鑑賞会を開いたりする部活だったようです。
Twitter始めたり、kosenit Discord鯖が立ったりなんだりして他の高専のお話を耳にする機会が多くなったんですが、意外と「昔はゲーム部状態だった」という話は珍しくないみたいですね。
しかし、今の5年生が1年生だった頃(2014年かな?)の先輩がそういう部を改革するべく、1年生に向けたC言語講座を開き始め、それに続くようにいままで行っていなかったETロボコンの大会への出場を始めたようです。
ETロボコンでの成績は顕著に現れ、大会などでは優秀な成績を収められました。
しかし高専の花形の一つ、高専プロコンではいまいち成績を上げることができていません。
私も去年と今年と競技部門に2回出場しましたがなかなか思うような成績をあげられていません(プロコンの話は自責の念でいっぱいいっぱいなのでここでは言及しない)。
自由、課題に関してもなかなか話が進まず、予選提出資料直前までほとんど手付かず状態という感じです。予選落ちです。はい。
過去その②
私は今年から弊部の部長を任命されました。
が、正直なところ全然うまく回せていません。
せっかく今年から「勉強会を開こうぜ!」とか意識高げな活動をしようとしていたのに、結局いままで一回も行えていません。
その要因として一番大きいのが「部の風潮」と僕の運営の悪さ(自責)だと思っています。
弊部の風潮として
「部として個人の自由な勉強・開発を止めることはぜず、部活より個人優先」
というのがなんとなくですが流れています。だから、強くなる人は部活外でいつの間にか強くなってるし、逆に、やってない人はとことんなにもやっていない・知らない、という状況が生まれています。
こういう緩い風潮が弊部の良さではあったんですが、部として果たさなければならない責任(つまり高専プロコンでの勝利)がなあなあになって結局プロコンに関してはほとんど何もしないという状態に陥っています。この根本的な風潮を変えなければならないという認識が私には足りなかった。
一応、風潮を変えようという意思が勉強会を開催しようとしたことそのものに現れてはいるわけですが、なんだか全員が全員乗り気じゃない姿を見て、僕が変に気を遣ってしまった(面倒臭いと思われたり嫌な顔されるのが嫌だった)のも本当に悪いところです。
「個」としての強さはそれなりにあります。が、「チーム」としての強さがありません。
だからプロコンは勝てませんでした。
プログラミングも団体戦だということを今になってひしひしと感じています。
そしてその「団体」を率いるのは誰よりも部長であるべきだったわけですね。
なお、ETロボコンは優秀な成績が出ているわけですが、それは多分、ETロボコン部門のリーダーが「技術面」でも「みんなを率いる」という面でもとても強かったからなんだんだと思います。本当に尊敬です。
いままで、何度かリーダー的な立場で運営してきたんですが、どれもすべてこういう僕の悪い運営・性格が、結果チームとして良い結果を生み出せなかったという事実は、本当に本当に反省しています。
ここまでが過去の話。
現在
過去編の最後のほうがかなり病んでいますが、ここからは今の話です。
僕はやっと僕の運営・性格の悪いところを理解しました。そして、そういうのはもうやめようという強い意志を固めました。
その背中を押すようにコンフェスの話が舞い込んできます。
ロボコンとかだと交流試合開催する風潮あるみたいだけど、プロコンでそういうのやってる地区とかあるのかな?
— んぐ (@ngng628) November 26, 2018
何気なく思ったことをツイートしただけだったんですが、宇部高専のかたからこんな空リプが
中国地区はありますって思ったけどそういえば呉高専コンフェス参加してないのか…
— はすみ (@hsm_hx) November 26, 2018
どうやら、中国地区の高専ではコンピュータフェスティバルなる催し物を開催しているらしく、そしてどうやら中国地区の高専で唯一呉高専はコンピュータフェスティバルに参加していないようです(なんで?)。
顧問に話を聞いたところ、むかーしむかし、コンフェス参加の話はちゃんと呉高専にも来ていたそうですが、当時の先輩が「出ないです」と答えてしまったらしく、そのまま26年間呉高専は不参加というある意味屈辱的な結果に。
まあ、知らなかったんだからしょうがない。うん。しょうがない。
しかし、今の呉高専に断る理由はありません。技術力自体は十分ありますし、あとはやる気の問題です。主管校になった立ち回りが不安でしたが、部会を経て、コンフェスの参加を決意します。
コンフェスの存在教えてくださり、その後の質問にも丁寧に答えてくださったはすみさん(@hsm_hx)さんには本当に感謝です。
Twitterが素晴らしいツールであることも再確認しました。
そして、部活の運営方針も大きく変えることにしました。
「部活を部活として成長させる」
これを弊部の大原則、スローガンとして、
- プロコンでの勝利を部活としての絶対の使命とする
- 部活動としてやりたいことは、部活動として行う(つまり個人の活動や開発を部の活動をおろそかにする言い訳にするのであれば、部長や部としての承認の後、部活動の繁栄に寄与するような形で行なえ、ということ)
- 部員が部員として行う活動については寛容に対応する
という3つの補助原則を定めました。
いままでの風潮からいけば、プロコンを頑張ることを強制というなかなか厳しい制約を部として課してしまいました。でもぶっちゃけ、このくらい割り切ってしまうことが、チームとして成長していくためには必要だと思います。
とはいえ、プロコンという文字に固執せず、エンジニアとして柔軟に技術を吸収していくことは大事なことです。だから補助原則2つ目3つ目で、部活動としての成長に貢献されるものと判断すれば、それは(部活動として)認めるという文面をつけました。
この「原則」の文面についてはよくよくよくよく考えないといけないんですが、取り急ぎ、このような形で部員に伝達しました。
また、ミーティングを積極的に行うことを定め、月例ミーティングを行うことにしました。
内容としては
- 各部門の進捗報告
- 部員が持ち回りでLT
- 情報共有
- その他予算報告など
です。
呼べばみんな集まってくれるので、それを定期化します。この場をクッションにして勉強会も積極的に行えるようになればなと思います。
いまやっていることが、なにかのアンチパターンを踏んでいなければいいんですが…。とりあえず、この方針で頑張っていくことにします。
そして、部長として自分自身、まずは部員を信じて、失敗を恐れず頑張っていこうと思います。
ちなみに、Twitterのタイムラインか何かで部則の話が回ってきましたが、部則をつくるまではしなくても、部活の指針を明文化すると、共通意思をもってブレずに部の活動を進めていけるので、結構良い気がします。
未来
直近はコンフェスへの出品です。
満を持すぎの参加ということで、恥ずかしい作品を出さぬよう全力で取り組みます。
弊部員には、自分の頑張った成果が認められることの喜びとか、他高専の友達を作るとか。
そういう楽しい経験をこのコンフェスで体験してもらってプロコンへのモチベにつなげて貰えればなと思っています。
そして、プロコンでは全部門予選通して、全部門勝利を収めてやりますよ。ええ。ええ。
まとめ
長くなりましたが、つまりは呉高専頑張るぞというお話でした。
来年もこのアドベントカレンダーが開催されるのであれば、もう一度ここに記事を書きたいと思います。
そして良い結果が報告できるようにがんばります。
プログラミング初心者にSiv3Dを布教した話
この記事はSiv3D Advent Calendar 2018 11日目の記事です。
どちらかというと日記的な記事になってしまいそうなので、ブログの方に書きます。
なんか途中からSiv3D紹介記事みたいになったけど許して。
はじめに
自己紹介とか状況説明
- 某高専3年生
- プログラミングは高専に入ってからはじめました
- コンピュータ系クラブに所属
- 今年(も)部活動で一年生の教育係を担いましたので、2ヶ月ほどC言語の講座を開きました
- 一年生は高専祭(学園祭)に向けてゲームを作ることにしていますので、定番のDXライブラリを使ってゲーム開発をさせようとしていました。
- が、進捗がよろしくなくSiv3Dを勧めてみました
- 一年生はC言語の基礎構文はある程度理解していましたが、C++にはほとんど馴染みがありません。
Siv3D導入の理由
私は普段からSiv3Dを愛用していました。そのゆえSiv3Dのパワフルさを知っていました。 しかし、わけあって一年生には始め導入していませんでした。
というのも、昨年も私は一年生教育係を務めていました。
そしてそのときは、特に使いたいものがなければ、 DXライブラリ + Visual Studio という構成でゲームを作成するよう指示していました。
当時もSiv3Dの存在は知っていましたが、C言語の知識だけで理解できるという点でDXライブラリを推奨しました。(本当の理由は学校のPCがWin10じゃなかったから。Win7だとランタイムインストールしないといけない。まあでも今年Win10になったんで…はい)
が、想定していなかったわけではないですが、Visual Studioの環境構築でつまずいてしまう部員がちらほら。
また、Visual Studioは重いです。PCスペックが足りずに起動まで分単位で待たないといけない、ストレスMAX~みたいな状況の部員も散見しました。
というわけでその年は、Visual Studioは諦めて、超軽量IDEのBccDeveloperに鞍替えしてしました。
IDEとして機能が充実していることも大事だけど、初心者にとっては、気軽に開発ができる環境であることも大事なんだなーと学びました。
と、いうこともあって、最初は現一年生には DXライブラリ + BccDevを推奨していたんですが、これはこれで問題発生。
「DXライブラリ、難しい」
まず、「正しい」Mainにたどり着くまでが長い。
#include "DxLib.h" int My_DxLib_Init(bool bWindowMode, int Window_X, int Window_Y, int ColorBitNum, const char *MainWindowText) { ChangeWindowMode(bWindowMode); SetGraphMode(Window_X, Window_Y, ColorBitNum); SetWindowIconID(100); SetMainWindowText(MainWindowText); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); return 0; } int LoopProcess(void) { if (ScreenFlip()) return -1; if (ProcessMessage()) return -1; if (ClearDrawScreen()) return -1; if (Key_Input()) return -1; if (Mouse_Input()) return -1; return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { My_DxLib_Init(true, 850, 680, 32, "ブロック崩し"); while( !LoopProcess() ) { if(Key_chk[KEY_INPUT_ESCAPE] >= 1)break; } DxLib_End() ; return 0 ; }
言語文法の知識は足りてても、「裏画面ってなに?」とか「Whileの中に突っ込んでるLoopProcessの中身なに?」とか本質のプログラム書く前の関門が多いんですよね。
省略しましたが、Key_Input
あたりの定義もしないといけません。
また、例えば「敵と弾丸とのあたり判定を作りたい!」と思ったとき、DXライブラリだと「まず、敵を四角形だと近似してだな。四角形と円があたっているかの条件はごにゃごにゃ内積外積ガーごにゃごにゃ…」と、やりたいことに対して考えないといけないことが多いんですよね。
というわけで、一年生がゲームづくりに対して辟易としてしまったので、C++はそんなに教えていかったんですが、「Siv3D、これ enemy.intersects(bullet)
で書けるよ」と誘い、Siv3Dを導入しました。
Siv3Dを導入してよかったこと
Mainまでの道のりが早い
Siv3DのMainはこうです
# include <Siv3D> void Main() { while(System::Update()) { } }
簡潔。Visual Studioからプロジェクトのプロパティをいじるような初期設定なんかもありません。
当たり判定などの処理が簡単に書ける
DXライブラリ上がりの身としては .intersects()
は革命ですよ。
Siv3D公式サンプルにある画像をPolygon型に変換するプログラムを使えば、任意の画像に対して、ほぼ正確な当たり判定をつけることもできます。
その他にも、ああいうことやりたい!と思ったら大抵もう実装されています。
TextureがTextureとして書ける、RectがRectとして書ける
DXライブラリだと、画像の表示はこんな感じに実装するんではないでしょうか。
int image_id = LoadGraph(path); DrawGraph(x, y, image_id, true);
しかし、画像がint型ってよくわからないですよね。今回は _id
という変数名にしたのでまあ理解できないこともないですが。
Siv3Dだと、こうかけます。
Texture texture(path); texture.draw(0, 0);
Textureを示すTexture型の変数を用意して、それをdraw()する。
状況を的確に表してわかりやすいです。これはオブジェクト指向言語のよさでもありますね。
困ったらそれっぽいこと書いてみる・ピリオド、::を打ってみる
ピリオドを押せば、IDEがメンバ変数名・メソッド名を羅列してくれる
オブジェクト指向言語を使うことで得られる恩恵でもっとも素晴らしいことが、このことだと思っています。
例えば、image
を回転させたい。そう思ったら、image.
と打ってみるのです。そうすれば、メソッド名が羅列されて、その中にきっとimage.rotate()
みたいなメソッドがあるはずです。リファレンスをみなくてもピリオドを押して探してみればいいんです。Windowのサイズを変えたければ、とりあえず、 Windows
と打ってみるのです。するとVisual StudioがWindow
っていう名前空間があるよって教えてくれて、Window::
と押せばこれまたいろんな関数が出てきて、その中からResize
的なのを探せばいいわけです。
基礎的な英単語力と賢いIDE、そして充実したライブラリがあれば、初心者でも比較的容易にもクラスは(作るのでなく利用する分には)扱えてしまうわけですね。
事実、一年生も意外とすんなりこのクラスという概念に馴染んでくれました。
充実したサンプル
本当にありがたいことに、Siv3Dはたくさんのサンプルが公開されています。 ラムダ式やら三項演算子ばりばり使ってたりイテレーター使ってたりやらで、初学者には難しいサンプルも多いですが、それでも、とりあえずコピペしたらちゃんと動くものがある、というのはやっぱり安心です。
Siv3Dを導入して悪かったこと
環境構築でつまずく可能性がある
Siv3Dを導入は、
- Visual Studioの導入
- Siv3D インストーラーでインストール
の2ステップでできます。
しかし、まあエラー続出で。
多くの原因はWindows 10 SDKが導入されていないことだったんですが、始めの一歩でつまずくというのはなかなか心が折れますよね。
Visual Studioが重い・容量も使う
パワフルであるがゆえ、です。しょうがないですね。上でも書きましたが、気軽に立ち上げられないって結構初心者にとってモチベの低下につながります。 まあ最近は家電量販店にもSSD搭載PCが結構置かれていますし、動作の不快適さは気にならなくなるかもですね。
容量もまあ、それなりの大きさのものを買っていれば、入らないなんてことは無いでしょう。たぶん。
なんだかんだC++の知識は必要
Siv3Dって結構モダンなC++で書かれていますよね。
それゆえ、ぱっと見の簡潔さはあるのですが、よくよく考えると難しいコードも多いです。
// どちらも()のオーバーロード vec.moveBy(Vec2(5, 0)); font(L"Hello, world!").draw(); // どっちで書く? Vec2 vec = Vec2(10, 20); Vec2 vec(10, 20); // なにこのfor文 for (auto& enemy : Enemy) { } for (auto it = enemy.begin(); it != enemy.end(); ++it) { } // 返り値の書き方が。。。 Vec2 func() { return {0, 0}; }
言われたら(一部は)わかるんですけど、慣れないうちは慣れないです。
あと、Siv3DのPoint型とVec2型とSize型の違いに困惑している例もありましたね。
まとめ
実は初心者への導入記事ってそんなにないかなーという気がして書いてみました。
Siv3Dは素晴らしいライブラリ・フレームワークです。初心者にもおすすめできるわかりやすいライブラリです。事実、一年生たちはSiv3Dを使っていろんな楽しいゲームを作ってくれました。
完全に使いこなすにはC++の知識が必要になりますが、そうでなくても簡単なゲームならぱぱっと作れちゃいます。
OpenSiv3Dの開発も着々と進んでおり今後の展望にも大期待ですね!
ちなみに余談ですが、弊部の高専祭ゲーム展示。殆どがSiv3D製でした。やっぱり、きてますね、Siv3D。
C++で競プロを始めるにあたっての環境作り
どうも、るりんぐです。
最近AtCoerが盛り上がっていると巷で話題なので私も乗っかろうと思います。
して、やりたくなるのが環境構築。 競プロが快適に行えるような環境を作っていきます。
目次
- 現環境
- これからやること
- 便利なマクロ
- #include <bits/stdc++.h>
- rep(i, n)
- ALL(v), pb
- SZ(x)
- optimize_cin()
- using
- chmax, chmin
- 一部マクロをsyntaxへ追加
- テンプレート化
- sonictemplate-vimの導入
- テンプレートファイルの追加
- まとめ
現環境
これからやること
- 便利なマクロなどを追加
- 一部マクロをsyntaxの対象にする
- マクロなどを書いたソースをテンプレート化する
続きを読む
iPhoneで撮影した動画をAviUtlで編集した
iPhoneで撮影した動画をAviUtlで編集しようとしたら、 いろいろと問題が出てきたので、 あくまで僕の解決方法ですが、備忘録として書いておこうと思います。
ファイルサイズでかすぎてパソコンに移動できない
正確に言えば移動はできましたが、動画が1時間で3GBにもなっていました。 まあ、画質かなり良いですし、妥当っちゃ妥当かもしれませんが、私にとっては流石に大きすぎでした。
そこで 圧縮と写真編集 というアプリをを導入してみましたが、どういうわけか圧縮できませんでした。
どうしようもないので、一番安心できそうなCute CUT Proを課金して導入しました。
720円。。。。今回の場合は圧縮のためだけにって感じではありますが、編集アプリとして機能は素晴らしいので、動画をスマホで編集しちゃいたいときにはかなり重宝しそうです。
このアプリで「普通画質」でエクスポートすることで圧縮。画質は大分落ちましたが、その分ファイルサイズは400MBくらいになりました。
(※ちなみに、Cute CUTの無料版は30秒以内の動画しかエクスポートできないようなので注意)
プラグイン出力ができない。
なんとか、AviUtlで編集するところまでできました。
よし動画をエクスポートだ!と、x264guiExというかなり一般的な出力プラグインを使ってエクスポートしようとしましたが、なぜかうまくいかず。
そこで、
- AviUtlフォルダ内にある
exedit.ini
に.mov=動画ファイル
と.m4a=音声ファイル
を追加 - iTunesをインストール(これ絶対)
を行いました。
1つ目のやつは関係無かったかもしれませんが。2つ目のiTunesをインストールは絶対いるっぽい。
どうやら音声のエンコーディングにAppleの云々がいるみたいで。
なにはともあれ、これでiPhoneで撮影した動画をAviUtlで編集しエクスポートするところまでできました。
めでたしめでたし。