linux mint 21でvnc serverのVinoをインストールしてMacから接続する

linux mint 21をクリーンインストールしたPCにMacから画面共有したくてgnomevnc serverをインストールした。

いつからかlinux mintには画面の共有という設定が無くなっている。linux mintの開発チームはユーザーは画面の共有を行わないと判断したの?

Macからlinux pcの画面共有を行うため端末から

$ sudo apt install vino

と打って、以前使用していたvnc serverであるvinoをインストールする。

ただしこれだけだとMacからlinux pcに接続できない。以前GUIの画面の共有で設定したことと同じ設定を行わなければいけない。

まず端末から現在の設定をgsettingsコマンドで確認する。

$ gsettings list-recursively org.gnome.Vino

ここで表示された設定をgsettings setコマンドで以下に示す従来のものに再設定する必要がある。

org.gnome.Vino notify-on-connect true
org.gnome.Vino alternative-port uint16 5900
org.gnome.Vino disable-background false
org.gnome.Vino use-alternative-port false
org.gnome.Vino icon-visibility 'client'
org.gnome.Vino use-upnp false
org.gnome.Vino view-only false
org.gnome.Vino enabled true
org.gnome.Vino prompt-enabled false
org.gnome.Vino disable-xdamage false
org.gnome.Vino authentication-methods ['vnc']
org.gnome.Vino network-interface ''
org.gnome.Vino require-encryption false
org.gnome.Vino mailto ''
org.gnome.Vino lock-screen-on-disconnect false
org.gnome.Vino vnc-password 'passwords'

端末から違いがある行をgsettings set  org.gnome.Vino key値 設定値を打ち込んで変更する。

org.gnome.Vino enabledはkey自体が無くなったので無視。

authentication-methods keyは

gsettings set org.gnome.Vino authentication-methods "['vnc']"

とする。

vnc-passwordは

gsettings set org.gnome.Vino vnc-password $(echo -n 'password' | base64)

としてpasswordsの箇所を認証時に使うものに変更する。

あとはlinux mintのメニュー→設定→自動起動するアプリに/usr/lib/vino/vino-serverを追加する。

linux pcを再起動した後、MacのFinderからコマンド+kでサーバーへ接続を表示してvnc://linuxpc.localで接続すると画面共有が出来るようになる。

アタリ・ポンの回路

アタリのポンは1972年に発表された。設計者はアラン・アルコーン。

汎用CPUがない時代なので(intelの8008が1972年)TTLロジックで構成されている。

オブジェクトの移動、当たり判定、得点表示、フィールド描画等をすべて論理回路で実現している。

ポンの回路を解析している人がいてその説明からどのようにゲームを実現しているか見てみる。

参考にしたpdfファイル。

http://www1.cs.columbia.edu/~sedwards/papers/edwards2012reconstructing.pdf

ポンは

  • 二人用ゲーム
  • パドルを操作してボールを打ち合い相手がミスをしたら得点

という単純なもの。ゲーム画面は

Wikipediaポンより

画面から

  • 左右にプレイヤーが操作するラケットがあり上下に移動する
  • ボールはラリーによって左右に移動する
  • 画面上部に得点が描画されている
  • 画面中央にセンターラインが引かれている

となっている。

目次

NTSC信号の生成

まず画面表示のため、水平同期信号と垂直同期信号を作成する。

14MHzのオシレーターを分周して7MHzのマスタークロックを作成する。

マスタークロックをカウンターでカウントして1ライン455クロック周期の水平同期信号の元になる信号を作成する。

水平同期信号をカウンターでカウントして1画面262ライン周期の垂直同期信号のもとになる信号を作成する。

これらの回路から生成される信号はオブジェクト表示位置や表示幅にも使用される。

またこれらから水平、垂直ブランキング信号(表示マスク信号)、HSYNC,VSYNCを作成する。

画面中央のネットを描画するタイミング信号を生成する。V4の信号を使っているので縦4ラインの破線が描画される。

 

パドル表示とコントローラーからの入力

プレイヤーが操作しているパドル入力によってパドルの表示と位置を決める信号PAD1(プレイヤー1),PAD2(プレイヤー2)を生成する。

555タイマーはトリガー入力により、RCの時定数により決まるパルス幅のクロックを1クロック出力する。

ユーザーのパドル(コントローラー)の入力による抵抗値の違いでパルス幅が変化し、タイマーの出力パルスが[L]になったタイミングで16ライン幅のパドルが左右に描画される。

画面が256ライン目の描画のタイミングでコントローラの読み込みを開始し、555タイマーの出力が[H]から[L]になるタイミングで555タイマー下の7493 4bitカウンターがカウントを開始し、カウント値1111bになるまで、PAD1,PAD2を[H](パドルの表示)にする。

カウンターが1111bになると、自身のクロック入力をマスクしてカウントを停止し、PAD1,PAD2を[L]にする。なおこの4bitカウンターは衝突後のボールの反発処理にも使用する。

 

パドルの幅は中央右G3cの2NANDより、4ドット幅となる。

またパドルの水平位置は中央右H3aのD-FFにより決定される。

0--------128(PAD1)----------256----------384(PAD2)---------

 

当たり判定

パドルがボールに当たったかを判定するには、PAD1,PAD2が[H]のときの、パドルの水平、垂直位置とボールの水平位置と垂直位置が一致すると当たり(HIT1=[H],HIT2=[H])と判定する。

 

ボールの水平方向の移動

ボールは水平方向に左右に移動する。画面の更新タイミングVRESET=[H]になると、0-3ドットの移動が行われる。

 

ボールの表示タイミング(HVID)と移動

ボールの左右への移動は9ビットのカウンターを使って、水平周期より+1,−1,0の周期の差があるカウントを実行する。

差が+1の場合は水平周期よりもボールの周期が1大きくなるのでボール表示は右に移動する。

差が−1の場合は水平周期よりもボールの周期が1小さくなるのでボール表示は左に移動する。

差が0の場合は水平周期と一致するので移動はおこなわず、停止状態となる。

 

左右の移動を決定する。

ボールのラリーが続くとボールの移動速度が増加する。そのため1フレーム毎の移動を1,2,3ドットと増加させることで移動速度を変化させる。

 

ボールの垂直方向の移動

垂直方向の移動も水平方向と同様の方法でボールを移動させる。カウンターの周期が小さいとボールの表示(VVID=[H])が上に移動し、大きくなると下に移動する。またおなじになると水平移動となる。

画面の上下辺にボールが来たときは方向を反転させ、ボールがラケットに当てたときはラケットに当たった場所により垂直方向の移動を変化させる処理を行う。

 

ボールの垂直方向カウンター

1フレームの水平ラインをカウントする。

 

ボールが画面上下にきたときの反転処理

表示開始時(VBLANK=[L])にボールの表示(VVID=[H])であったとき、方向を反転させる。(上画面に当たったら下方向へ、下画面なら上方向になる)

これはJK-FFのQが[H]のときと[L]のときで移動量は同じで方向のみ変える設定値を2セット用意して実現している。

 

ボールがパドルに当たった場所により上下の移動量を変化させる。パドルに衝突したときの位置(B1,B2,C1,C2,D1,D2)をラッチする。この位置によって上下3段階と水平の上下の移動を行う。B1,B2,C1,C2,D1,D2についてはパドル入力回路でパドルの描画を行うカウンターの出力になる。またATTRACTはデモモードでアクティブになる。

反転用のJK-FF(A2a)やパドルの衝突位置のラッチ(B5a,A5a,A5b)データと水平方向の周期は加算器B4で生成する。

 

加算器B4に入力する反転用のJK-FF(A2a)やパドルの衝突位置のラッチ(B5a,A5a,A5b)データから以下のように垂直方向の周期が決定される。

上下にボールが衝突してA2aの出力が反転するとボールの移動量は同じで増加または減少の量は同じになる。

例:

A2a,B5a,A5a,A5b 0000 ←→ 1000 Range 7-255 ←→ 13-255

A2a,B5a,A5a,A5b 0001 ←→ 1001 Range 8-255 ←→ 12-255


===============================================
A2a B5a A5a A5b A4 A3 A2 A1 B4 B3 B2 B1  Range
-----------------------------------------------
0   0   0   0   0  0  0  0  0  1  1  1   7-255
0   0   0   1   0  0  0  1  0  1  1  1   8-255
0   0   1   0   0  0  1  0  0  1  1  1   9-255
0   0   1   1   0  0  1  1  0  1  1  1  10-255
0   1   0   0   0  1  0  0  0  1  1  0  10-255
0   1   0   1   0  1  0  1  0  1  1  0  11-255
0   1   1   0   0  1  1  0  0  1  1  0  12-255
0   1   1   1   0  1  1  1  0  1  1  0  13-255
1   0   0   0   0  1  1  1  0  1  1  0  13-255
1   0   0   1   0  1  1  0  0  1  1  0  12-255
1   0   1   0   0  1  0  1  0  1  1  0  11-255
1   0   1   1   0  1  0  0  0  1  1  0  10-255
1   1   0   0   0  0  1  1  0  1  1  1  10-255
1   1   0   1   0  0  1  0  0  1  1  1   9-255
1   1   1   0   0  0  0  1  0  1  1  1   8-255
1   1   1   1   0  0  0  0  0  1  1  1   7-255
-----------------------------------------------

スコア記録と画面表示

水平ブランキング期間とボールの水平位置(HVID)が一致したらミスとして得点用カウンターをインクリメントする。どちらのプレイヤーのカウンターをインクリメントするかは水平の移動方向(L,R)で決定する。このカウント値を画面に表示する。

カウンターは4ビットの10進カウンターに2桁目表示用にJK-FFで構成される。

 

画面表示

 

最後に表示するオブジェクトをまとめてVideo Outとして出力する。

スコア表示(SCORE)

ボール(G1b),パドル1,2,ネットの表示(F2b)

感想

ゲーム機側のアルゴリズムも2用にしてユーザーに任せるという、ゲームが成り立つぎりぎりまでシンプルにしたデザインの勝利ですな。あとコレ簡単にコピーされただろう思う。

これを見てCPUとメモリの存在がいかに複雑なゲームを可能するかがわかった。

Perlで矢印キーを取得する

Perlで矢印キーを取得するにはTerm::ReadKeyを使えば良いらしい。

Term::ReadKeyをインストール

コマンドライン

cpan Term::ReadKey

を実行してイントールする。

インストールが完了したらPerlでキー入力を取得してみる。

  1 #!/usr/local/bin/perl
  2 
  3 use Term::ReadKey;
  4 
  5 ReadMode 4;
  6 
  7 while( (my $key = ReadKey(0)) ne 'q') {
  8     #カーソルキー入力
  9     my $arrowkey = 0;
 10     if (ord($key) == 27) {
 11         my $code = ord(ReadKey -1);
 12         if ($code == 91) {
 13             my $arrowkey = ord(ReadKey -1);
 14             print "Press-Key Left\n"        if ( $arrowkey == 68 );
 15             print "Press-Key Right\n"       if ( $arrowkey == 67 );
 16             print "Press-Key Up\n"          if ( $arrowkey == 65 );
 17             print "Press-Key Down\n"        if ( $arrowkey == 66 );
 18         }
 19     } else {
 20         print "Press-Key $key\n";
 21     }
 22 }

7行目 $key=ReadKey(0)で$keyにキー入力データが入る。アルファベットや数字はそのまま文字として$keyに格納されるので(q)キーが押されるまでループする。

10-12行目は矢印キーが入力されたかのチェック。矢印キーはエスケープ文字であるのでこのように順に処理していくらしい。

 

実行して、a b c カーソル右 カーソル上 カーソル左 カーソル下を入力すると、

Press-Key a
Press-Key b
Press-Key c
Press-Key Right
Press-Key Up
Press-Key Left
Press-Key Down

ターミナル用RSS管理ツールnewsboatでポッドキャストを購読する

newsboatでポッドキャストRSSを購読

MacPodCastアプリが使いにくいので普段聞くのはターミナル上で行いたい。なのでnewsboatを使ってPodCastの番組を管理したい。newsboatの使い方はコマンドラインでrssを閲覧する newsboat - k-igrsの日記を参照。

Macポッドキャストアプリにある番組の更新をターミナル上で行い、必要によってローカルのディスクに保存する。

続きを読む

Apple IIのハードウエア(5)

Apple IIの内部I/O

Apple IIの内部I/Oは以下の回路のような構成になっている。

続きを読む

MacでVerilogのシミュレーションをしてみる5

MacでVerilogのシミュレーションをしてみる1 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる2 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる3 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる4 - k-igrsの日記

の続き。

レジスタに直値を代入する命令を追加する。

続きを読む

MacでVerilogのシミュレーションをしてみる4

MacでVerilogのシミュレーションをしてみる1 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる2 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる3 - k-igrsの日記

の続き

メモリへの読み書きを行うために、レジスタを実装しメモリーレジスタ間の命令を追加する。

続きを読む