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 最終更新: 2023-02-09 投稿者: watamario15

この記事は OUCC Advent Calendar 2020 の 20 日目の記事です。OS として Windows Embedded CE 6.0、CPU に ARM926EJ-S (Armv5TEJ) を搭載する電子辞書 SHARP Brain 用アプリケーションの作成方法を解説します。

注意点

ここで取り扱うものは、SHARP 公式の内容ではありません。普通、フリーズなどが起こった場合もリセットボタンを押せば元に戻りますが、万一何かが起こった場合も一切保証できませんので、自己責任で試してください

新機種の多くには、SHARP 公式のソフトウェア以外を起動できなくするプロテクトが掛かっています。具体的には、ビジネスモデル (PW-SBx) を除く PW-Sx4 以降の機種がそれに該当します。そういった機種での起動方法はこちらを参照してください。

この表で第1世代から第4世代に分類されている機種を対象とします。2021 年以降の第5世代に該当する機種用のアプリケーションは、この記事の方法では作成できません。

プログラム

この記事では、プログラミングよりも開発環境やコンパイル方法など、開発手順の解説に重点を置くため、単純なプログラムを使用します。brain.cpp をダウンロードしてください。なお、このプログラムは通常の Windows PC と Windows CE のどちらでも使用できるようにしてあるので、Brain を所持していない方でも Win32 アプリケーションを開発できる環境があれば試すことは可能です。

本格的に開発を行う際は、こちらのノウハウ集も参考にしてください。

開発環境

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

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

Visual Studio 2005/2008 の Professional 以上でも開発可能です。こちらを使用したい場合は、こちらを参照してください。

電子辞書での実行方法

内蔵メモリーまたは microSD カードに「アプリ」フォルダを作成し、その中にメニューに表示させたい任意の名前のフォルダを作成します。その中に、コンパイルして得られた実行ファイルを AppMain.exe に改名したものと、空のダミーファイル index.din を入れます。これにより、「アクセサリー -> 追加コンテンツ -> 追加アプリ・動画」に追加されます。メニューの配置は機種によって異なるので、この通りでない場合は似たものを探してください。加えて、第3世代以降の機種の場合、空のダミーファイル AppMain.cfg を加えることで高解像度状態のまま実行できるようになります。

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

CeGCC

Linux, Cygwin, WSL, macOS 等の UNIX 環境で使用できる、最新の Windows CE 開発環境です。Windows XP のような古い Windows 環境が不要で、GCC 9.3.0 ベースなので C++17 を完全にサポートしているなど、現在では最も使いやすい環境です。ただし、個人の方が作成されたものだというのもあり、若干癖があります。

基本的に公式サイトに従います。Debian 系でない OS や AMD64 以外の CPU を搭載する PC の場合は、こちらに従ってください。

環境構築

/etc/apt/sources.list ファイルに、以下の 1 行を追加します。どちらに属するか分からない場合は、Debian の方で試したうえでエラーが出た場合に Ubuntu の記法を試してください。

Debian:

deb https://max.kellermann.name/debian cegcc_buster-default main

Ubuntu:

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

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

Debian:

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'

Ubuntu:

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)

ビルド

brain.cpp を配置したディレクトリで、以下のコマンドを実行します。

arm-mingw32ce-g++ -Wall -Wextra -O3 -std=c++17 -march=armv5tej -mcpu=arm926ej-s -static -s -o AppMain.exe brain.cpp

成功すると AppMain.exe が生成されるので、電子辞書にコピーして実行します。冒頭の画像のようになれば成功です!

しかし、この長いコマンドを毎回入力するのは面倒です。また、ここでは紹介しませんが、リソースを含む場合はそのためのコマンドも必要となり、さらに面倒です。ここで、ビルド作業を自動的に行う shell script を用意しました。ceg++ (C++) / cegcc (C) を、コマンドラインオプションにソースファイル名 (複数可) を指定して実行すると AppMain.exe が出力されます。カレントディレクトリに resource.rc があれば、それもあわせてコンパイルします。

注意点

CeGCC のヘッダファイルは通常版 Windows のものを流用していますが、Windows CE での定数は通常版 Windows とは一部異なるため、これが原因で問題が発生する場合があります。例えば、最小化ボタンを表示させたはずが最大化ボタンが出たりします。そのため、ヘッダファイルを書き換える、正しい数値を直接指定する、正しい数値でマクロ定数を定義しなおす、等の対応が必要となります。今回のサンプルソースでは、冒頭にマクロ数値を補正するコードを記述してあります。Microsoft は初期の頃の Windows CE 開発環境を高値で販売していたようなので、「定数をずらすことでフリー実装の登場を遅らせて、その間に自社の開発環境で儲けよう」みたいなことを企んでいたのかもしれません。

また、CeGCC の公式ビルドはデバッグ情報を取り除く strip が行われていないため、開発したアプリケーションを Brain 上で動かすときに必要な C/C++ ランタイムを普通に静的リンクすると、極端に exe のサイズが大きくなります。これに対応するため、挙げたコマンドやスクリプトでは strip を表す -s オプションを付けてあります。

eMbedded Visual C++ 4.0

知る人ぞ知る、2000 年頃の Windows CE 用 Microsoft 純正無料 IDE です。激古なので C++ の新しい機能は使えず、Windows 2000 と Windows XP でしかフル機能が使えないという難点がありますが、最新の CeGCC が発見されるまでは唯一の無料で使える開発環境でした。

環境構築

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

次に、Windows 2000, XP の場合は Service Pack 4 (直リン)、Windows Vista 以降の場合は Service Pack 3 (直リン) をダウンロードして、同様の手順でインストールします。

最後に、いずれかの Standard SDK をインストールします。Windows 2000, XP の場合は両方の SDK をインストールしておき、ビルド時にどちらを使うか選択することも可能です。

  • Windows Vista 以降であるか、他の CE4 系デバイス (Sigmarion III など) も対象とする場合は、最初に解凍した中身の SDK フォルダに入っている setup.exe を実行し、指示に従いインストールします。ただし、Windows Vista 以降の場合は Windows XP (Service Pack 3) の互換モードを設定して実行します。
  • Windows 2000, XP であり、他の CE4 系デバイスを対象としない場合は、Windows CE 5.0 の Standard SDK をダウンロードし、インストールします。SHARP Brain のネイティブにより近いものができるのはこちらです。

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

左上の「ファイル(F)」から「新規作成」をクリックします。その後、下の画像のように設定します。CPU に関して、 SHARP Brain は Armv5TEJ ですが、この IDE にはないため ARMV4I を選択します。SHARP Brain 以外の CE デバイス用のビルドも行いたければ、ARMV4I に加えてその他の CPU を選択しても構いません。設定できたら「OK」を押します。

次の画面では、「空のプロジェクト」を選択します。

プロジェクト概要の画面で OK を押すと、プロジェクトが作成されます。

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

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

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

最後に、画面左上の「STANDARDSDK」という部分では、利用する SDK を指定します。Windows CE 5.0 用の SDK をインストールした場合は、STANDARDSDK_500 となります。

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

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

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

なお、Win32 (WCE ARMV4I) Debug と書かれているプルダウンメニューから、Release ビルドへや他の CPU への切り替えが可能です。

Pocket GCC

SHARP Brain 上でのセルフ開発が可能な GCC の Windows CE 移植版コンパイラです。eVC4 よりさらに機能は限られますが、PC がなくても使用できます。

準備

まず、こちらを参考に導入します。DOS窓Open の準備も必要です。

一通り終わったら、brain.cpp を win.cpp に改名したものと WINBUILD.BAT を電子辞書内の同じフォルダに入れます。この際、WINBUILD.BAT の 2 行目と 3 行目を環境に合わせて編集しておきます。

その後、DOS窓Open の cd コマンドでそのフォルダに移動し、WINBUILD.BAT を実行します。空白や日本語を含んでいても、クォーテーション不要で cd できます。成功すると AppMain.exe が生成されるので、これを実行して冒頭の画像のようになれば成功です!

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

おわりに

今回は、SHARP Brain 用アプリケーション開発の方法をまとめました。SHARP Brain のハックに興味がある方は、Brain で動作する Linux ディストリビューション Brainux の開発やその他の議論が活発に行われているコミュニティ Brain Hackers に参加してみると面白いかもしれません。

Win32 API プログラミングについては一切触れませんでしたが、こちらのノウハウ集が参考になると思います。ただし、ノウハウ集にも記載の通り、Windows における最も原始的な方法となるため難易度が高く、C/C++ をそれなりに理解していることが求められます。私も、高2の頃 Hello, world! にたどり着くまでに 1, 2 週間かかりました。さらに Command Bar など、調べても出てこない Windows CE の独自仕様も相当あるので大変です。しかし、電子辞書で自作ソフトが動作する感動はなかなかのものです!

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

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