IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

スーパーエンジニアの独り言

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第29回 鏡の中のマリオネット 2013年11月

 前回記事の影響でSPARCstation 2に火を入れて(電源を投入して)OpenBoot PROMを操作した感覚が甦りました。
 そしてOpenBoot PROMからSunOSをブートするときに表示される「くるくる回るカーソル」を思い出してとても懐かしく感じられたのです。

 師匠にSunのご指南を賜った際にPROMモニターでFORTH(プログラミング言語です)を使いフレームバッファを操作してSunのモニターに(テレビのテストパターンみたいな)カラーバーを表示する、まるでテーブルマジックの様な華麗なる美技を拝見して驚きを隠せませんでした。
 その心拍数が未だ下がらないうちに、PROMモニターからSunOSをブートすると、くるくる回るカーソルが登場して「これもプログラムなんだよ。」と教えて貰った記憶があります。ジェットコースター効果だったのかもしれません。

 感化された筆者は、くるくる回るカーソルをC言語のプログラムで書いてSPARCstation 2の(GUIのSunViewを起動する前の)コンソール画面で動せるように勉強したのです。その記憶が甦ったのです。

 そこで社内向けの勉強会でのネタに「くるくるカーソル」のプログラム書いてそれをきっかけにコンピュータの仕組みを説明したのですが、それが高じてOpenBoot PROMエミュレータも創ってみました。
 エミュレータといいましても大層なものではなく一部のコマンドを模倣するだけの簡単なものです。ダミーであり、動きを模倣するだけの繰り人形(マリオネット)です。
 ですがそうにもかかわらず、マリオネットが踊り出すと不思議なもので愛着が湧いてきました。心理学での投影、想い入れの為せる業なのでしょう。

 そのプログラムですがRubyで実装したら割とすんなりと出来てしまいました。楽しんで頂くためにソースコード全文を以下にご掲載します。

# Copyright (C) 2013 Kazuhiro Fujie 
# All rights reserved.
# 
# This Program is freely distributable under the terms of an BSD license.
# See COPYING or http://opensource.org/licenses/bsd-license.php

# # Marionette - OpenBoot PROM Dummy Emulator # This "Marionette" emulate Sun Ultra 5 and implements only limited commands. # Please implements your machine or adding your favorite FORTH command.
# Example: How to play # $ ruby openboot_prom.rb # > # => old-mode prompt # > n # => change new command mode # ok # => can use FORTH commands # ok banner # ok probe-scsi # ok boot # => booting SunOS # # Make you comfortable: # If you use any Windows in japanese charactor codes, # Please change charactor code to utf-8 of your command prompt by chcp commands. # (The Japanese character code, because there is a known issue of the japanese YEN sign and backslash) # # Example: How to change code page on Windows command prompt # C:\Users\nexus> chcp 65001 # # 65001 => utf-8 # 932 => shift_jis
# Old-Mode Prompt while true do print("> ") input = gets.chomp unless input =~ /n/ next end break end
# OK Prompt (new command mode) # available FORTH commands are while true do print("ok ") input = gets.chomp case input
when "set-defaults" # set-defaults command print <<-SETDEFAULTS Setting NVRAM parameters to default values SETDEFAULTS
when "probe-scsi" # probe-scsi command print <<-PROBESCSI Target 1 Unit 0 Disk SEAGATE ST1120N 833400093849 Copyright 1992 Seagate All rights reserved 0000 Target 3 Unit 0 Disk MAXTOR LXT-213S SUN2074.20 PROBESCSI when ".version" # .version command print <<-VERSION Release 3.15 Version 2 created 1998/11/10 10:35 OBP 3.15.2 1998/11/10 10:35 POST 2.3.1 1998/08/07 16:33 VERSION
when "banner" # banner command print <<-BANNER Sun Ultra 5/10 UPA/PCI (UltraSPARC-IIi 333MHz), Keyboard Present OpenBoot 3.15, 128 MB memory installed, Serial #10933339. Ethernet address 8:0:20:a5:d1:3b, Host ID: 80a6d45b. BANNER
when "boot" # boot command break else next end end
# ok boot sequence # Cursor round and round, waiting loading time def puts_and_backspace(str, interval) print(str) # STDOUT.flush() sleep(interval) print("\b") end
for i in (1..25) do puts_and_backspace("|", 0.1) puts_and_backspace("/", 0.1) puts_and_backspace("-", 0.1) puts_and_backspace("\\", 0.1) end
# Boot messages on console hostname = "nexus6"
print <<BOOT1
Rebooting with command: boot Boot device: /pci@1f,0/pci@1,1/scsi@3/disk@0,0:a File and args: kernel/sparcv9/unix SunOS Release 5.10 Version s10_60 64-bit Copyright 1983-2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. configuring IPv4 interfaces: hme0. add net default: gateway 172.20.27.248 Hostname: #{hostname} The system is coming up. Please wait. BOOT1
sleep(1) # intermission
print <<BOOT2 NIS domain name is ctc-g.co.jp starting rpc services: rpcbind keyserv ypbind done. Setting netmask of hme0 to 255.255.255.0 Setting default IPv4 interface for multicast: add net 224.0/4: gateway #{hostname} syslog service starting.The system is ready. Starting Sun(TM) Web Console Version 2.1-dev.. volume management starting. The system is ready. BOOT2
sleep(2) # to the ending print "\n#{hostname} Console login: " sleep(10) # enjoy the afterglow puts

 遊び方ですが、上記のソースコードを"openboot_prom.rb"や"ultra5workstation.rb"などのお好きなファイル名で保存して下さい。後はコマンドラインからファイル名を指定してプログラムを実行するだけです。
 下記を御参考にして下さい。事前にRubyインタプリタ(MRI)をインストールするのをお忘れなく(Ruby公式サイトからダウンロードできます)。

  | $ ruby openboot_prom.rb
  | > n
  | ok banner
  | ok probe-scsi
  | ok boot

 プログラムを実行すると最初は制限モードであるオールドプロンプト(old prompt)が表示されます。
 "n"とタイプしてokプロンプト(new command mode)に移動しましょう。
 ニューコマンドモードではFORTHコマンドが実行できるようになりますので、"banner", "probe-scsi"などの幾つかのコマンドで(ダミーの)ハードウェア情報を確認出来ます。

fig01

 そしてメインの"boot"コマンドでSunOSを起動しましょう。SunOSからのブートメッセージに続いてログイン・コンソールが表示されましたらプログラム終了です。このブートメッセージは正確さを欠くかもしれませんが、その辺りはご愛嬌ということでご容赦下さい。

 筆者は想い入れのあるSPARCstation 2/Sun OS 4.1を模倣するつもりでしたが詳細なメッセージが想い出せずここではSun Ultra 5 workstationにしています。
 メッセージを修正してマシンを変更する、お好みのFORTHコマンドを追加する、など色々ご自身で改造するなどしてお楽しみ下さい。
 例えば、わざとカーソルを不均等に回すようにインターバルを不揃いに調整する小技を入れるとリアリティさを増すことでしょう、きっと。

 RubyのプログラムですのでUNIXだけでなくWindowsでも同じく遊べます。
 Windowsで楽しみを増すために、プログラム実行前に以下のchcpコマンドでコマンド・プロンプトの文字コードを英語にしておいて下さい。
 (日本語文字コードでは、バックスラッシュと円マークの既知の問題がありますので。)

  | > chcp 65001

 文字コードをコードページ番号 "65001"(UTF-8)へ変更できます。元に戻すには"932"(Shift-JIS)を指定します。
 ちょっとした手間でカーソルが綺麗にくるくると回ることでしょう。

 旧来のSunユーザー限定となるのかもしれませんが、筆者からの一足早いささやかなクリスマス・プレゼントとして受け取って頂ければ幸いです。
 郷愁に浸る、あの頃を回顧する、故きを温ね新しきを知る、何はともあれお楽しみ頂ければ本懐です。またこれがRubyを触るきっかけになれば嬉しいです。

 今回もSun OSの話ができませんでしたが、またいつかお話します。

 次回もお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes