2018年4月26日木曜日

【OpenComputers】OpenOS基礎知識

この記事はLinux未経験者を対象としています。
経験者は適宜読み飛ばしてください。

さて、OpenOSはLinuxライクに作られています。
そのため、Linux経験者には簡単に理解できることが、未経験者には全くわからないということがしばしば発生します。
また、Linuxライクとはいえ、Linuxとは少し異なる部分もあります。
今回は、そんな方々のために、これだけ理解しておけばとりあえずプログラムを実行させることができる、というようなレベルの解説をやっていきたいと思います。

ファイルシステム

Linuxでは、フォルダのことをディレクトリと呼びます。
ディレクトリのそれぞれの位置を表すものを「パス」と呼び、現在の参照フォルダを基準として位置を表すパスを「相対パス」、参照フォルダに関係なく一意に位置を表すパスを「絶対パス」と呼びます。
例えば、homeディレクトリの中の、programフォルダにあるhelloworld.luaというファイルの絶対パスは、「/home/program/helloworld.lua」と表されます。
もし、あなたが今homeディレクトリにいるのならば、相対パスでは、「./program/helloworld.lua」(正式)もしくは「program/helloworld.lua」(略式)と表されます。
(「./」は、現在の参照ディレクトリを表す。ちなみに、「../」は現在の参照ディレクトリの1つ上の階層のフォルダを表す。)

それでは、ファイル全体の構造について説明していきましょう。
最も上位のディレクトリ(すべてのディレクトリを含むディレクトリ)を、「ルートディレクトリ」と呼びれ、「/」というパスで表されます。
OpenOSでは、ルートディレクトリの下にbin,boot,etc,home,lib,mnt,usrの7つのディレクトリとinit.luaというファイルが初期状態であります。

bin(/bin)

コマンドの処理が書かれたプログラムが保存されています。たぶん、binaryが語源。

boot(/boot)

起動時の処理が書かれたプログラムが保存されています。

dev(/dev)

windwosユーザーにとって一番理解しがたいディレクトリ(だと個人的には思います)
普段使ってる分には、あまり関係のないディレクトリなので、読み飛ばして構いません。
「デバイスファイル」というファイルが保存されています。
そもそもはlinuxの、周辺機器をファイルと同様に扱おうという設計思想から来ています。
このファイルに書き込むことでそのデバイスにデータを送信できたり、逆にこのファイルを読み込むことでデータを受信したりできます。

etc(/etc)

様々な設定ファイルが保存されています。
ここを書き換えると、そのコンピューターの設定が変わります。(windowsでいうコントロールパネルみたいなもの)

home(/home)

ユーザーのファイルを保存しておくところです。
computer起動時に、プロンプト(コマンド入力画面)が最初に参照しているのはこのディレクトリです。

lib(/lib)

様々なライブラリが保存されています。
luaのrequireの一部はたぶんここを参照しているんだと思います。

mnt(/mnt)

HDDやフロッピーといった、ファイルシステムがこのディレクトリに属します。
windowsでいう「コンピューター」フォルダみたいなイメージです。(内部に様々なドライブが配置されていますよね)

tmp

一時的なファイルの保存場所です。
再起動すると中のデータが全部消えます。
ディレクトリ名は、temporaryから来ています。

コマンド

コマンドは、プロンプト(コマンド入力受付)画面で入力することで使用可能です。
プロンプトの、「#」より前は、現在参照中のディレクトリのパスを表しています。
linuxのコマンドは、「コマンド コマンドに渡す引数 --オプション(-オプションの頭文字)」という風に使用されます。(オプションを付けるかどうかは任意。各ワードの間は半角スペース。)
各コマンドは、「--help(もしくは-h)」オプションを持っており、このオプションを指定して実行すると、そのコマンドに関するヘルプを参照できます。

「ls」:現在参照中のディレクトリの中にあるファイル一覧を表示します。
「cd (パス)」:指定されたパスへと移動します。
「mkdir (フォルダ名)」:指定された名前のフォルダを作成します。
「edit (ファイルのパス)」:指定されたファイルを編集します。
「(ファイルのパス)」:指定されたファイルを実行します。
「shutdown」:シャットダウンします。
「reboot」:再起動します。
「mount」:HDDなどをマウントする(HDDやフロッピーといった外部ドライブをファイルシステムに組み込んで利用可能な状態にすること)際のコマンドです。複雑なので-hを確認してください。
「label (UUID) (名前)」:指定されたUUIDのコンポーネントに名前を付けます。UUIDは他と区別できる長さまで書けば問題ありません。(たいていは3文字か4文字)
「lua」:対話モード。https://moker-minecraft.blogspot.jp/2018/04/opencomputerslua.html
「flash (ファイルのパス)」:指定されたファイル(luaプログラム)をEEPROMに書き込みます。

ショートカット

Ctrl+D:入力待機画面中に押すことで、プログラムを終了させることができます。
Ctrl+Alt+C:実行中のプログラムを強制終了させることができます。


思いついたことはだいたい書きましたが、書き残しがあったらあとで追記します。

<参考>

【OpenComputers】対話モード(luaコマンド)の使い方

皆さん、対話モードというのをご存知でしょうか?
一行ずつ入力されたコマンドを実行していくというモードです。

スクリプト言語と呼ばれる言語のIDEにはほとんど実装されているこの機能ですが、LuaベースのOpenComputersにも実は実装されています。
検証作業に、大変便利なので覚えておくととても便利です。

起動するには、OpenComputersの入力受付(プロンプト)画面で、「lua」と入力してください。
これで、対話モードに入りました。
試しに「print("Hello World")」と入力してみてください。
「Hello World」と表示されると思います。

それでは、基本的な使い方を紹介していきましょう。

「=(変数)」というコマンドを打つと、変数の中身が表示されます。
たとえば、=computer.energy() と打つと、コンピューターが属するネットワーク内のエネルギー残量を調べることができます。

対話モードを終了するには、Ctrl+Dを押してください。
また、Ctrl+Alt+Cを押すと、たとえos.sleep()中でも、プログラムを強制終了することができます。

さて、解説は以上です。
良きOCライフを!

【OpenComputers】外部エディタの利用法

(a)コピー&ペーストする

まず、エディタで書いた内容をコピーしましょう。
あとは、editコマンドで編集モードを開いて、insertキーでクリップボードの内容を貼り付けるだけです。
なお、コピーできるのは最大1024文字だという情報があります。
https://oc.cil.li/index.php?/topic/1113-is-there-a-way-to-use-an-external-text-editor-to-edit-programs/

(b)ファイルを直接編集する

(最初は読み飛ばしても大丈夫です)
opencomputersにはeditコマンドを含め、ファイルを作成する/編集するコマンドが多数存在しています。
ただし、このコマンドの実行結果は即座に実際の.minecraft内のsaveファイルに反映されるわけではなく、一時的にメモリ内にバッファーされ、ワールドのセーブ(リログ)が入るたびに実際のsaveファイル内に書き込まれ、読み込まれるのです。
このような仕様になっているのは、クラッシュ発生時でもコンピューターの状態とファイルの状態を一致させるためだそうです。
例えば、セーブしてから少し時間がたって、ゲームがクラッシュした場合を考えてみましょう。
ロボットやコンピューターはセーブした時点での状態から、次回起動時に再開するわけです。
ここで、もし、ファイルが逐次保存される設定になっていると、クラッシュ直前のファイル状態が再現されてしまうことになります。
これでは、プログラム上、バグが発生する恐れがあります。
なお、この設定はconfig内の「bufferChanges」の項目で変更することが可能です。
(ただし、変更することで上記のようなトラブルが起きる可能性もあります。)

さて、前置きが長くなってしまいました。
とにかく、実際のsaveファイルからファイルが読み込まれるのは、ワールドにリログがかかったときのみなのです。
この前提を抑えたうえで、手順を説明していきましょう。

まず、先にコンピューター/ロボットなどの電源を落としておきます。

次に、ファイルをwindowsのフォルダに書き込みます。
フォルダのアドレスは、.minecraft/saves/(ワールド名)/opencomputers/(HDDのUUID)/home/です。
UUIDとは、opencomputersのコンポーネント類すべてに割り振られる、かぶることのないアドレスです。アルファベットと数字の羅列で構成されています。HDDのアイテムにマウスカーソルをかざすと、アイテム説明欄(ツールチップ)の左下にHDDのUUIDが表示されます。ロボットなどHDDを組み込むタイプの機械では、lua対話モードで、「=component.filesystem.address」と入力すると表示されます
また、(HDDのUUID)以下は、linuxに似たディレクトリ構造になっています。気になった方は調べてみてください。

最後に、OCとファイルの同期をかけます。
おそらく、最も簡単な方法は、HDDを取り外して、再挿入した上で、もう一度起動するというやり方だと思います。

さて、うまくいっているでしょうか?
lsコマンド、editコマンドなどで確かめてみてください。
まれに、opencomputersのキャッシュされたデータが、windowsファイルの方を上書きするということもありますので、注意して下さいね。