少ないリソースを酷使する

低レイヤーとレトロPC(PC98,MSX)が好きな情報学生

MS-DOS(PC-98)のアプリケーションをC言語で作る

前回の記事PC-98エミュ+FreeDOSの環境でMS-DOSアプリが動くことを確認した.
となると,あと思うことは1つ.

MS-DOSのアプリケーションを自作したい!

ということです.
今回はC言語MS-DOSのアプリケーションを作ってみましょう.

環境

OS:Ubuntu 20.04
PC-98エミュ:xnp2kai rev.22 d3fe02a
FreeDOS(98):20200709更新のHDI形式

Cコンパイラのinstall

i8086版GCC

フリーのCコンパイラと言えばGCC.便利ですよね.
しかし,少し前までGCCは32bit || 64bitのアーキテクチャしかターゲットにしてきませんでした.
なので16bitのPC-98x1向けのバイナリは生成できなかったわけなんですよね.
それが最近,ついに16ビット版GCCが登場しました.しかもDOS環境特化.
詳しい話は以下の記事によくまとめられています!

ということでCコンパイラgcc-ia16を使いましょう!

gcc-ia16 を install

嬉しいことにaptでインストールできる.
https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/

$ sudo add-apt-repository ppa:tkchia/build-ia16
$ sudo apt-get update
$ sudo apt-get install gcc-ia16-elf

Hello world!

以下のhello.cコンパイル→実行してみる.

#include <stdio.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}

コンパイルする.
-marchオプションでターゲットマシンのCPUアーキテクチャを指定する.

$ ia16-elf-gcc -march=i286 -o hello.com hello.c

ちゃんとMS-DOSの実行ファイルになっているか確認しよう.

$ file hello.com
hello.com: COM executable for DOS

hello.comPC-98エミュレータ上で実行してみる.
f:id:T-takeda:20201027224008p:plain

やったね!

気をつけるべきこと(メモリーモデル)

プログラムサイズがデカくなると以下のエラーが出るかもしれない.

Error: too large for a .com file.

これは,COM実行ファイルが64KB以下でないといけない仕様のため.
参考wikipedia: https://ja.wikipedia.org/wiki/COM%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB

これは-mcmodelを調整することで解決できる.
コンパイルできない場合オプションの値をtiny small medium と上げていこう.
tinyで生成されるのがCOMファイル.small medium で生成されるのがEXEファイルなので,-oオプションでの拡張子名には気をつけよう.
オプションの値の説明は以下の通りだ.

-mcmodel=medium    Generate code for the medium code model, with one data segment and multiple text segments.
-mcmodel=small     Generate code for the small code model, with one data and one text segment.
-mcmodel=tiny      Generate code for the tiny code model (default), with one combined data and text segment.

なぜこの設定が必要なのかはx86 16ビットモード特有のメモリーモデルの話になるのだが...今回は割愛する.
以下のリンクを参照されたし.
https://www.wdic.org/w/TECH/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB

アセンブル出力を見てみる

動きが怪しいなと思ったり,デバッグをしたいときはアセンブル出力を見てみよう.

$ ia16-elf-gcc -march=i286 -S hello.c
$ cat hello.s
 .arch i286,jumps
    .code16
    .att_syntax prefix
#NO_APP
    .section  .rodata
.LC0:
    .string   "Hello world!"
    .text
    .global   main
    .type main, @function
main:
    pushw    %bp
    movw %sp, %bp
    pushw    $.LC0
    pushw    %ss
    popw %ds
    call puts
    addw $2,    %sp
    movw $0,    %ax
    movw %ax, %ax
    movw %ax, %ax
    leavew
    pushw    %ss
    popw %ds
    ret
    .size main, .-main
    .ident    "GCC: (GNU) 6.3.0"

うん,ちゃんとintel 80286向けのハロワアセンブラが生成されている.
ちなみにアセンブラの記法はAT&T記法.
Intel記法のアセンブラが見たい場合オプションに-masm=intelを加えるといい.
だが,Intel記法の出力は実験的機能らしいので正確性は注意されたし.

よくわからんところ

ia16-elf-g++でC++コードもコンパイルできるようだが,なかなかうまくいかない.
具体的には,以下のコードのコンパイルにまだ1度も成功していない.

#include <iostream>

int main(int argc, char *argv[]) {
  std::cout << "Hello World!" << std::endl;
  return 0;
}

基本的に以下の記事と全く同じような状況にハマってしまっている.
https://flaterco.com/kb/gcc-i16.html

まだC++でのMS-DOSアプリの開発は無理なんだろうか...

おまけ(実機テスト)

PC-9801DX実機+MS-DOSで動かしてみたがしっかり動作した!
すごい!!
f:id:T-takeda:20201027230600j:plain f:id:T-takeda:20201027230608j:plain

まとめ

コンパイラの使い方に困ったら.

$ ia16-elf-gcc --help
$ ia16-elf-gcc --target-help
$ man ia16-elf-gcc

あたりを見てみよう.
次は機会があれば,C言語DOS(PC-98)のアプリケーションをいろいろ作ってみたいと思いますー
それでは!

Linux上のPC-98エミュでFreeDOS環境を整える(2)

前回の記事でPC-98x1エミュレータFreeDOSを起動してみました.
さて,MS-DOS向けのソフト何か試しに起動してみたいですね.
私は試しに機動警察パトレイバーに出てくるレイバー用OS「HOS」の起動画面を再現するフリーソフトを起動してみたいと思います.
以下からダウンロードできます.
https://www.vector.co.jp/soft/dos/amuse/se003159.html

仮想イメージエディタなどで先ほどの仮想HDイメージ.hdiにファイルを注入することでエミュレータにファイルを渡すことができるんですが,毎回それをやるのはちょっと面倒...
エミュ内からホスト側のフォルダにアクセスできるようにしたいですね.

それ,できます

ということでやっていきます.

ホスト側のフォルダをエミュにマウントする

共有するフォルダを作る

エミュレータと共有したいフォルダを作ります.

$ mkdir PC-98_Folder

共有フォルダのパスと権限を設定

エミュレータで設定する方法と,設定ファイルを直接書き換える方法があります.
エミュレータで設定する方が簡単ですね.

エミュレータで設定する

エミュレータを起動して,メニューから[Device]→[Hostdrv option...]を選択します.
f:id:T-takeda:20201022212100p:plain

出てきたウィンドウで,共有フォルダのパスと権限を設定します.
f:id:T-takeda:20201022212117p:plain

設定ファイルを直接書き換えて設定する

~/.config フォルダの中にnp2kaiのフォルダがあります.
その中のxnp2kaircがエミュの設定ファイルです.

$ ~/.config/xnp2kai
$ nvim xnp2kairc

適当なエディタで開いて,以下のように設定しましょう.

hdrvroot = ~/PC-98_Folder
hdrv_acc = 3

hdrvrootが共有フォルダのパス.
hdrv_accがフォルダへのアクセス権限設定です.
bit0が読み込み権,bit1が書き込み権の設定フラグらしいので,3を指定すると「読み込み書き込み可」になります.

設定ファイルのその他の設定項目が気になる人は,以下に設定項目がまとまってます.
https://www.nonakap.org/np2/html/help/ja/othercfg.html

共有フォルダのマウント

前々回の記事でnp2kaiをソースからbuildした人は, そのソースのフォルダの中にnp2toolというのがあると思います.
(無い人||ソースからbuildしてない人)は以下のページにダウンロードリンクがあります.
https://sites.google.com/site/np21win/download

まずはnp2tool.zipを解凍します.

$ cd ~/NP2kai/np2tool
$ unzip np2tool.zip

で,エミュを起動して画像のような手順でFDDnp2tool.d88をセットします.
f:id:T-takeda:20201022212040p:plain f:id:T-takeda:20201022212204p:plain

セットしたら,DOS上で以下のような手順を踏みます.
1. Bドライブ(np2tool.d88をセットしたドライブ)に移動.
2. [HOSTDRV D]コマンドを実行.オプションの英字で設定したドライブにフォルダがマウントされます.
3. Dドライブ(共有フォルダをマウントしたドライブ)に移動.
4. ヤッタァ!
実際のコマンドの流れ以下のようになりますね.

A:¥> B:
B:¥> HOSTDRV D
B:¥> D:
D:¥> DIR

f:id:T-takeda:20201022212254p:plain

ソフトを起動する

共有フォルダに起動したいソフトをぶち込んで,.EXEか.COMを起動します.

D:¥> cd HOSOP150
D:¥> HOSOP

やったー!
f:id:T-takeda:20201022212232p:plain

まとめ

これで簡単にいろんなソフトを楽しめますね.
次回?はPC-98向けのソフトを作成するC言語開発環境を整えます.

Linux上のPC-98エミュでFreeDOS環境を整える(1)

前回の記事LinuxにPC-98x1エミュレータを入れてみました.
しかし,「PC-98エミュを入れたところでOSがないと既存のアプリが動かせんやん!!!」
と,なってしまいますよね.
かと言って,当時のPC-98用OSは手に入りづらい・・・
そんな貴方のために,今日はお金をかけず簡単にPC-98エミュレータ上にDOS環境を構築する流れを備忘録的に書いていきます.

FreeDOSとは

世の中には無料で配布されているDOSがあります,その一つがFreeDOSです.

FreeDOSは、PC/AT互換機のためのオペレーティングシステム (OS) である。 MS-DOS互換の自由な代替環境などを目的として作られた。
(引用:https://ja.wikipedia.org/wiki/FreeDOS)

要するに,MS-DOSを持ってなくてもこれを使えばMS-DOSプログラムが動かせるってことですね.
MS-DOS互換」とは言ってますが,実際はMS-DOS以上に高機能なDOSになってます.

PC-98向けFreeDOS

FreeDOS(98)

元々のFreeDOSは上記にもある通りPC/AT互換機のためのオペレーティングシステム (OS) ですが,
これをPC-98にも移植したFreeDOS(98)という神プロジェクトがあります.
現在の最新版(機能的に最新)な物は以下で公開・配布されています.
http://bauxite.sakura.ne.jp/software/dos/freedos.htm

最終更新は2020年07月09日(記事執筆時点)と,つい最近更新されました,神.

動作条件

READMEから引用すると,以下のようなスペックが求められるようです.

FreeDOS(98)の動作に必須となる環境は以下の通りです。

  • NEC PC-9801シリーズおよびその互換機 (ハイレゾモード、PC-98LT、PC-98HAは未対応)
  • 256Kバイト以上の基本メモリ
  • 2DD(640K)もしくは2HD(1M)のフロッピーディスクドライブ、SASI、SCSIIDE接続のハードディスクのうち、いずれか1基以上(PC-9801初代/E/F/Mの2D(320KFD)は未対応)

PC-9801初代のHDインターフェースには対応していない可能性がありますが、未確認です…)

推奨環境は以下のようになります。

  • 80286以上のCPUを持つPC-9801シリーズおよびその互換機(i386以上を推奨)
  • 640Kバイト以上のメモリ(1.6Mバイト以上を強く推奨)
  • SASI、SCSIIDE接続のハードディスク

1Mバイト超のメモリが存在しない場合、FreeCOMがXMSを使ったメモリスワップを利用できないため、基本メモリの空き容量が少なくなるかもしれません。 (ディスクイメージに入っているMEMコマンドで、空きメモリ容量が確認できます)

ディスクイメージはFD,HD共にエミュレータでの動作を想定している,
よって,実機で動作させるには一手間必要かもしれない.

ダウンロードから起動まで(めっちゃ簡単)

ダウンロード

というわけでPC-98エミュでFreeDOSを使ってみましょう.
先ほど示した公開ページから,

FreeDOS(98)各種PC-98エミュレータ用ハードディスクイメージ(HDI形式)

の項目にあるzipをダウンロードしましょう.
んで,zipを解凍します.

$ unzip -d FreeDOS_98 fd98_hd_250m_20200709.zip

起動

今回は前回の記事でセットアップしたNP2kaiエミュでFreeDOSを使ってみます.
まずはNP2kai起動.

$ ./xnp2kai

f:id:T-takeda:20201013233035p:plain

メニューバーから,[HardDisk]→[IDE0-0]→[Open]を選択する. f:id:T-takeda:20201021221631p:plain

先ほど解凍したFreeDOSフォルダの中にある****.hdiを選択して開く. f:id:T-takeda:20201021221700p:plain

[Emulate]→[Reset]でエミュレータをリセットする. f:id:T-takeda:20201021222334p:plain

そうして,少し待つとFreeDOSが起動します!!簡単!!
f:id:T-takeda:20201021222410p:plain

ちょっとしたテスト

dirコマンドでフォルダの中身をみれます.
verDOSのバージョンを表示したり,timeでシステム時刻を確認したりして動作を確認します.
f:id:T-takeda:20201021222433p:plain

まとめ

とりあえず,今日はここまで!
次回は実際にFreeDOS(98)上でMS-DOS向けのアプリ何か試しに起動してみます.

令和の時代にLinuxにPC-98x1エミュレータを入れる

時代は令和,PC-9801が発売されたのは1982年であるから,もう30年以上前.(今日で38周年)
何なら40年の時が経とうとしているが...
そんなことはどうでもいい.ユーザーはPC-98x1が使いたいのだ.
よって,LinuxにPC-98x1エミュレータを導入する方法を備忘録的に書いていく.

めっちゃ簡単な方法

WindowsバイナリをWineで動かすと簡単
大体動くのは確認したけど完全に互換性があるかはわからん

Wine をいれる

$ sudo apt install wine-development

使い方としては以下のようにexeファイルが実行できる.

$ wine ~/hoge.exe

以下,配布されているWindows実行バイナリとして主なものを2つ紹介する.

Neko Project Ⅱ

Intel 80286相当のエミュレートができる.
80286相当なので,アーキテクチャIA-32(現在一般的にx86と呼ばれているもの)より前のx86-16bit.
リアルモードのみのエミュレートをサポートする.

以下から実行ファイルがダウンロードできる
https://www.yui.ne.jp/np2

Neko Project 21/W

Intel 80486以上のエミュレートができる.
具体的には以下のチップ

Intel i486SX , i486DX , Pentium, MMX Pentium, Pentium Pro, Pentium II, Pentium III, Pentium M, Pentium 4 プロセッサ AMD K6-2, K6-III, K7 Athlon プロセッサ選択可能(一部機能未実装)

個人的に嬉しいのはFPUが使えるところ.
i486あたりだとFPUはもうSoCに内蔵されているから,内蔵FPUのエミュレートなんだろうか.
コプロセッサだった頃のFPUとの互換性は未知数.(後で確かめてみよう)

以下から実行ファイルがダウンロードできる
https://sites.google.com/site/np21win/download

BIOSとフォントファイルについて

実機のBIOS.ROMとFONT.ROMはexeと同じ場所に置けばとりあえずOK
実機からBIOS.ROMとFONT.ROMを吸い出す方法は記事の後半を参照してね.
f:id:T-takeda:20201013232932p:plain

ソースからBuildする方法

「wineで動かすと不安定...」「ちゃんと互換性があるか不安...」という人はソースからエミュレータ をBuildしましょう.

NP2kai

ソースからLinuxの実行ファイルを生成するならこれが一番.
数あるnp2の派生をだいぶ吸収しているので機能充実.

install

インストール手法は以下に詳しく書いてある.
https://github.com/AZO234/NP2kai

Linux意外にも,WindowsmacOSAndroidiOSなど多くのプラットフォームに対応しています.

X11ポート install

今回はLinux + X Window System 11 ポートでBuildしてみます.
個人的にはこれが簡単だった.
私が試した環境はUbuntu20.04

手順書

詳しい手順は以下に詳しく書いてある.
https://github.com/AZO234/NP2kai#x-with-gtk2-and-sdl

ツールinstall

Buildに必要なツールをinstallします.

$ sudo apt install git cmake ninja-build build-essential libx11-dev libglib2.0-dev libgtk2.0-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev  libusb-1.0-0-dev libfreetype-dev libfontconfig1-dev libssl-dev

build

githubからリポジトリをクローンして,CMakeの基本的な下準備をします.

$ git clone https://github.com/AZO234/NP2kai.git
$ cd NP2kai
$ mkdir build
$ cd build
$ cmake .. -D BUILD_X=ON -D BUILD_I286=ON

成功すると最終的に以下のようなログになる.参考までに.
とにかくエラーが出ていなければOKでしょう.

・・・
-- Checking for module 'glib-2.0'
--   Found glib-2.0, version 2.64.3
-- Found glib2.0
-- Found GTK2_GTK: /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so  
-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1f")  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hiro/NP2kai/build

ビルドする.
-j オプションの引数は各自の環境に合わせて書き換えてください.

$ make -j3

xnp2kaixnp21kai という実行ファイルが生成されていればOK
xnp2kaiは Neko Project Ⅱ 相当,つまりはIntel 80286相当のエミュレートアプリ.
xnp21kaiは Neko Project 21/W 相当,つまりはIntel 80486以上のエミュレートアプリです.
...多分.

$ ./xnp2kai

で,起動すればOK

$ sudo make install

でinstallできます.

f:id:T-takeda:20201013233035p:plain

BIOSとフォントファイルについて

~/.config/ の中に xnp2kai/xnp21kai/ があるのでここに入れればOK

$ cd .config/
dconf/           gnome-session/   ibus/            update-notifier/
enchant/         goa-1.0/         menus/           xnp21kai/
evolution/       gtk-2.0/         nautilus/        xnp2kai/
gedit/           gtk-3.0/         pulse/          
$ ls xnp2kai/
BIOS.ROM  FONT.ROM  debugss  font.tmp  sav  xnp2kairc

実機からBIOSとフォントファイルを吸い出す方法

以下から,getbios.lzhをダウンロードします.
(公式ページにもツール配布リンクがあったんですが,リンク切れのよう)
http://retropc.net/yui/np2tool/index.html

解凍して出てきた,GETBIOS.COM を実機のMS-DOS上で実行すれば吸い出せます.

最後に

令和の時代もよいPC-98ライフで楽しみましょう.
f:id:T-takeda:20201013233016p:plain

次回は,MS-DOSがなくてもPC-98エミュレータが楽しめる,FreeDOS(98)の導入について書きます.

macOS Catalina 10.15.7でVirtualBoxがクラッシュする問題を解決

問題

macOS Catalina 10.15.7にしたら,VirtualBox仮想マシン(Ubuntu20)が起動できなくなった.
具体的には仮想マシンGRUBまではブートするが,Linuxカーネルのブートに入るとクラッシュしてしまう.

環境

f:id:T-takeda:20200928045346p:plainf:id:T-takeda:20200928045507p:plain

急いでる人のための結論

仮想環境のオーディを無効化する.
VirtualBoxの [設定] > [オーディオ] と進み,「オーディオを有効化」のチェックを外す. f:id:T-takeda:20200928191233p:plain

問題の切り分け

最近のCatalinaとVirtualBoxの相性

まず,macOS CatalinaはVirtualBoxと相性が悪いようで,同様の問題がちょくちょく起きているようだ.
applech2.com
(そもそも最新のCatalina 10.15.7も不具合が複数報告されている...大丈夫か...?)
で,どうやら10.15.6で発生した似たような問題は「10.15.6追加アップデート」なるもので修正しているらしい.
applech2.com
VirtualBox側がBugFixする場合もあるようで,VirtualBoxをverUPしたら直ったという話もある.
が,私のMacOSも,VirtualBoxも現時点(2020/9/28)で最新なのでそこら辺の更新は含まれているだろう(たぶん)

既存の解決方法【うまくいかないやつ】

・ヘッドレスモードで起動する
・ターミナルからVBoxHeadless -s <vm_name>で起動する
・セキュリティの設定を確認(コンピュータへのアクセスを許可)
ざっと調べた感じ上記の解法がよく出てきたが,どれも私の環境ではうまくいかなかった.

最終的な解法【うまくいったやつ】

結果的にうまくいったのは以下の記事に書かれていた方法だった.感謝感激.
qiita.com

最終的に、VirtualBoxの [設定] > [オーディオ] と進み、「オーディオを有効化」のチェックを外してあげるだけで解決しました

ここではCentOSが起動できない問題に対しての対処になってるが,Ubuntu仮想マシンでもうまくいった.
どうしてこの方法でうまく行くのか...上記の記事の方はどうやってその解法にたどり着いたのか...全くの謎だがとにかく動いたのでヨシ.

最高の相棒だった12インチMacBookとの別れ

昨日,約4年の間使っていたMacBookと別れることになったので,MacBook 12インチは最高だったという布教も込めて,私と愛機の思い出を書く.

使っていたMacBook

私が使っていたMacBookは2016年か2017年の12インチ モデル.
CPUはIntel Core m3SSDは256GB色はSpace Grayだった.
タイトルで”相棒”とまで書いたのにスペックをうろ覚えなのは...ごめんな.

f:id:T-takeda:20200926223105j:plain
my_macbook1

MacBookとの出会い

まず,私は大学に入学してパソコンを買うお金がなかった.
今でこそ私が通っていた大学の学部はラップトップPC必携になったが,私が入学したときはその制度はなかった.
よって必ず買わなければいけないわけでもなく,研究室の各個人のデスクにデスクトップPCが設置されていたので(私が学部生の頃は入学してすぐ研究室に配属されるシステムだった)私はラップトップPCを結局買わなかった.
なので課題や調べ物は全て研究室のPCか自宅のPCでこなすことになるのだが,大学のPCはプログラミング環境が一通り揃っていたし,研究室はエアコンも効いていて自分が住んでいる部屋よりも広く快適だったので研究室に永遠と居座るようになり,同期や後輩からは「研究室に住んでいる」とまで言われていた.
しかし流石に,授業中に座学を聴きながらさっさと手元のPCで課題を進めたり,大量の紙資料を持たずにPCで授業資料を見たりと,スマートに大学生活をこなしている周りの人たちに私は羨ましいと思う反面,嫉妬していた.
特にもMacBookを使っているヤツ!!オシャレ気取ってんのか!授業で使わされるツールはほとんどWindowsやぞ!と内心ディスっていました.
まぁ,ともかく.
インターンなどで外出先でもプログラミングしなきゃいけない状況が来るかもしれない中でラップトップPCを持っていないのは不便だ,ただ金がない」
と,大学2年生ぐらいの時にその時お世話になっていた教授に,飲み会でそれとなく話した.
すると「お,いいよ.うちで買ったPC誰も使ってないし卒業するまで使いな」とあっさり言ってくれた.
嬉しさのあまり後日すぐに受け取りに行ったのを覚えている.
しかし....手渡されたのはそう...MacBookだ...
教授はMACerだったのだ...
その時私は使いこなせるか不安でもあったが,OSの研究室に行きたいと気持ちを決めていた時期でもあったので「WindowsLinux以外のOSにも触れられるいい機会か」と思いMacBookを使い始めたのだった.

MacBookに腹が立った時期

幼い頃,自宅にあったWindows2000? Me?あたりに触れてから,ずっとWindowsユーザだった私にとってMacは非常に不便なものだった.
まず,ラップトップを手に入れた喜びに浮かれ,授業中に初回起動を行ったのだが教室中に鳴り響く「デーーーーン!!!!」
...これは私の不注意だが.
キーボードの配列が違う,Windowをxボタンで消してもアプリは終了しない,USB Type-Aの穴がない,Windowsで使い親しんでいたアプリが使えない,など最初は使いながらキレ散らかしていた.
Microsoft Officeを入れていなかったので,オフィスツールの互換性も微妙.
一時期はBootCampでWindows入れてやろうかとも思った.

MacBookと仲良くなった

アプリ

最初にMacBookでいいなと思ったのはPagesとkeynoteだった.
確かにMicrosoft Officeとの互換性は微妙だが,1から資料を作るならこっちの方がシンプルで,綺麗なデザインができると感じた.
なのでまずはMacBookは私の資料作成のお供になった.授業中にゴリゴリレポートを書きながら,Macの操作に慣れていった.

入力IF

そして何より,操作に慣れてくると感動するのはマウスパッドだ.
この操作性はそれまで2000年初期のラップトップ PCしか使ったことのなかった私からしたら衝撃だった.なんと使いやすいことか!
そしてキーボードも気に入った.
私が使っていたMacBookのキーボードはバタフライキーボードで,巷では「ぺたぺたキーボード」などと多少煽られ気味に言われたりして,賛否両論あるらしいが私はこれがひどく気に入った.Appleは早く外付けのバタフライキーボードを発売して欲しいと今でも思っている.
音もそれなりに静かで,カチッとしっかり押した感もある.

開発環境として

ターミナルとシェルは最高だった.
それまでWinのコマンドプロンプトを使ってたとはいえ,渋々使っていたようなもので,本当は「Linuxみたいに操作できればな...でも普段使いのマシンをLinuxにするのは...」と思っていた.
そんな悩みをMacは解決してくれた.GUIエディタを使い始めるまではほとんどターミナルで操作していたほど便利だった.
また,前半で「授業で使わされるツールはほとんどWindowsやぞ!」と言いがかりをつけていたが,Homebrewを使い始めてからは何も問題なかった.
もちろん授業ではWindowsを前提に説明が展開されるが,ほとんどの場合Macでもなんとかなった.(組み込み系以外は)
むしろ,自分でオレオレ系環境を構築するいい経験になった.

そして最高の相棒に

MacBook 12インチモデルは何より軽いし小さい.1kg未満の重さで,電源を切る必要もなく,気軽にいつでも身に付けるようになった.
本当にいつでもだ.買い物に行く時さえ持ち歩いていた.
(今は一時的にMacBook Pro 13インチ 2019モデルを使っているが,とにかく重い.持ち運びたくない)
そして彼は,学校の授業,サークル活動,インターン,勉強会,セキュリティ・キャンプ,卒業研究,全てを支えてくれた.
パソコンは所詮ツールであるが,乗り物というツールである車を愛車として愛するように,私はすっかり12インチ MacBookの虜になり,愛用機としていた.

f:id:T-takeda:20200926234338j:plainf:id:T-takeda:20200926233811j:plainf:id:T-takeda:20200926233943j:plain

f:id:T-takeda:20200926233815j:plainf:id:T-takeda:20200926233827j:plainf:id:T-takeda:20200926233833p:plain

相棒との別れとこれから

そんな愛用機も大学からの借り物,ついに返さなければならない日がきた.それが昨日だ.
そもそも学部卒業時に一回催促されていたのだが,「卒業研究で使っているので」というお情けで返却が伸びていたのだ.
そもそも借り物をここまで私物のように扱っていた私は正直とち狂っていたが,愛着がわいてしまったのでしょうがない(言い訳)
偶然にも同じタイミングで,3月までの期限付きでMacBook Pro 13インチ 2019年モデルが支給されたので今はとりあえずこれを使っている.
最近はバイトもして,少しは安定した収入もあるので,自分でMacBookを買いたいと思っている.
しかし,どのモデルがいいのかさっぱり分からず,とりあえずお気に入りだった12インチが欲しいなと思ったが,このサイズは長い間新機種が発表されていない...
どうやら今年中に12インチモデルが出るかもというネット記事も見たので,当分借り物のMacBook Proを使って様子見をしようかとも思っている.
誰かMacBookに詳しい人がいたら相談に乗って欲しい.
それでは改めて.

さらば相棒

f:id:T-takeda:20200926235311j:plain

OpenVINOでIntel HD Graphicsを活用する(導入編)

OpenVINOを導入する.
備忘録的なので多少雑なのは許してほしい.

OpenVINOって?

この記事を見てる人はこの説明はいらなそうだが...
端的に言えば,学習済モデルをインポートして,色んなハード上で(+ハードに最適化された実装で)推論を走らせるツールキットである.
ツールキットなんで細かく説明すれば色々入っているが,ざっくりそんなかんじ.
詳しくは以下の記事がとっても優しく解説してくれている.
https://jellyware.jp/kurage/openvino/c01_overview.html

環境

PC : インテル® NUC キット NUC8i3BEH
CPU: インテル® Core™ i3-8109U プロセッサー
OS : Ubuntu 18.04.5 LTS (x86_64)
OpenVINO tool kit: 2020.4 Release

安全のために

安全な環境構築には保険が大切.
よってまずは,TimeshiftでPCのホットバックアップを取る.
あとは

$ sudo apt update
$ sudo apt upgrade

を実行した後に,何なら再起動もしよう.
多少手間かもしれないが,何度もパッケージ依存関係の崩壊で研究室の実験用マシン環境を汚してきた自分は念の為これを行う.
(本当はDockerとかの上に構築したいくらい)

OpenVINO導入の手順書

基本的には公式のドキュメントにめちゃくちゃ優しく説明されている.
よって,実際はこれのとおりやるだけなんだけど,今回は有効ハードをIntel_HD_Graphics,OSをLinuxに限定して必要な部分の手順だけまとめる.
後で自分が参照しやすくていいね.

OpenVINOのDownload

Linux用のチュートリアルを読んでいく.
んで,#install-openvinoにダウンロードリンクが書いてるからそこに飛ぶ.
具体的にはここからダウンロードできるらしい.
環境はLinuxを選択して,Register & Downloadを押す.
個人情報など聞かれるので素直に答えるとダウンロードページに飛べる.
カスタマイズパッケージとフルパッケージが選べるらしいが,この違いはオンライン・インストーラかどうかということらしい.
私はフルパッケージをダウンロードした.
ダウンロードボタンはtgzファイルへの直リンクっぽいので,リンクさえコピーすればcurlとかでダウンロードできる.CUI環境にも優しい.

さて,あとはよくある手順で解凍してディレクトリ移動を行う.

$ cd ~/Downloads/
$ tar -xvzf l_openvino_toolkit_p_<version>.tgz
$ cd l_openvino_toolkit_p_<version>

Installする

インストールウィザードをGUIで実行するかCUIで実行するか選べるらしい.優しいね.
私はなんとなくCUIのインストールウィザードを使ってみることにした.
必ずroot権限でinstall.shを起動すること.

$ sudo ./install.sh

1. Welcome

f:id:T-takeda:20200828153406p:plain 親切丁寧な対話型ウィザードが起動するので,基本的に指示に従ってぽちぽちするだけ.
CUIウィザードは翻訳にかけやすくていいなと思った.

3. Prerequisites

f:id:T-takeda:20200828153519p:plain f:id:T-takeda:20200828153530p:plain 途中で「前提環境が足りない」みたいなことが言われるが,足りない部分は最終的に勝手にインストールされていた.(これで正しいのか...?)

5. Configuration

f:id:T-takeda:20200828153555p:plain 以下のものはカスタムインストールしない限り基本勝手に入れてくれるらしい.

  • Model Optimizer
  • Inference Engine
  • Drivers and runtimes for OpenCL™ version 2.1
  • Intel® Media SDK
  • OpenCV
  • Inference Engine Code Samples
  • Demo Applications
  • Additional Tools
  • Documentation for Pre-Trained Models

インストール容量は850MBくらい.

6. First Part of Installation is Complete

最後まで優しい.
f:id:T-takeda:20200828153618p:plain

外部の依存ソフトウェアをインストールする

ウィザードの最後に「これをやってね」とやることを示してくれたが,ちょっとまって欲しい.
追加でインストールすると便利なライブラリがあるらしい.
入れない理由もないので入れておこう.

$ cd /opt/intel/openvino/install_dependencies
$ sudo -E ./install_openvino_dependencies.sh

Intel-optimized build of OpenCV library とは...

環境変数を設定する

下記を実行すると一時的に環境変数が設定されるらしい.

$ source /opt/intel/openvino/bin/setupvars.sh
[setupvars.sh] OpenVINO environment initialized

起動するたびに毎回設定するんはだるいから.bashrcに書こうね.
(私はzshなので.zshrc)

$ echo 'source /opt/intel/openvino/bin/setupvars.sh' >> ~/.bashrc

公式チュートリアルでは編集にviが使われている...

最後に,不安な人はprintenv環境変数を確認しよう.

$ printenv | grep openvino

モデルオプティマイザーを構成する

モデルオプティマイザーなるものを使うと,CaffeやTensorFlowなど主要なフレームワークで学習した,学習済モデルをインポートできるらしい.
OpenVINOではインポートしたいフレームワークごとに,それに対応したモデルオプティマイザーが用意されている.
個別に必要なものだけをセットアップすることも可能だが,今回はサポートしているモデルオプティマイザーをすべて入れる.

$ cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites
$ sudo ./install_prerequisites.sh

インストール容量は80MBちょっとだった.

とりあえず動作確認

かんたんなデモを実行してOpenVINOが動くことを確認しましょう.
以下のフォルダにいくつかデモが入っている.

$ cd /opt/intel/openvino/deployment_tools/demo

CUI環境なら以下の画像分類デモが良いでしょう.
車の画像(car.png)を入力に推論を実行する.

$ ./demo_squeezenet_download_convert_run.sh

...

Top 10 results:

Image /opt/intel/openvino/deployment_tools/demo/car.png

classid probability label
------- ----------- -----
817     0.6853030   sports car, sport car
479     0.1835197   car wheel
511     0.0917197   convertible
436     0.0200694   beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon
751     0.0069604   racer, race car, racing car
656     0.0044177   minivan
717     0.0024739   pickup, pickup truck
581     0.0017788   grille, radiator grille
468     0.0013083   cab, hack, taxi, taxicab
661     0.0007443   Model T

[ INFO ] Execution successful

GUI環境なら以下のデモが良いでしょう.
ナンバープレートを含む特定の車両属性を識別する.

./demo_security_barrier_camera.sh

f:id:T-takeda:20200828154138p:plain 終了するときは画像ビューアウィンドウを閉じる.

GPU(Intel_HD_Graphics)を使うようにする

OpenVINOがIntel_HD_Graphicsを使えるようにセットアップしてあげる.
基本的には以下の手順だけ.簡単.

$ cd /opt/intel/openvino/install_dependencies/
$ sudo -E su
$ ./install_NEO_OCL_driver.sh

が,こんなエラーが出るかも知れません.
私は出ました.

Intel OpenCL graphics driver installer
Looking for previously installed user-mode driver...
dpkg-query: intel-opencl に一致するパッケージが見つかりません
dpkg-query: intel-ocloc に一致するパッケージが見つかりません
dpkg-query: intel-gmmlib に一致するパッケージが見つかりません
Found intel-igc-core installed, uninstalling...
dpkg: 依存関係の問題により、intel-igc-core の削除ができません:
 intel-igc-opencl は以下に依存 (depends) します: intel-igc-core (= 1.0.10-2407).

dpkg: パッケージ intel-igc-core の処理中にエラーが発生しました (--purge):
 依存関係の問題 - 削除しません
処理中にエラーが発生しました:
 intel-igc-core
ERROR: unable to remove intel-igc-core
       please resolve it manually and try to launch the script again.

同じ問題にぶち当たった人の記事↓
https://openvino.jp/configuration-ubuntu1804/
この記事では過去にOpenVINOをインストールしていた場合、依存関係で同じエラーが出るとされているが,私は過去にOpenVINOをInstallした記憶がない...はて?
ともかく,上記の記事の解決方法(手動でintel-igc-openclを削除)は効いたのでよしとしよう.

$ dpkg -r intel-igc-opencl
$ ./install_NEO_OCL_driver.sh

正常に完了すると以下のような忠告?が出るが,公式チュートリアルでは「無視していいよ」とのことなので何もしなくていい.

Installation completed successfully.

Next steps:
Add OpenCL users to the video group: 'sudo usermod -a -G video USERNAME'
   e.g. if the user running OpenCL host applications is foo, run: sudo usermod -a -G video foo
   Current user has been already added to the video group

If you use 8th Generation Intel® Core™ processor, you will need to add:
   i915.alpha_support=1
   to the 4.14 kernel command line, in order to enable OpenCL functionality for this platform.

GPUが使えるか動作確認

FPSで性能差が比較しやすいので,車両属性を識別のデモがいいだろう.
optionに-d GPUを指定して実行する.

$ ./demo_security_barrier_camera.sh -g GPU

途中で長いロードが入るが動いているので安心して結果を待とう.
f:id:T-takeda:20200828154250p:plain

CPU実行より,3.5倍以上のFPSが出ている.
GPUが有効になっていることは明らかだね.(ログにもちゃんとGPUを使っていることは出ている)

まとめ

OpenVINOを導入した.
Intel_HD_GraphicsをGPGPU用途で簡単に扱えるようになったので嬉しいね.
余裕があればOpenVINOで他の学習済モデルを実行する(応用編)の執筆もするかもしれない.
以上.