Macintosh SE FDHDを直す

どうも,omzn教授 (古Mac収集学) です.

飾ってあるだけで特に電源を入れるわけでもないのに,古いMacたちは順調に劣化していきます.

12月に久しぶりに電源を入れたMacintosh SE FDHDが,起動中に爆弾を吐きました.ハードディスクから良くない音がしています.ついに逝ったか…

Macintosh SE FDHDの基本スペック

  • 発売: 1989年8月
  • CPU: Motorola 68000 @ 8 MHz
  • Memory: 4 MB
  • HDD: 20 MB SCSI
  • FDD: 1.4 MB

68000は同時代のインテルの80286と争っていたCPUです.
現代から見たら,CPUは1000倍,メモリも1000倍,HDDに至っては10万〜100万倍ぐらいの差がありますね…

ちなみに,Macintosh SEが1987年3月に発売されており,それはFDDのみ搭載でした.OSもFDDから起動していたのです.
SEにHDDを搭載したのが,SE FDHDです.ネーミングセンスが絶望的に無いですね.この後,SE/30という機種になると,CPUが68030になったりして大ヒットしました.

古いMac(Power Mac G3以前)のHDDはSCSIです.
SCSIは最大7台のデバイスを1つのバス上に載っけることができたりする便利な規格なのですが,安いIDE(ATA)に押されて消えていきました.それはそうと,SEを分解して,HDDを取り出します.

背面を開けるには長柄のトルクスビットが必要だったので,それを入手するのに数日かかりました.
ネジを外したあとに,背面を外すためには「Mac opener」なる工具があると良いそうなのですが,ざっと調べても売ってないので,諦めてへらで開けました.

むき出しのブラウン管が怖いです.

側面からブラウン管の表示調整ができます.フォーカスが甘くなっていたのと,上下左右が小さくなっていたので,いくらか調整するとくっきり映るようになりました.

HDD取れました.ごっつい….なんだあのステッピングモーターみたいなのは.

すでに2枚目で写っていますが,SCSIのHDDを代替するのが,BlueSCSIなるデバイスです.たぶん,載ってるRaspberry Pi PicoがSCSIのプロトコルエミュレーションをするんでしょうね.

こいつのすごいところは,SDカードそのものをSCSI化するわけではなく,SDカードに格納したディスクイメージをSCSI化することです.ディスクイメージはBasiliskIIやSheepShaverといったMacエミュレータと互換があるので,エミュレータで作ったディスクをコピーして実機にマウントさせることができます.ディスクイメージはいくつでも置けますので,SCSIのバス上に載せたようにみせかけることで,複数ドライブをマウントできます.こんなことができるのであれば,SDカードにアクセスできるようにして設置しないと意味がありません.SEの後部拡張スロットにSDカードアクセスのためのブラケットを作ります.

起動ドライブの作り方が一番悩ましいところですが,BlueSCSIのおかげでかなり楽になります.

まず,MacBook Proで,SheepShaver(Power PCエミュレータ)をセットアップして,MacOS 9が動く環境を作り出します.
MacOS 9が動く環境に,漢字Talk 7.1のインストールメディアとインストール先のディスクイメージを準備します.このとき,インストール先のディスクイメージは,SCSIドライバを組み込む必要があるので,Disk Jockeyなるアプリで作成します.
準備ができたら,OS 9から漢字Talk インストーラを起動し,空のドライブに向けてインストールさせます.その後,ディスクイメージをアンマウントして,SDカードにコピーして,実機Macintosh SEで起動します.

ポーン!

普通に考えると,なんでPowerPCで動いてるOS 9で680×0用のインストーラが起動するのか?,とか,ブートローダとかなんとか一切考えずにディスクベタコピーで起動ドライブになるのはなんで?とか不思議なことがいっぱいなのですが,

Macだから

で全て片付きます.

それではまた!

Classic Macintoshを集める・動かす

Classic Macintoshを集める・動かす

どうも,omzn教授 (古Mac収集学) です.

従前より古Mac収集を生業としておりますが,ここ1年は結構入手しました.

最近,Apple関連のキーボード,マウスだけでもかなりの量になることを認識しました.なお,マウスはほとんど全種類網羅されております.

廃棄場から連れてこられたPower Macintosh 8500と,前から死蔵していたPower Macintosh 8100/80AV.
8500は起動したのですが,メモリを増設しようと本体を開けた後に起動しなくなりました😭.8100は,起動するとロジックボードのエラーという無慈悲な表示が出ます.

Power Mac G4 (Mirrored driver doors)を入手しました.ジャンク扱いでHard offで3000円です.HDDは抜かれていましたが,メモリは2GB積んでいました.SATAのSSDをATAPI変換して搭載したら起動しました.Mac OS X 10.5まで動作します.

Power Mac G4は爆音マシンとしての悪評が高く,実際,起動しているだけでかなりうるさいのが難点です.この時代のMacたちは,性能を求めて失敗するか,デザインを求めて失敗するかのどちらかです.

勢い余ってiMac G4も入手しました.ヤフオクで1万円です.完動品でこのお値段は破格.

iMac G4は,G4 cudeで失敗したAppleが再びデザインを求めて送り出した機体です.G4 cubeでダメだったところが修正されており,コンパクト一体型としての完成度は非常に高いです.大福みたいなフォルムも可愛い.

こちらは,自作のミニミニMacintosh Classicクローンです.中にラズパイ5が入っており,SheepShaverというPowerPCエミュレータが起動して,MacOS 9が動きます.キーボードも当時のものをADB-USB変換器(自作)を通じて利用できます.

そふらぼでは,今,この古Macでプレイする「さめがめ」が大人気!

他にももっとありますが,今年はこれぐらいで…

Raspberry PiのPython3でSSLv3 handshake failureを解決した話

あくあたん在室モニターは,Raspberry Piで動いています.
先日らぼのWebサーバがアップデートされたときから,うまく動作しなくなりました.

モニターでは,らぼのWebサーバで公開しているAPIを叩いて在室状況を取得します.
APIはhttpだけでなく,httpsも対応していました.

モニターのログを見ると,データ取得ルーチンが止まっています.

ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure

おっ,SSLのエラーか.
新しいサーバではTLS1.0は捨てられました.そこに異議を唱えるつもりはないので,こちらで対応すべきですね.

普通に考えて,何かSSL周りが古いとかそういう状況が考えられます.
これまで,http.clientを使ってアクセスしていたのですが,requestsのほうが良い感じと聞いたので,書き換えてみました.実際,requestsは良い感じに書けます.

テストは次の方法でできます.

$ /usr/bin/python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import ssl
>>> print(ssl.OPENSSL_VERSION)
OpenSSL 1.1.0j  20 Nov 2018
>>> requests.get('https://se.is.kit.ac.jp/')
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py",
line 600, in urlopen
    chunked=chunked)
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py",
line 343, in _make_request
    self._validate_conn(conn)
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py",
line 839, in _validate_conn
    conn.connect()
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connection.py", line
 344, in connect
    ssl_context=context)
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/util/ssl_.py", line
347, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.5/ssl.py", line 385, in wrap_socket
    _context=self)
  File "/usr/lib/python3.5/ssl.py", line 760, in __init__
    self.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 996, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 641, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failur$ (_ssl.c:720)

しかし,エラーは消えませんでした.

pipで関連するモジュールを最新にしてみました.

しかし,エラーは消えませんでした.

試しに,Macで同じコードを実行しました.

~> python3
Python 3.7.3 (default, Mar 27 2019, 09:23:15)
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import ssl
>>> print(ssl.OPENSSL_VERSION)
OpenSSL 1.0.2r  26 Feb 2019
>>> requests.get('https://se.is.kit.ac.jp')
<Response [200]>
>>>

エラーは出ません.

たまたまPython3.4が動いているraspberry piが生きていたので,そこから同じコードを実行しました.

Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import ssl
>>> print (ssl.OPENSSL_VERSION)
OpenSSL 1.0.1t  3 May 2016
>>> requests.get('https://se.is.kit.ac.jp')
<Response [200]>
>>>

エラーは出ません.

古いpythonと古いsslでも動くのに,ちょうど今のpython3.5とopenssl 1.1.0jの組み合わせでは動かないの??
問題が切り分けられずに頭が痛くなってきます.こうなったら初期化です.Raspberry Piの公式から最新のイメージをダウンロードして,SDを初期化します.

まっさらなraspbianの上でなら…

$ /usr/bin/python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import ssl
>>> print(ssl.OPENSSL_VERSION)
OpenSSL 1.1.0j  20 Nov 2018
>>> requests.get('https://se.is.kit.ac.jp/')
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py",
line 600, in urlopen
    chunked=chunked)
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py",
line 343, in _make_request
    self._validate_conn(conn)
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py",
line 839, in _validate_conn
    conn.connect()
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connection.py", line
 344, in connect
    ssl_context=context)
  File "/home/pi/.local/lib/python3.5/site-packages/urllib3/util/ssl_.py", line
347, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.5/ssl.py", line 385, in wrap_socket
    _context=self)
  File "/usr/lib/python3.5/ssl.py", line 760, in __init__
    self.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 996, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 641, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failur$ (_ssl.c:720)

こらあかん.
ついに,Raspberry Pi上でPython 3.7をbuildし直すことにしました.

$ sudo apt update
$ sudo apt install -y libffi-dev libbz2-dev liblzma-dev libsqlite3-dev libncurses5-dev libgdbm-dev zlib1g-dev libreadline-dev libssl-dev tk-dev build-essential libncursesw5-dev libc6-dev openssl
$ cd Python-3.7.3
$ ./configure --enable-optimizations
$ make
$ sudo make install

インストールが終わったら,requestsモジュールをインストールします.

$ sudo /usr/local/bin/pip3 install requests

テストします.(ほんま許して)

$ /usr/local/bin/python3
Python 3.7.3 (default, Apr 27 2019, 21:00:58)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import ssl
>>> print(ssl.OPENSSL_VERSION)
OpenSSL 1.1.0j  20 Nov 2018
>>> requests.get('https://se.is.kit.ac.jp/')
<Response [200]>
>>>

動いた…

なお,この後.新しいPython3.7.3ではもう1つのはまりポイント,pygameにて更に苦労することになります.
それはまた,別の話