Python 講習会を開催

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

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

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

今後の予定

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

Git と OOP の講習会を開催

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

Git 講習会

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

OOP 講習会

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

今後の予定

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

Blender と競プロの講習会を開催

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 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

ゲーム制作と Web の講習会を行いました

昨日 4/24(土) に Unity を用いた 2D ゲーム制作の講習会、そして本日 4/25(日) に HTML/CSS/JavaScript を用いた Web サイト制作の講習会を、Discord 新歓サーバーでオンラインで行いました。今回も、資料は Discord 新歓サーバーで配布していますので今回参加できなかった方もご参加下されば参照可能です。内容に関する質問もいつでも受け付けております。

2D ゲーム制作 (Unity)

Unity での 2D ゲーム制作の基礎として、ものすごく単純なゲームを作成しました。

単純とはいっても、スクリプトの書き方や当たり判定の実装、シーンの作成や遷移、そして Unity の各種機能の使い方など、Unity 初心者が身に着けるべき内容を丁寧に説明しています。Nintendo Switch 等の有名プラットフォームでも Unity で開発されたゲームが増えてきていますが、そういったゲーム開発の裏側に触れることができる講習会となりました。

以下に講習会のスライドを抜粋して掲載します。

Web サイト制作 (HTML/CSS/JavaScript)

Web サイト制作において最も基本的な HTML/CSS/JavaScript を用いて、簡単な Web サイトを作成しました。

まずは HTML で Web サイト制作への導入を行い、CSS で背景や文字などのスタイルを変更できることを確認したのち、最後に JavaScript でインタラクティブな Web サイトを実現できることを学びました。このブログも含め、日々目にする Web サイトの仕組みに触れることができる講習会となりました。

以下に講習会のスライドを抜粋して掲載します。

今後の予定

次は 5/8 (土) に Blender、5/9 (日) に競技プログラミングの講習会を、同じく Discord 新歓サーバーで予定しています。オンラインなので緊急事態宣言などの影響を受けることはありません!興味のある方は https://discord.gg/jBM2NP7ZxK からご参加ください。なお、最新情報は Discord 内及び新歓特設サイトでも紹介していますので、こちらもご確認ください。

C/C++ の講習会を開催しました

本日 4/18(日) に C 講習会、その準備編として昨日 4/17(土) に C++ 講習会を行いました。今回参加できなかった方も、講習会資料を Discord 新歓サーバーで配布していますので、ご参加下されば参照可能です。内容に関する質問もいつでも受け付けております。

C は広く利用される非常に有名な言語で大学の講義で1年から早速学びますが、プログラミング初学者にとっては修得が難しいものとなっており、それに向けた助けとなることを目指した内容としました。

講義の予習として、また、講義が理解できなかったときの参考書代わりとして、ご活用いただければ幸いです!

現役生と卒業生で LT 会を開催

本日、OUCC の卒業生と現役生との交流会を兼ねて卒業生による LT 会を開催しました。

内容は社会人としての経験や大学院での研究経験、また趣味で行っているプログラミングや電子回路技術の紹介といった様々な貴重なお話をして頂きました。

OUCC では、今後もこのような卒業生との交流会の機会を作っていけたらと思っております。ご協力くださった卒業生の皆様、ありがとうございました!

dotfiles を作ってみた

公開日: 2021年2月20日 最終更新: 2021年2月20日 執筆者: watamario15

大学の課題を全て出し終わり、ようやく自分の作業に取り組むことができるようになりました。無事に単位が取れていて、GPA もあれば良いのですが…

色々とやることはあるのですが、まずは dotfiles を作成することにしました。

dotfiles とは

検索すればすぐに分かるのですが、簡単に言うと環境構築を秒速で終わらせるためのファイル群です。Unix 系のソフトウェアの多くはテキストファイルを設定ファイルとして扱うものが多く、それをカスタマイズすることで自分好みに設定することができるようになっています。ここで、そのファイル群とそれを適切に配置したりその他の設定をしたりするスクリプトもセットで GitHub に上げておけば、新しい環境でも git clone してスクリプトを走らせるだけで即座に自分の環境が出来上がる、という訳です。

なお、dotfiles という名前は、設定ファイルの多くが名前がドット (.) で始まる「ドットファイル」であることが由来です。ちなみに、Unix 系システムにおいてドットファイルは隠しファイルとなります。

どんな dotfiles を作ったのか

これが私の dotfiles です: https://github.com/watamario15/dotfiles
機能や使い方などの説明は Readme.md にありますので、気になる方は読んでください。もちろん、install.sh.bashrc とかを参考にしてもらっても構いません(特に alias 周り)。まだまだ未熟ですが、少しずつ成長させて行けたらと思っています(この記事を読んでいる方で、もし「絶対これは設定すべき!」みたいなのがあれば issue 立てたり pull request 出したりして頂けると嬉しいです)。initialize.sh に付けた CASLII/COMETII のシミュレータをインストールする機能、阪大生(だけ)には割と需要ありそうですね(笑)

今回の投稿は以上です。ところで、推薦入試の合格発表があったそうですが、合格した皆さんおめでとうございます!もし合格してサークルを探している、という方で OUCC の活動に興味を持たれた方がいらっしゃれば、ぜひ Discord 新歓サーバー に参加してみてください(もちろん上回生も大歓迎!)。もちろん、これから一般入試だという方も全力で応援します!

GAN使用のアプリ制作における雑記

~あらすじ~

 GANを3か月前から学び始めたんですが、OUCCのAdvent Calendarの24日目?の記事を書くに当たって、自分が今までやったことがない技術を使用しようと思いまして、StackGANというGANを使用したアプリを制作しようとしました。具体的には大阪大学生協食堂の料理の写真とその料理名を学習して、入力された架空の料理名から架空の料理画像を生成するアプリです。結論から言いますと上手くいかなかったのですが、その間に得られた知見などの心に移りゆくよしなし事をそこはかとなく書きつくりました。

~GANって?~

GANについて軽く説明します。詳しくはググってください。

 GeneratorとDiscriminatorという2つの学習するモデルから構成される機械学習モデルです。小学校とかの先生と生徒の関係で例えると、生徒のGenerator君は答えを写した宿題を作成し、Discriminator先生は提出された答案が答えを写したものかきちんと解いて得られた答案かを見分けます。その見分けた結果、答えを写したことがばれて叱られたGenerator君は、学習してより自分で解いたかのように見える答案を作成します。Discriminator先生もきちんと解いてきた答案かどうかを見分けられる様に学習します。そのように一方が利するともう一方が損する関係によってお互いが高めあい、Generator君は自分で解いた答案と変わらない答案を作成することができるように成長します。つまり、Generatorモデルが最終的に本物そっくりのものが生成できるようになる学習の仕組みがGANというモデルです。

~StackGANって?~

 私も最近知ったのでよく知りません。言語から画像を生成する方法ないかなと探していたら発見したGANの一種のモデルです。これも詳しくはGoogle先生に教えを乞うか、私が参考にしたサイトを閲覧してください。(GANの説明に疲れて丸投げしたのでは無い)

 なお、レシピから料理を生成するCookGANというものがあるみたいですが、今回は料理名をラベルとして使用するので恐らく使えないです。

・何が駄目だったのか

 あまり制作にかける時間がなかったので原因究明はきちんとはされていないですが、早い話学習データが圧倒的に不足していました。もし、学習が上手くいかなくてどういうわけかこのページに行きついてしまったかわいそうな人にはこんな結論で申し訳ないです。それはさておき何が駄目だったかというと、130枚の、しかもラベルが重複しない、共通点としては器の形が似ているだけの画像で学習しようとしたことが無謀でした。そのデータ数でよくやろうと思ったなと言われそうですが、言い訳をすると入力する料理名に含まれる名詞は重複が多く何とかなるかなと思ってやってみた次第です。さらにGANの学習データを水増しするDifferentiable Augmentationという技術を発見して、もしかしたら出来るのでは?と愚考した次第です。

 Differentiable Augmentationについて軽く説明しますと、従来の画像のクラス分類学習では訓練データにちょっとした加工を加えることでデータの水増しを行うことができましたが、GANの学習ではさらにGeneratorの生成した画像に同様の加工を加えることで、より良いデータの水増し効果が得られるという技術がDifferentiable Augmentationです。間違っていたらすみません、詳しくはgoog(ry

・使用したデータの一例

 一枚目がピリ辛サーモン丼。美味で個人的なおすすめ。二枚目はマヨラーの友人によって犠牲となった親子丼。親子丼に何の恨みがあったのだろうか。なお、二枚目は学習には使用していません。

・結果

 StackGANのstage1の学習段階で上手くいきそうな気配がないのでやめました。

一応stage1の学習結果だけ載せておきます。

心が清い人には遠目で見るとかろうじて料理に見えるはず。

 これだけでは申し訳ないので、同じデータセットで学習したDCGANで生成したものを貼り付けておきます。

 右下以外はまんま存在する料理が生成されています。あ、そう くらいのつまらなさで申し訳ない。やはり、生成画像を人間がコントロールできるものを作った方が楽しいですね。

・損失関数について

 最近GANの学習にはHinge Lossを使用すれば上手くいくよという記事を見つけたので、これとは違うGANのアプリに実装すると劇的に学習が向上しました。なのでこのDCGANにもHinge Lossを適用したらより上手くいくかと思ったら、逆に学習しなくなってしまいました。Hinge Lossの取る値はReLUみたいに途中から一定の値になりますが、Binary Cross Entropyは少しの値の変化もLossの値に反映されるので、これが原因ではないかと考えています。

~終わりに~

 いかがでしたか?ろくな原因究明をしていない分、悪質なキュレーションサイトの方がよっぽど役に立つような内容でした。この山無し落ち無し意味なしのやおいページにお付き合い下さり有難うございました。そして1月になって記事を書いたことお許しください。

著者:AI班上月

昔作ったゲームを振り返る

これはアドベントカレンダー25日目の記事です。なんでトリなんて選んだんでしょうね。

特に書くこともないので昔作ったゲームでも紹介します。
1つ目はブロック崩し。
僕が初めて作ったゲームです。javascriptとhtmlで作りました。

2つのゲームを同時にクリアさせる必要があります。カーソルは1つなのでなかなか忙しいです。当てるなってやつに当てると画面が変化して見づらくなります。初めて作ったにしてはなかなかいい発想してたと思います。


2つ目は人生ゲーム。何番目に作ったのかは覚えてません。
小学生のころ考えた留置所と戦争に行くという要素を含んだものです。
ほかにも途中で無職になったり、事故を起こして裁判になったりと、およそ市販できないようなマスを用意しています。最近のマスがどんなものか知りませんが。大体所持金がマイナスになるというそれはひどい人生ゲームです。ちなみに画像は無職なのに車を買って事故を起こし、裁判で賠償金490万払ったところです。賠償金安すぎですね。

3つ目は陣取りゲームです。某イカのゲームが流行っていたので作りました。

右にあるいろいろな塗り方から選んで盤面を塗っていきます。緑色の場所しか選べず、盤面がすべて赤色か青色で塗られたらゲーム終了。色の多いほうが勝ちです。一番右にある4つはスペシャル技で、1種類だけ使えます。正方形が強かった気がします。

最後はトランプオセロ。これだけ大学に入ってから作ったものです。部室でトランプで遊んでた時にふと思いついたのでゲームにしたものです。

トランプでオセロをすることで、単純に表の数でなく数値の和で勝敗を決める戦略性、裏が同じ模様のトランプであることから両者が使える裏というおき方、裏返ったカードの色と数値を記憶する必要があるという神経衰弱要素、そしてジョーカーを使うことで場のカードを1枚ひっくり返せるという逆転要素が盛りだくさんです。自分の周りでは結構評価高かった気がします。

こうして振り返ってみるとなかなか頑張ってたなという気がします。今はこんな気力はないですけど、また面白そうなもの思いついたら形にしておきたいですね。たとえ日の目を浴びなくても、こうして思い出すことで自分も頑張ってたんだな、とか面白いこと考えてたな、とか懐かしい気持ちになれるなら形にした意味はあるんじゃないでしょうか。

SHARP Brain 用アプリケーションの作成方法

投稿: 2020年12月20日 最終更新: 2021年8月23日 投稿者: watamario15

この記事は OUCC Advent Calendar 2020 の 20 日目の記事です。

OS として Windows Embedded CE 6.0、CPU に ARM926EJ-S (ARMv5TEJ) を搭載する電子辞書 SHARP Brain 用アプリケーションの作成方法を簡単に解説していきます。これについてまとまっているサイトがあまりない印象なので。

注意点

  • ここで取り扱うものは、SHARP 公式の内容ではありません。普通、フリーズなどが起こった場合もリセットボタンを押せば元に戻りますが、万一何かが起こった場合も一切保証できませんので、自己責任で試してください
  • 新機種の多くには、SHARP 公式のソフトウェア以外を起動できなくするプロテクトが掛かっています。具体的には、ビジネスモデル (PW-SBx) を除く PW-Sx4 以降の機種がそれに該当します。そういった機種での起動方法は、Brain Wiki の該当ページを参照してください。
  • ここの表で第1世代から第4世代に分類されている機種を対象とします。なお、2021年発売の第5世代に該当する機種用のソフトウェアは、この記事の方法では作成できません。詳細はこちら

作成するソフト

この記事では、プログラミングより開発手順(開発環境やコンパイル方法など)の解説に重点を置くため、非常に単純なプログラムを使用します。OUCC_Advent_2020.cpp をダウンロードしてください。

開発環境

以下の 3 通りを解説していきます。

  • Microsoft eMbedded Visual C++ 4.0
  • Pocket GCC
  • CeGCC

電子辞書での実行方法について

内部ストレージまたは micro SD カードの「アプリ」フォルダに(なければ新規作成)、空のフォルダを作成し(フォルダ名はメニューに表示させたい任意の名前。日本語もOK)、その中にコンパイルして得られた実行ファイル(AppMain.exe になっていなければ AppMain.exe にリネーム)と、 index.din (ダミーの空ファイル) を入れてください。これで、注意点で記載したプロテクト付き機種でなければ「アクセサリー」->「追加コンテンツ」->「追加アプリ・音声」(機種によって違う可能性あり)に表示され、実行できるようになります。加えて、Sx1 世代以降の機種の場合、AppMain.cfg (ダミーの空ファイル) も加えることで高解像度状態のまま実行できるようになります。

なお、index.din 及び AppMain.cfg は空のテキストファイルを作成し、ファイル名を index.din, AppMain.cfg (もちろん元の拡張子 .txt は消す) に変更するだけで作成が可能です。ちなみに、ceOpener などの別ツールを導入済みなどで、 exe ファイルを直接実行する場合は以上の作業は不要です。どんな名前でもどこに置いても構いません。

Microsoft eMbedded Visual C++ 4.0

知る人ぞ知る、大昔(2000年辺り)の Windows CE 用 Microsoft 純正無料 IDE です。おそらくこれが最も使いやすいと思いますが、激古なので C++ の新しい機能はほぼ使えないことと、Windows 2000 と Windows XP でしか動作しないという難点があります。私は組み込み機器に C++ の最新機能など期待していない(笑)ことと、奇跡的に何とかギリギリ動作する Windows XP パソコンを所有しているという理由で現在主に使っています。ただし後述の CeGCC が使いこなせるようになったら乗り換えるかもしれません。

(2021年3月11日追記) Windows 10 での動作に成功しました。互換性オプションで何とか動作しているレベルで、完全な状態ではないし何か問題が生じることもあり得るので推奨はできませんが、どうしても Windows Vista 以降の PC でこの環境を使いたい場合はここを参考にしてください(以降の説明は Windows XP を前提としています)。

環境構築

まず、 Microsoft Download Center (直リン) からダウンロードしてください。これは自動解凍式の圧縮ファイルになっているので、実行して適当な場所に解凍してください。それで得られたファイルの、setup.exe を実行し、あとは手順に従ってください。なお、途中でプロダクトキーを聞かれますが、先ほどのダウンロードページの「インストール方法」欄に記載されているものを入力すれば大丈夫です。

次に、Service Pack 4 (直リン) をダウンロードして同様の手順でインストールします。

最後に、Windows CE 5.0 の Standard SDK をダウンロードし、インストールします。SHARP Brain が対象の場合はこちらを推奨しますが、古い他の CE4 系デバイス(シグマリオン3など)も対象とする場合は最初にインストールした setup.exe と同階層にある SDK フォルダに入っている setup.exe を実行し、指示に従いインストールします。なお両方インストールすることも可能で、その場合ビルド時にどちらを使用するか選択できるようになります。

プロジェクト作成・ビルド

まず、左上の「ファイル(F)」から「新規作成」をクリックしてください。その後、下の画像のように設定してください。CPU に関して、 SHARP Brain は ARMv5TEJ ですが、このコンパイラにはないため ARMv4I を選択してください(SHARP Brain 以外の CE 端末用のコンパイルも行いたければ、ARMv4I に加えてその他の CPU を選択してもかまいません)。設定できたら「OK」を押してください。

ここでは、「空のプロジェクト」を選択してください。

次にプロジェクト概要の画面が出るので、OKを押してください。これでプロジェクトが作成されます。

その後、左を FileView に切り替え、Source Files を右クリックしてソースファイルを追加してください。分かりやすくなるよう、ソースファイルはプロジェクトフォルダ内に予め入れておくことをお勧めします。

ソースファイルが追加できたら、FileView から先ほど追加したファイルをダブルクリックすると、画面内にソースファイルが表示されます。ここでプログラムを編集することが可能です。今回はソースファイルを UTF-8 エンコードしたため、コメントの日本語が文字化けしていますが無視してください(気になるようなら Shift_JIS でエンコードし直してください)。というか何で WinCE は Unicode のみ対応なのに eVC4 はUnicode 非対応なのだろうか…

ここで、SHARP Brain で実行する際は AppMain.exe になっていた方が色々とうれしいので、デフォルトでこの名前になるように設定しておきます。「プロジェクト」->「設定」を開き、「リンク」タブに移動すると下のような画面になるので、画像のように出力ファイル名を編集して OK を押してください。

最後に、画面左上の「STANDARDSDK」という部分では、利用する SDK を指定します。STANDARDSDK_500 が Windows CE 5.0 用の SDK です。

これで準備完了です!では、下の画像の赤丸で囲ったボタンを押してください。

ビルド終了後、以下のようなメッセージが出ますが無視してください。コンパイルエラーがなければコンパイル成功です。

プロジェクトフォルダの ARMV4IDbg に AppMain.exe が生成されているはずですので、電子辞書にコピーしてして実行してみてください。以下のように表示されれば成功です!

ちなみに、 この記事では扱いませんが Win32 (WCE ARMV4I) Debug と書かれているプルダウンメニューから、Release ビルドへの切り替えや他の CPU の選択(最初にチェックボックスを付けていた場合)が可能です。

Pocket GCC

例によって激古ですが、SHARP Brain 上でのセルフ開発が可能な GCC の Windows CE 移植版コンパイラです。上のコンパイラよりさらに機能は限られますが、Windows XP の骨董品 PC が不要でかつ扱い方が確立しているので紹介しておきます。

準備

手順が非常に多くここに書くのはあまりに大変なので、Brain Wiki のページ を参照してください。

一通り終わったら、OUCC_Advent_2020.cpp を win.cpp に改名したものと WINBUILD.BAT (右クリック -> リンク先を保存)を電子辞書内の同じフォルダに入れてください。この際、WINBUILD.BAT の2行目と3行目を環境に合わせて編集しておいてください。

その後、DOS窓Open から WINBUILD.BAT の所まで移動して(空白や日本語を含んでいてもクォーテーション不要で普通に cd でいけます)実行してください。するとそこに AppMain.exe が生成されるので、それを実行して前節の eVC4 の最後の画像のようになれば成功です!

ちなみに、この記事では説明しませんが WINBUILD.BAT は resource.rc があった場合、それも含めてコンパイルするようになっています。その際、34行目の -l commctrl は CeGCC に commctrl.lib が含まれないため削除してください。一応、eVC4 の SDK からこのファイルを持ってくると使えるようにはなりますが。

CeGCC

つい先日知ったばかりで、私も未だに扱い方がよく分かっていないコンパイラです。しかし、最新の Debian (Ubuntu も OK) でコンパイル可能(WinXP 不要!)でかつ、なんと GCC 9.3.0 ベース!!!!(執筆時点で Windows 版 MinGW より新しい)という、今まで 2000 年前後のコンパイラを使っていた私には衝撃の見過ごせない特徴を持っていたので、紹介することにします。

前提

Windows Subsystem for Linux の Ubuntu で説明します。おそらく Debian や通常版の OS でも同じような方法でできます。

なお、基本的に公式サイト(とはいえ有志の個人開発者様ですが)である cegcc/mingw32ce (kellermann.name) に記載の手順に沿って説明していきます。

環境構築

/etc/apt/sources.list ファイルに、以下の 1 行を追加します(元サイトとは少し違いますので注意)。

deb [trusted=yes] https://max.kellermann.name/debian cegcc_buster-default main

この作業にはテキストエディタを用いても構いませんが、今回はファイルの末尾に足すだけですので、以下のコマンドを実行すればよいです(1 行目は改行、2 行目は実際の追記)。

sudo bash -c 'echo >> /etc/apt/sources.list'
sudo bash -c 'echo "deb [trusted=yes] https://max.kellermann.name/debian cegcc_buster-default main" >> /etc/apt/sources.list'

その後、以下のコマンドを実行してパッケージをインストールしてください。

sudo apt update
sudo apt install gcc-arm-mingw32ce

終わったら、以下のコマンドを入力してください。

arm-mingw32ce-g++ -v

以下のような出力が得られれば環境構築は終了です。お疲れさまでした!コマンドが見つからないというエラーが出た場合は、正しくインストールできていませんので今までの手順をもう一度確認してください。

Using built-in specs.
COLLECT_GCC=arm-mingw32ce-g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/arm-mingw32ce/9.3.0/lto-wrapper
Target: arm-mingw32ce
Configured with: ../../../configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-mingw32ce --disable-dependency-tracking --prefix=/usr --syscon
fdir=/etc --with-gcc --with-gnu-ld --with-gnu-as --enable-threads=win32 --disable-nls --enable-languages=c,c++ --disable-win32-registry --disable-multilib --dis
able-interwork --without-newlib --enable-checking --with-headers --disable-__cxa_atexit
Thread model: win32
gcc version 9.3.0 (GCC)

なお、 Cygwin 用は別の方がビルドしてくださっているようで、ここからダウンロードすれば使えるかもしれません(試していないため不明)。その他 Debian 系でない Linux で使用する場合は、ソースからのコンパイルが必要です。前提の所に書いた公式ページを参照してください。

ビルド

OUCC_Advent_2020.cpp を配置したディレクトリで、以下のコマンドを実行してください。

arm-mingw32ce-g++ -Wall -O2 -std=gnu++2a -march=armv5tej -mcpu=arm926ej-s -static -s -lcommctrl -o AppMain.exe OUCC_Advent_2020.cpp

成功すると AppMain.exe が生成されるので、電子辞書にコピーして実行してください。なぜか全画面表示にはなりませんが(ShowWindow(hWnd, SW_MAXIMIZE); が利いてないっぽい?)、下のようなウィンドウが表示されれば成功です!

追記

急ごしらえで sh スクリプトを作成しました。Build_CeGCC.sh を、コマンドラインオプションにソースファイル名を指定して実行すると AppMain.exe が出力されます。カレントディレクトリに resource.rc があればそれも併せてコンパイルします。

(2020年12月22日更新) 上記のコンパイルコマンド及び sh スクリプトを、新たな知見 (strip) に基づき更新しました。これにより、スタティックリンクを行うと実行ファイルが巨大化する、場合によって起動が遅くなったりメモリ使用量が増える問題は解消しました!!ShowWindow(hWnd, SW_MAXIMIZE); が利かない問題はまだ解消できていませんが、eVC4 から CeGCC への乗り換えが現実味を帯びて来たかも…?

(2021年3月28日更新) ShowWindow(hWnd, SW_MAXIMIZE); が CeGCC で利かない原因が判明しました。どうも CeGCC のヘッダファイルは通常版 Windows 用のものを流用しており、さらに Windows CE での定数は通常版 Windows とは一致しないようです。よって、今回の場合 SW_MAXIMIZE がコンパイル時に Windows CE における正しい数値に展開されなかったことが原因です。これ以外にも同様の問題は存在し、例えば最小化ボタンを表示させたはずが最大化ボタンが出たりします。なぜ定数を通常版 Windows と一致させなかったのかと Microsoft を恨みたくなりますが、eVC4 等の他のコンパイラに付属のヘッダファイルを参考に直接書き換えたり、ヘッダファイルごと置き換えてしまったりして対応することになると思います。

おわりに

今回は、SHARP Brain 用ソフトウェア開発の方法をまとめました。もしかしたらこういうのは Brain Wiki を拡充する方針で書くべきだったのかもしれませんが(笑)、参考になれば幸いです(2021年3月11日追記: ちゃんと書きました)。SHARP Brain のハックに興味がある方は、Brain での Linux 起動など、様々な挑戦が行われているコミュニティ Brain Hackers があります(ここに紹介があります)ので、そこに参加してみても面白いかもしれません。ただし、Brain Wiki 及び Brain Hackers は当部(OUCC; 大阪大学コンピュータクラブ) とは一切無関係ですのでご注意ください。

なお、今回は Windows API プログラミングについては一切触れていません。興味がある方は、Windows プログラミング入門 – Web/DB プログラミング徹底解説 が参考になると思います。ただし、C/C++ をそれなりに理解していることが求められます。また、最も原始的な方法となるため、比較的レベルが高くなります(高2の頃、Hello, world! にたどり着くまでに 1,2 週間かかりました)。さらには調べてもなかなか出てこない Windows CE の独自仕様も相当あるので(Command Bar が代表例)結構大変です。でも電子辞書で自作ソフトが動作する感動はなかなかなものです!

ちなみに、執筆者もいくつかの SHARP Brain 用ソフトウェアをオープンソースで公開しています。執筆地点では素因数分解プログラム超大量ファイル整理KN MemoPad 機能追加版 がありますので、もしよければ使ってみてください。Windows API プログラミングに関しても何か参考になるかもしれません。

では、ここまでお読みいただきありがとうございました!OUCC では、現在も部員を募集中です。興味がある方は、ぜひご気軽に Discord 新歓サーバー にご参加下さい!