コンピュータの日記です

目次

2018-07-12 メモリアドレス
2018-07-04 続・Unity
2018-06-25 Unity
2018-06-12 ゲームの作り方
2018-06-11 スプラトゥーン2のフェス勝敗の確率
2018-04-24 Nexus 7 復活
2018-04-12 ロードランナー レガシー
2018-01-23 サターンポリゴンのゆがみ
2018-01-10 原初のプログラム
2017-12-20 無言電話(SIP SPAM)
2017-12-18 P10 plus に乗り換え
2017-12-13 0sim
2017-12-12 IP電話
2017-11-27 リロケータブル
2017-10-27 Android Chromeでスクロールがおかしくなるバグの原因と修正
2017-10-23 P10 に乗り換え
2017-09-16 続・ヒューマンリソースマシーン
2017-09-12 ヒューマン・リソース・マシーン
2017-08-08 スプラトゥーン2 その後
2017-07-24 スプラトゥーン2初感
 …同じテーマのほかの記事
メモリアドレス  2018-07-12 18:07:43  コンピュータ

▲目次へ ⇒この記事のURL

先日、僕のページを参照しながらツイッターで話をしている人がいました。


#時々エゴサーチしてますよ


話の内容は、「コンピューターのメモリアドレスはいつから使われ始めたか」。

この話のきっかけが、僕が書いた「バベジの解析機関」の話だったのです。


実際はパンチカードは2組有り、1つはプログラムを、もう一つはデータを格納した変数を示します。これは、現在のコンピューターと違い、メモリに番地を割り振ると言うアイデアがなかったために、常に変数を指示する必要性があった事に由来します。


上は僕の書いた記事の抜粋。

もう20年も前に書いた記事なので、いま読むと恥ずかしい、説明不足な部分があります。


実際には、メモリは番号で区別されてはいます。

ただ、現代的な「アドレス」とはちょっと違うものなのです。


数学のアルゴリズムには、計算対象を変えながら、同じ計算を繰り返す、という操作は頻繁に現れます。


例えば、行列の掛け算とか。

「掛け算」なんて基本的なものなのに、計算対象を変えながら繰り返すという複雑な操作が必要なのです。




今のコンピューターは、プログラム内蔵式です。


プログラムはメモリに保存されていて、いま注目しているアドレスの命令を実行したら、注目している部分を次のアドレスにずらし、順次実行していきます。


しかし、バベジの解析機関は、プログラムはパンチカードで供給され、読み込みながら順次実行されました。

カード送り機構があり、次々と新しいカードが読み込まれるために、順次プログラムが実行されていきます。


そこに「アドレス」という概念はありません。

プログラム実行に、アドレスは必ずしも必要ないのです。



バベジの解析機関は、データ保持用のメモリ(バベジの用語では「ストア」)を多数持ち、プログラムで命令でデータの取り出し・保持が指定された際には、もう一組のカードから「使うべきメモリ」を読み込みました。


つまりは、使用するメモリは、プログラムとは独立していて変更可能です。

プログラムを「ループさせる」ことは可能だったので、適切に2組のカードを設定すれば、計算対象を変えながら行列計算を行うようなことも可能です。



しかし、このカードは変数が必要になるごとに読み込まれ、変数自体を計算によって求めるようなことはできません。


C言語風の書き方になりますが、


A1 + A2



A[1] + A[2]


の違い、と言えばわかってもらえるでしょうか。


前者の 1 2 は、区別するための記号にすぎません。連続した数値ではないのです。

しかし、後者の 1 2 は、記号ではなく数値です。連続したメモリの中の位置を示す「アドレス」です。



それぞれのやり方で、10個のデータの合計を求めようとすると、こうなります。


SUM = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10;


for(i=0;i<10;i++)SUM += A[i];



前者のやり方で、データが 100 個に増えたら大変です。

しかし後者なら、わずかな変更で対応できます。



もう少し根源的な言い方をすると、「アドレスが計算対象か否か」です。

コンピューターは計算のための道具ですが、その計算に使用するメモリのアドレスすら、計算の対象とできるかどうか。



メモリに区別のための番号が割り振られていたとしても、計算対象でない場合には、「アドレス」とは呼べないように思います。




ではいつからメモリにアドレスが割り振られたか、というと、実は話は簡単で、プログラムがメモリ内蔵型になった時だと思われます。


ENIAC(1946) は、配線によってプログラムを行いました。

そもそも、現代的な「プログラム」のイメージですらありません。


それ以前のハーバードマーク1(1944) では紙テープでプログラムを行いますが、まだアドレスの概念はありません。

データを保持できる場所…メモリと言っても差し支えない場所は 72個あるのですが、実はすべてが「カウンタ」で、それぞれがタイガー計算機だと思ってください。


タイガー計算機ですから、足し算・引き算だけ出来ます。

72個のカウンタの、どこからどこに足し合わせるか、というデータの流れをひたすら記述することがプログラムになります。


この 72 個は、番号で区別されていますが、ただの区別の記号です。

この番号を計算対象として、配列を実現するようなことはできません。




最初にメモリ内蔵型を提唱したのは EDVAC(1951) です。

この際に、「メモリには、プログラムとデータを一緒に入れてしまう」という決断をしています。


しかし、さすがにこの二つは別物だろう…ということで、1bit の区別フラグがつけられています。

プログラムからは、データを読み書きすることはできるのですが、プログラムを読み書きすることはできません。


EDVAC は命令を「5つ組」で示します。命令と、アドレス4つです。


アドレスは、演算対象となるデータが入っているアドレス2つ、結果格納アドレス、次の命令のアドレスです。



現代のコンピューターから見ると、「次の命令アドレス」が随分と奇異に見えます。

自動的に次のアドレスの命令を読み込むのではなく、いちいち次の命令のアドレスを指定する必要があるのです。


これは、「メモリに割り振られたアドレスは、識別用の記号であり、連続した数値ではない」という設計思想のためです。


もちろん、演算対象・結果格納用のアドレスも、連続した数値ではありえません。

ここには直接数値を入れてあり、アドレスと見なされるため、配列アクセスのように「アドレスを計算する」ことはできないのです。




EDVAC の設計論文を見て、先に完成させてしまったのは EDSAC(1949) です。

この際、回路を簡略化し、素早い完成を目指す中で、データとプログラムを区別するビットが省略されています。


これは、うっかり間違えてプログラムを破壊しないための、保護機構でした。

逆にいえば「うっかりミス」が無いように人間が注意すれば、機械として作りこむ必要はないと判断したのでしょう。


用意された命令は、EDSAC のものとそれほど変わりません。

ただし、「次の命令アドレス」は不要で、連続したメモリの命令を順次実行していきます。


おそらくは、「次の命令アドレス」を無くせばその分のメモリが不要になる、という簡略化のための判断です。

しかし、これにより「メモリアドレスは連続している」という設計思想が生まれています。


とはいえ、データアクセスの際には、固定値でアドレスを示します。計算できません。

これが当時としては標準的なやり方だったためです。



ところが、ここにうれしい誤算が生じます。

プログラムの保護機構を省略したことが、非常に柔軟なプログラムを可能にしていました。

保護機構が無いということは、プログラムもまた、同じメモリに置かれたデータに過ぎないということです。


プログラムの置かれた特定のアドレスを演算対象として、書き換えてしまえば…

アドレス部分を書き換え、「順次アクセスする」ようなプログラムが可能になるのです。



当初の設計に織り込まれたものではないとはいえ、手法に気づいたら積極的に利用した節があります。

プログラム自身を演算対象とできる…これはコンパイラなどが作れるということですし、実際簡易なアセンブラ兼ローダー兼 BIOS である「ブートローダー」が作られています。



EDSAC では、メモリアドレスを計算対象とし、配列演算ができるようになったのです。




蛇足ながら、EDSAC よりも完成の早かった、The Baby(1948) でもプログラムの自己書き換えは可能だったように思います。

しかし、これは実験機のため、極端にメモリが少ないマシンでした。


小さなプログラムを書いたらメモリいっぱいで、自己書き換えなどのテクニックを駆使して配列操作するような余裕はありません。


現代の CPU では、「レジスタに入っている数値をアドレスとしてメモリにアクセスする」というような機能があります。


レジスタは計算のための特殊メモリですから、この数値をアドレスとする、というのは、アドレスを計算対象とすることにほかなりません。

EDSAC では「自己書き換え」で実現されていた方法が、今では CPU の命令で普通に用意されているのです。



冒頭の話題に戻りましょう。

コンピューターのメモリアドレスはいつから使われ始めたか。


この質問の裏には「今のように」という観点があるでしょう。

その元祖は、EDSAC だと思います。



先に書いた通り、EDSAC とほぼ同時期のコンピューターでは、メモリアドレスを計算対象とは「しない」のが普通でした。

その中で異質だった EDSAC のやり方が現代に残っているのは、このやり方が非常に強力だと皆が認めたからでしょう。




2018.7.17 追記

ツイッターで、こちらの掲示板で同じ質問が出ていた、と教えていただきました。


話の冒頭で「先日」と書きましたが、6月下旬の話だったと思います。

その掲示板の日付は6月23日。


僕の該当ページも参照されていますし、1) ツイッターで話題にしていた人たちが質問した 2) この質問を読んだ人がツイッターで話題にしていた のどちらかではないかと思います。




掲示板でも、「ノイマン型あたりだろう」と正しい認識なのですが、「チューリングマシンから」と言っている人があまりにも的外れなので、ちょっと突っ込み入れたくなった次第。


チューリングマシンは、紙テープが最新のメディアだった時代の発想なので、基本的には「無限に長い紙テープに、検索キーとデータを書き込んでおく」という発想で考えられています。

いわば、キーバリューストア。アドレスはないです。


そもそも、今ではコンピューターの元祖のように言われていますが、もともとは「ゲーデルの不完全性定理」という、数学上の大問題を証明するための道具にすぎません。


ここら辺、詳しくは過去に書いたことがあるので、興味がある方はそちらをお読みください




▲目次へ ⇒この記事のURL

関連ページ

階差機関&解析機関

別年同日の日記

02年 納得?

15年 実装の苦労

16年 Chromebook購入

16年 Chromebook で子供ができること

17年 ジョージ・イーストマン 誕生日(1854)


申し訳ありませんが、現在意見投稿をできない状態にしています

続・Unity  2018-07-04 18:26:09  コンピュータ

▲目次へ ⇒この記事のURL

少し前に「Unityの勉強始めた」って話を書いた。


仕事とは無関係に、全くの趣味として。

でも、趣味なので週に2時間程度しか時間を割けず、遅々として進んでいなかった。




今日、時々仕事でプログラム保守をしている会社の人と、打ち合わせ会議があった。


保守しているプログラム、見ず知らずの前任者が作ったものから、求めに応じて僕が随分と拡張している。

WEB 上で動作する Javascript のシステムなのだけど、前任者は「その時の仕様」でうまく動くように、非常に美しいプログラムを組み上げていた。


…美しい、というのは良いことばかりではない。

当時の仕様での動作としては問題ないのだけど、後から手を加えようとした時に改造しにくかったのだ。


ネットワークからデータを受けて表示するプログラムだったのだけど、無駄が排除されていて、受け取ったデータを集計し、表示した後はデータを残していなかった。


これが、後から「操作によってデータの絞り込み表示とかできると良い」という話になった時に、データが残っていないのだ。

仕方なく、根幹部分での「データ集計」は残したまま、送られてきたデータを溜めておく別部分を作り、絞り込みの際には別途集計を行って、それまで表示していたデータを「リセット」して、集計したデータを今送られてきたように流し込んで…


という、複雑怪奇なプログラムになっていた。


#根本部分から作り直せばいいのだけど、それができない理由があった。


このプログラム、どこかで根本的に手を入れないと、今後の拡張難しくなっていきますねー、なんて話を以前にしていた。




実は、僕は「WEB 表示部分」を作っていたのだけど、システム全体としては、別の人が作った Android アプリと iOS アプリもあった。

さらに、別用途で使われる Windows アプリもあった。


目的が違うものなので画面なども違うのだけど、表示される内容は同じ…にしたいのだけど、少しづつ違って同じになっていない。



で、今回、「すべて Unity で作り直せないか」という相談。


各種表示プログラムがあるわけだけど、今一番使われているのは僕が作っていた WEB 画面なのだそうで、これをベースにして Unity で作り直したいらしい。


Unity なら、iOS / Android / Windows / MacOS / WEB など、各種環境向けにコンパイルできる。

それぞれに必要な UI などは微妙に異なるが、共通化できる部分は出来るだけ共通化していきたい、という意向らしい。



で、「Unity 使えますか?」と聞かれたわけだ。


ごめんなさい。使えません。

でも、ちょうどいま勉強中で、勉強のためにゲーム一本作ってみている最中でした。




そんなわけで、趣味でやっていただけだったのだけど、ちょっと勉強を急がなくてはならない状態。

今日は会議後、5時間ほど作業していた。


まだ「上から3つ並んだ宝石が落ちてくるだけ」だったプログラムが、「フィールドの配列を持ち、落ちてきた宝石が積み上がり、それらの宝石に落ちてくる宝石がぶつかると通り抜けられないような判定」までは出来た。


これを作ることが目的ではないのだけど、ゲーム一本仕上げるのって、ある程度システムを理解していないとできないからね。

実践的な勉強、というつもり。


実際に作り直すとしても、おそらくは秋から作業開始になるようだ。

その時に備えて「API マニュアルと首っ引き」でないとプログラムできない今の状態から脱出したいところ。



▲目次へ ⇒この記事のURL

別年同日の日記

04年 コンサート

13年 Mouse In Maze


申し訳ありませんが、現在意見投稿をできない状態にしています

Unity  2018-06-25 17:50:23  コンピュータ

▲目次へ ⇒この記事のURL

最近 Unity を触ってみている。


「使ってみた」的な記事が流行したのはもう何年も前の話で、そろそろ Unity を使うのは「ゲームプログラマなら当たり前」になりつつある。


でも、僕は仕事柄、興味は持っていても Unity に触る機会が無かった。

ゲームプログラマじゃなくて、WEB プログラマだったから。




セガ時代に一緒にゲームを作った友人と会うと、「Unity やらないの?」的なことをたびたび言われた。

そいつも今はゲーム以外の仕事をしているのだけど、時々無性にゲームが作りたくなるので、なんか一緒に作ろうよ、って。


僕もゲームを作りたいと思うことはあるのだけど、なかなか暇がないのだな。

それで Unity に興味はあっても、手を出せずにいた。


でも、先日書いたように、仕事にしていた柱の一つを辞めることにしたので、少し時間に余裕ができた。

元々時間比率は少なくなっていたので、それほど暇になるわけでもないのだけど、ちょっと気になっていた Unity をインストールし、触り始めてみたというところだ。




ファーストインプレッションとしては、「売り物品質のゲームを作れる Scratch」というものだ。


Scratch は「あんなの本物のプログラム言語じゃない」と強烈な拒否層がいる環境なのだけど、Unity を使ってみた第一印象は Scratch と凄く似ている、というものだった。


これは、Unity を低く見ているのではないよ。

僕は Scratch を非常に高く評価している。

それが、結構多くのプログラマに支持されている Unity と類似だということに感心したのだ。


Unity は絶賛している人も多いのに。

Scratch は拒否感を持つ人も多いのに。


でも、両方使ってみると、非常によく似ていることがわかる。

どちらかといえば、Scratch で批判されている部分…データ調整だけでそれらしい形が作れてしまうので、「あんなのプログラムじゃない」と言われる部分を、さらに推し進めたのが Unity 、という言う印象だ。



とはいえ、どちらかが真似をしたというようなものではなく、自然な流れだと思う。

あえて言うなら、NeXT の Interface Builder とか、Win3.1 のころの VisualBasic が源流にあるだろう。


VB などは、GUI 時代の「アプリケーション」を作りやすいようにした環境だったのだけど、それをゲームに特化し、用途を限定することで扱いやすくしたのが Scratch と Unity 、という感じ。


どちらも、時間管理の概念をシステムで持っていて、個々の要素について、独立して「時間による変化」をプログラムしていけば、全体を構成できるようになっている。



もちろん、ゲームを「作りやすいように」特化したというだけで、ゲーム専用ではない。

画像表示を伴うインタラクティブなものなら守備範囲。

これって、結構応用範囲が広い。




とはいえ、まだ本当に「触ってみている」程度の段階。


せっかくなので、3Dでいくつか試作して、動作と「プログラミング作法」に慣れてみた。


最初はピンボール的なものを作ろうとして、3Dのモデラが無いと曲線などが作れないことに気付いて辞め、ビリヤードに変更した。


ビリヤードも、ちゃんとしたものを作るのは難しいので、適当に玉ががんがんはじかれているのを見て「気持ちいい」って感じただけ。


普通の言語で、物理エンジンを利用した3Dプログラムをしようと思うと、たとえライブラリを使っていてもそれなりに面倒くさい。

Unity なら画面を見ながらパラメーター設定するだけで、大体の枠組みが出来上がってしまう。

後は、どうしても必要なプログラムをちょっと作るだけ。


で、適当にゲームにもならないものを作り散らかした後で、やっぱり僕は2Dゲームのほうが好きなので、コラムスなど作り始めてみている。


本当はこれが完成してから「Unity いじってみた」って記事を書こうと思っていたのだけど、本格的に作り始めたら、やっぱりすぐには完成しない。


Scratch よりも若干生産性が落ちる感じだ。

もっとも、Scratch は不得意な処理を書く際にはとことん面倒くさいが、Unity 環境のほうが不得意部分が少ない。

生産性が落ちるのは、単に「あれもこれもできてしまうので、あきらめどころがわからなくて頑張ってしまう」結果による。



なお、コラムスが完成するかどうかは不明。途中で飽きるかもしれない。

まぁ、僕にとってはコラムス作るのは Hello World みたいなもんなので。



▲目次へ ⇒この記事のURL

関連ページ

続・Unity【日記 18/07/04】

別年同日の日記

02年 細胞が覚える味

04年 またですか

08年 やっと見つけた

09年 ペットロス

12年 土用に鰻を食べる理由


申し訳ありませんが、現在意見投稿をできない状態にしています

ゲームの作り方  2018-06-12 15:39:31  コンピュータ 家族

▲目次へ ⇒この記事のURL

最近は次女(小3)が熱心に Scratch をやっている。


長男(中2)も相変わらずやっているのだけど、学校に塾にと忙しくなかなか時間が取れないし、わずかな時間でスプラ2も遊びたい。

でも、時々急に「プログラム作りたい!」ってなって、短時間でそれなりに面白いものを作り、満足している。


長女(小5)は、長男も次女も Scratch をやっているのでやりたいと思っているようだが、二人にパソコンを取られてしまう形であまりやらない。

というか、どちらかというと時間があるならスプラ2か、DS の「どうぶつの森」をやってしまう。

パソコンを開くときもあるが、他の人がスプラ2を遊んでいて、ぶつ森でもすでにやることがない、というような場合だけだ。




いきなり話がわき道にそれているが、次女の話なのだ。

まだ論理性が怪しいながらも、プログラムの技術は覚えつつあり、どういうときにはどういう命令の組み合わせ、というのはすぐに出てくるようになっている。


そして、次のステップでつまづいた。

プログラムは作れる。じゃぁ、いったい何を作ればいいのだろう?

ある程度プログラムを覚えた初級者が、必ずぶつかる壁だ。



先日、新聞に Scratch の記事が出ていた。

そこには、取材したワークショップで、子供が簡単なゲームを作ったということと、そのゲーム画面、プログラムの一部が出ていた。


「これ作ってみる」と言って次女は作る。

プログラムが載っていない部分に関しては、画面を見ながら想像で。


ネズミを操作して、ネコから逃げながらチーズを目指す、というゲームが完成した。

ネコの動きルーチンを作れるほどの技術はないので、二人対戦だ。ちゃんと動くようになって喜んでいる。


でも、ネコを動かす人が本気を出すと、絶対にネズミが負けてしまう。

そこでネズミの速度を上げたが、今度は絶対にネコが追い付けない。


一応勝ち負けがあってゲームのプログラムにはなっているのだけど、「面白くない」という致命的な問題があるのだ。




「どうすればいい?」と聞いてくる次女。

ゲームを面白くする方法だったら、いくらでも思いつく。

しかし、そのアイディアを僕が出すわけにはいかない。


僕がアイディアを出して、それをプログラムするのであれば「技術は」上がるだろう。

でも、プログラム学習っていうのは技術訓練ではないのだ。



ここで考えないといけないのは「ゲームを面白くする方法」なんかじゃない。

そんな漠然としたものを考えていても、何も思いつかない。


そこで「何がつまらないのだと思う?」と聞いてみる。

自分の作ったものを「つまらない」と認めるのは勇気がいることだ。


最初のうちは、次女は「ちゃんとゲームになっているから、つまらないところはない」とか言い訳していた。

でも、ついには「絶対ネズミが勝っちゃう」と認めた。


何でそうなるのだろう? と聞くと、チーズに向かって一直線に進むと、ネコが追い付けない、との答え。

じゃぁ、その部分をどうにかしてみれば? と言ってみる。


しばらく考えて、「チーズは最初ランダムな位置に置かれるが、見えない。近づくと見えるようになる」というプログラムを作ってきた。

ネズミはチーズを探すためにうろうろする必要があり、探している間にネコが勝つチャンスもあるかもしれない、という考え。

なるほど、悪くない改良だ。


…でも、面白くなかった。

画面の広さは有限で、近づきさえすればチーズは表示されるのだから、ネコから逃げつつも画面をじぐざぐに進むと効率よく発見できてしまう。



今度も、何が面白くないのか考え、「自由に動けるのがよくない」という結論にたどり着く。


壁を設置して、ぶつかったらスタート地点に戻される、というプログラムを追加した。

壁はある程度ランダム位置に置かれるが、ネコもネズミも影響を受ける。



この「ぶつかったら」の判定は、ちょっと納得のいかないものだった。

Scratch で単純にあたり判定を行うと、絵の透明ではない部分がわずかでも重なると「ぶつかった」判定になり、厳しすぎるのだ。


でも、ゲームとしてはどちらが勝つか予測のつかないものになった。

これ以上掘り下げるのは本人の技術力を超えそうなので、改良点が見つからなかったら完成でいいんじゃない? ってことにする。




ひとつゲームが完成したので、今度は「風船が出てきて、クリックして割るゲーム」を作り始めた。


実は、先のゲームを作る際に参考した画面に、風船が出ていたのね。

元々なんで風船を出していたのかは知らないけど、次女は「ゴールすると風船が下から上にたくさん飛んでいく」という演出として取り入れていた。


今度は、この風船をクリックするゲームにしたい、というわけだ。



まずは、ランダムな位置に、ランダムな大きさの風船が出るようにした。


最初は1秒ごとに追加されたけど、早すぎて画面が埋まってしまう、と5秒ごとにした。

でも、それでは遅すぎるからと、「最初は5秒で、以降 0.5秒づつ早く」表示されるようにした。


お約束の、最終的に 0秒ですごい勢いで表示されてしまう、というのを経験して、最高速度を1秒に制限。


「なんかゲームっぽくなった」とご満悦なのだけど、何か物足りないらしい。

クリックするごとに1点追加で点数表示つける、とかやり始めたのだけど、風呂入る時間になったのでひとまず終了。



長女、次女、妻がお風呂入りながら話をしている。僕はその間食器洗ってたのだけど、少し話声が聞こえる。

どうやったら面白いゲームになるか、という話。詳しくは後でお父さんに聞いてごらん、とか言っている。




で、風呂上がりに妻から質問。

ゲームを面白くする4要素、物真似と競争とめまいと…後何だっけ?


後の一つは「運」だね。

面白くする、というより、すべての遊びはその4要素に分解できる、という話。

面白いゲームを分解して考えるのは勉強になるけど、4要素を知っているから面白いゲームが作れるわけではない。


子供の知っているゲームで解説する。


ぶつ森は生活を楽しむごっこ遊びで、物真似。

スプラ2は勝ちを目指すゲームで、競争。

テトリスやぷよぷよは、ランダムなブロックをどう組み合わせていくか考える、運。

メイド・イン・ワリオは、次々と目まぐるしく変わるゲームのルールを楽しむ、めまい。


もちろん、ゲームのすべてが1つの要素で作られているわけではなくて、いろんな要素が組み合わさっている。

そう解説したら、すぐに長女から「ぶつ森では、住民にすぐに『魚釣りで勝負だ』とか言われる」と具体例が出た。

そうだね、それは競争が入ることでゲームらしくしている。


ゲームらしく、というのが大切で、この4要素はあくまでも「あそびの」要素に過ぎない。

ゲームは勝敗がつくことが必須条件なので、競争が必ず入る。


トランプの一人遊びの場合、運との勝負で「成功・失敗」になるけど、これだって勝敗のある競争だ。

競争がないものをゲームとは呼ばない。



ぶつ森は突発的に競争が起きることがあるけど、全体としてはゲームの要素を満たしていない、と知り、軽い衝撃を受ける長女。




僕は、ゲームを考える時に「目的」と「目的を邪魔するもの」で考える。

目的があるけど、簡単には達成できないとなれば、これだけでゲームが成立する


先ほどまで次女が作っていた、風船をクリックして割るゲーム。

「風船を割る」という目的はあるが、それを邪魔するものがない。


どうしたらいいだろう? というと、次女は風船が上に上がっていくようにしたいらしい。

最初に書いたけど、もともとそういうゲームを考えていたからね。


そして、単に風船を割った数ではなく、点数をつけたいのだそうだ。

クリックしづらい、小さくて動きの速い風船は高得点。


考えていたのはここまでだったみたいなのだけど、邪魔が必要と言われて「時間切れまでに何点取れるか」というアイディアを出した。


なるほど、ここでは「高得点」が目的となり、「時間」が邪魔するものとなる。



長女は、触ったらダメなものを出したらどうかという。

風船をクリックしていくのだけど、時々マウスカーソルが触れただけでゲームオーバーになるものを出す。


なるほど、その場合は「触ったらダメなもの」が邪魔するものになる。




最後にまとめ。


ゲームを作る時に決まった方法はない。

思うがままに、目的と、その目的を邪魔するものを設置すればいい。

それでとりあえずゲームになる。


でも、面白いかどうかは別問題。


どうすれば面白くなるだろう…なんて考えてもうまくいかない。

「つまらないところ」を見つけて、なんでつまらないのかを考える。


なんでつまらないのか、がわかれば、それを解消する方法も思いつく。

これを繰り返せば、ゲームは面白くなっていく。


途中で「あそびの4要素」の話を挙げたけど、入れたからと言って面白くなんてならない。

でも、面白くするためのアイディアの引き出し、くらいには役立つ。

いろんなゲームを遊んでみて、面白いと思う部分の要素を分解してみよう。




作っているゲームがある程度形になったら、「完成」ってことにして、次のゲームを作り始めるもの大切。

同じものを作り続けていると飽きるし、だんだん改良の「成果」よりも、「手間」のほうが大きくなっていく。


それよりも、どんどん新しいものにチャレンジしてみる。

たくさん作りちらかしていれば、時々とても面白いアイディアが出てくる。


初心者の内は、思いつくままに、たくさん作ってみるのがいい。

そうすれば技術も上がるし、どうすれば面白いかもわかってくる。




▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

家族

別年同日の日記

02年 OSアップデート!!

05年 夏至祭

15年 生卵と生豚と

17年 連乗機能


申し訳ありませんが、現在意見投稿をできない状態にしています

スプラトゥーン2のフェス勝敗の確率  2018-06-11 11:57:46  コンピュータ

▲目次へ ⇒この記事のURL

時々スプラ2のフェスの話を書いているのだけど、今回は勝敗結果の話。

ありていに言えば「結果がおかしい。対戦が正しく行われていないのでは?」という内容。




話を始める前に、スプラ2のフェスを詳しく知らない人のためにざっくりと解説。


スプラトゥーン2は、オンラインの対戦バトルゲームです。

4対4で、水鉄砲を持って戦います。


この手のゲームは「殺し合い」で勝負するものが多いのですが、スプラトゥーンシリーズは「陣取り合戦」です。

水鉄砲(「インク」を撃つことになっています)で相手を撃ち倒してもいいけど、最終的な勝敗は、自分のチームの色に塗った面積で競われます。


だから、必ずしも相手を殺すことが勝敗に結びつかず、逃げ回っていてもチームに貢献できます。

対戦ゲームが苦手な、僕ような人でも楽しめるゲームです。



で、時々「フェス」と呼ばれるイベントが開催されます。

あらかじめ、2択の質問で2グループに分けられ、そのグループ同士で対戦するのです。


この対戦も、1人で参加した人をランダムに組み合わせる「ソロ」と、2人、または4人であらかじめチームを組んで参加する「チーム」の2つの参加枠があります。



さて、フェスの「勝敗結果」ですが、24時間続けられるフェスの後に、得票率、ソロ戦の勝敗率、チーム戦の勝敗率、の3つで評価され、2つ以上の率が高かった方が勝者となります。



過去の戦績をここで書こうかと思ったけど、このページの趣旨ではないし、まとめている人もいるので他のサイトに譲ります




今日の話は、この「結果」に、おかしいくらいの偏りがある、ということ。


ゲーム中では、ナビゲート役として、ゲーム内の「アイドルバンド」である2人組、ヒメとイイダが登場します。

フェスの時には、それぞれが各チームを代表する形になります。


それぞれの過去の勝敗結果は公表されています。

昨日の第13回までで、ヒメ5勝、イイダ8勝です。


ネットでは「イイダの勝率が高い」ことに着目し、常にイイダに投票する、と宣言する人も出ています。


勝率…高いと言えば高い。でも、この程度なら誤差範囲のようにも思います。



実は、ヒメかイイダかというより、冷静に成績を見ると「得票率の少数派の勝率がやたらと高い」です。


少数派9勝、多数派4勝です。



フェス前のアンケートでは、2択を選択するためのカーソルが、最初は「ヒメ」側についています。

どっちでもいいや、という人はヒメに入れやすいのかな、と思います。

だから、ヒメが多数派になり、負けてしまうことが多い。


「イイダ派が強い」ではなく、「少数派が強い」のですね。



でも、これでも先ほどと1勝しか変わっていない。

2倍の差となると誤差と言いづらくなりますが、サンプル数も少ないですし、まだ決定的ではないように思います。




では、多数派が勝った4回を詳細に見ましょう。


そのうち3回は、ソロ戦を多数派が勝ち、チーム戦は少数派が勝っています。

得票率での勝ちと合わせて「多数派の勝ち」となりました。


残る1回は、ソロ戦もチーム戦も、多数派が勝利した「完全勝利」です。


実は、「多数派がチーム戦で勝利した」のは、この1回のみです。



少数派が勝った9回の内容は、すべて「ソロ戦・チーム戦とも少数派の勝ち」です。

得票率で負けているのですから、これ以外では少数派の勝ちになりません。



というわけで、ソロ戦・チーム戦の通算では、少数派が21勝、多数派は5勝です。


少数派は、多数派の4倍も対戦で勝っている。

ここまで違うと「誤差」で済ませられるものではなく、有意な差があると考えてよいかと思います。




先に書いた通り、マッチングは基本的に「同じくらいの強さの人」を集めて行われます。

そのため、勝負は五分五分。片方が4倍も勝つ、なんてことが起こるはずはありません。


結果発表の勝率を見ると、戦績は僅差です。

具体的に…7回終了時点までで、一番の勝率が 51.34% です。

多くは、勝っている側でも 50.xx% という小数点以下の勝負で、一番の僅差の時は 50.04% での「勝ち」でした。



これが、8回目で少し崩れます。

7回までの戦績が偏ってしまっていて、イイダが連勝していること自体を、フェス前の予告のネタにしていました。

そして、ヒメが ソロ 51.50% 、チーム 51.51% で勝利するのです。


それまで決して出ることのなかった、半数(50%)を 1.5% 超える差での勝利。

それを、あらかじめ予告したタイミングで、ソロ・チームとも叩き出す。


おそらくは、ここは運営側で調整が入り、マッチングが少し変わったのだと思っています。



このあと、9回目ではゆり戻しが来たように僅差の勝負となり、10回目でたった1度の「多数派の完全勝利」。

この時は、チーム戦で 52.25% という高い勝率が出ています。



そのあとの11回目、大騒ぎとなった「マッチングバグのあるフェス」となりました。

本来、同じくらいの実力の人がマッチングされるはずなのに、大きく実力差のある人が組み合わせられます。


阿鼻叫喚、としか言いようのない一方的な試合が繰り返されました。

このような試合では、負けた側はもちろん、勝った側もあまり楽しめません。


後に任天堂公式に「バグがあった」ことの謝罪が出るのですが、この時も少数派が勝ち、 54.39% という高い勝率が出ています。

その後、現在のところフェスは2回行われていますが、元に戻す努力があったようで、あまり大きな勝率の差は出ていません。



#書いてから気づいたけど、ゲーム中は勝率を小数点以下まで出してなかった。

 先にリンクしたページを見ても、細かなことはわからない。

 連動したスマホアプリを使うと、小数点以下まで確認できる。




さて、この話は「任天堂が手ごころを加えている」とか、そういう話ではありません。

ゲームとしては同じ実力の人が真剣に戦うから面白いのですし、任天堂もマッチングシステムで、できるだけそうなるように努力しているように見えます。


にもかかわらず、差が出ている。

おそらく一番困っているのは任天堂の人で、修整のための努力を続けているのに「なぜか」治らない…というように見えます。



スプラ1は遊んでいないのでよく知らないのですが、勝率もソロとチームを特に分けておらず、別の集計方法で勝敗を決めていたようです。

つまり、今のフェスのシステムは、純粋に13回しか遊ばれていません。調整をするにしても、十分な機会がまだ得られていない、とも言えます。




マッチングで使用される「同じ強さ」の指標としては、過去何戦かでの、チームの勝敗、その時のチームの平均強さの格差(格上に勝つようならかなり強いと考えられる)、殺した数、殺された数、塗り面積…などなど、ありとあらゆる、計測できる要素が使用されているように見えます。


また、スプラトゥーンは非常に「ブキ」の種類が多いゲームで、ブキ同士の相性もあります。

同じ強さをマッチングしたとしても、相性が悪ければ勝負になりません。


ですから、マッチングの際には同じタイプのブキがチームに偏らないように、かつ、対戦チームも同じようなブキ構成になるように…というようなことをインタビューで答えていたように思います。


とはいえ、マッチングの際にあまり万全を期して、ユーザーを待たせるようではいけません。

来るかどうかわからないユーザーを待つ「完璧な解」よりも、今いるユーザーで妥協して早くゲームを始める方が良いのです。



フェスの際には、「所属するグループ」も考慮する必要があります。

ただでさえ、難しい条件をできるだけ満たすような組み合わせを見つけないといけないのに、2グループに分かれることで組み合わせに「使える」素材が、半分になってしまうのです。




こうした複雑な事情をすべて潜り抜け、なんとかフェスを成立させた先にあるのが、「なぜか少数派が強い」という現象なのかな…と思っています。

システムが複雑すぎるので、何が起きているのか、当の任天堂運営チームにもわからない。


それを何とか修正しようと実験するうちに、バランスを大きく崩してしまったり、「マッチングバグ」を引き起こしてしまったりしているのではないかと。



マッチングバグは、多数解決しないといけない制限の中の「同じくらいの強さの人を組み合わせる」という部分を緩くした結果ではないかな…

と思っています。

同じくらい、というのが難しくて、少し緩くすれば組み合わせやすくなる、と考えてやってみたら、ひどい結果になった。


で、今は「同じタイプのブキがチームに偏らないように」という部分を緩くしているように思います。

昨日のフェスは、ローラー多数対チャージャー多数、みたいなひどい組み合わせがあって、あまり楽しめなかった。


(ローラーはチャージャーのカモです。ただし、誰かがチャージャーを倒してくれれば、ローラーが一気に塗りつぶして勝利できます。

 ローラー多数対チャージャー多数では、一方的なゲームになってしまい楽しめません)




先に、少数派が勝ちやすいのは任天堂も理由がわからないのでは…と書きましたが、「わかっていて、故意にそうしている」可能性もあります。


というのも、投票が偏りすぎて多数派と少数派の人数が偏りすぎると、そもそも対戦のマッチングがしにくくなり、試合不成立が増えてしまうためです。


#一応、同じグループ同士の対戦が発生するので、ゲームは遊べる。

 でも、結果はそのグループの「一勝一敗」になるので、最終戦績には関係がない。


これが、「少数派に所属すれば勝てる」と噂されれば、アンケート時点で「どちらが少数派になるか」を予想して投票してくる人が現れ始めます。

読みが当たるかどうかはともかく、この結果少数派の人数が増えれば、少数派と多数派の人数差は少なくなり、試合が成立するようになります。



だとすれば、すでにこの効果は出ているように思います。

ここまで「読んで」遊ぶのは、勝ちにこだわるガチ勢だけなので、少数派側にガチ勢が大量に流れ込んで強さを底上げしている…という可能性もあるのです。



昨日のフェスでは、僕は少数派に属していました。

昼間遊んでいて、グループ内の対戦にはなりませんでした。

(少数派は、多数派とのマッチングが成立しやすい)


しかし、夜中に遊んでいた妻によれば、夜中は少数派にもかかわらずグループ内対戦が多かったそうなのです。

夜中でも寝ずに遊んでいる人はガチ勢が多いと仮定すると、夜中はむしろ少数派と多数派の人数比率が逆転している可能性があります。



また、バグありだった11回目、少数派は非常に高い勝率で勝ちました。


マッチングが単に「バグ」だったのなら、少数派だけが高い勝率に…とはならないはず。

でも、少数派に強い人が多く、その分多数派に弱い人が多くなったとしましょう。


ここでバグが出て、強さと関係なくランダムに組み合わされたとしたら…

当然、少数派が勝つ試合が増えるはずです。


これも、すでに少数派にガチ勢が流れ込んでいると考える根拠です。



マッチングは、本来「同じくらいの強さの人」で行われます。

でも、全く同じということは難しいですし、少数派に強い人が多いのであれば、常に少数派が「ちょっと強い」試合が多くなってしまうかもしれません。


システム的には、なんの手ごころも加えずに五分五分の勝負になるようにしていたとしても、実はガチ勢によって前提が崩れていたら…


任天堂が調整を繰り返しても、なかなか理想通りにならずに苦労しているように思います。




なんか話がいろんな方向に発散してきました。


最後に、全然違うのだけど経験話を。


過去に、仕事で携帯電話向けのチャットサイトを構築したことがあります。

気軽におしゃべりを楽しんでもらうために、さまざまな指標でユーザー同士の「マッチング」を行うのですが、このプログラムの混乱ぶりがすごかった。


一応 NG ワードとかも持っていて、あまりに酷い言葉は入力させないのですが、そうでなくても緩くペナルティポイントを加算していました。

で、あまりひどい話になっていそうな部屋は、新たなユーザーが入るのを禁止します。


ユーザーごとにも「話の傾向」フラグを持たせていて、同じような傾向のユーザー同士をマッチング。

一方で、フレンド登録とかブロックとかあって、フレンドはできるだけマッチングしたいし、ブロックした人がいる部屋には入れるわけにいかない。


いい会話がないなー、と思ったら、一人で新しい部屋に入ることもできるのだけど、そのユーザーさんを延々と待たせるわけにもいかない。

そういう部屋は、他の人にできるだけお薦めしていかなくては。


新しいユーザーが来るたびに、「今お薦めの部屋」をいくつかピックアップし、その中で選んでもらうのですが、その舞台裏は細かな調整の連続でした。

考慮すべきことが多すぎて、どんなに調整しても満足いく状態にならないのね。



で、スプラ2のマッチングって、これと同じことを…もっと高度なレベルでやっているのだな、と思うのですよ。



勝率がおかしいのは、おそらく「気がする」ではなく、事実です。なにかシステムがおかしい。


でも、多少うまく行っていないからと言って、怒る気にはなれない。

多分、現在のマッチング自体がギリギリのバランスで成り立っているから。



願わくば、勝っても負けても楽しめるフェスにしてほしい、と思います。

マッチングにバグがあるとか、ブキが偏りすぎるとかは、あまり楽しめなかったよ。




▲目次へ ⇒この記事のURL

別年同日の日記

02年 結婚指輪

06年 パンク

13年 虫歯予防週間


申し訳ありませんが、現在意見投稿をできない状態にしています

Nexus 7 復活  2018-04-24 10:42:21  コンピュータ

▲目次へ ⇒この記事のURL

急に Bluetooth キーボードを使いたい状況になったのだが、我が家には1つしかない。

過去に Nexus 7 で使っていたものだ。


出したら、裏面のエラストマー樹脂が経年劣化でべたべたしていた。


キーボードを使いたかったのは妻で、使用用途はちょっとした「試し」だったので、とりあえず目的は完遂。

それでキーボードは用済みになったのだけど、べたべただからとエタノールで拭き始めた。


#これでとりあえず「問題が軽減する」


で、ついでにずっと使っていなかった Nexus 7 も、べたべたしていたので拭き、充電した。


これ、なんで使わなくなったんだっけ?


…と言いながら起動して、Chrome をつかおうとする。

ただ Chrome を起動するだけで、5秒くらいかかる。そのあとも動作がもっさり。


こんなに遅いマシンだったっけ?




もちろん、購入当時便利に使っていたのでそんなに遅い覚えはない。


ずっと使っていなかったので、中に必要なデータなんてない。Factory reset してみる。

…多少動作が早くなった気がするが、まだ根本的に遅い。


そもそも、自分の Nexus 7 がいつのバージョンかも覚えていない。



Nexus は、Google 純正のアンドロイド端末のブランドだ。


7 は 7inch のタブレットであることを意味する。

普及を目指して作られた純正品で、儲けを考えていなかったので非常に安く、性能と比べてもコストパフォーマンスが良かったので話題になった。


その後、翌年には後継機が発売されたが、同じサイズなので名前も同じ Nexus 7。

Google は、元祖を Nexus 7 、後継機を Nexus 7 (2013) と呼ぶ。一般には、元祖を Nexus 7 (2012) と呼ぶこともある。


で、自分の持っているのは 2012 の方だった。




Nexus 端末はまた、純正品として「3年間のバージョンアップ保障」を行っていた。


2010 年ころは、多くの Android 端末は、バージョンアップの保証がなかった。

発売1年以内のメジャーアップデートに対応してくれれば良心的だが、場合によっては発売後すぐの「セキュリティバグ」にすら対応してもらえない。

セキュリティバグが放置なんて、安心して使えるものではない。


そこで、2011 年に Googleが中心となり、いくつかの Android 製造メーカーが共同で「18ヶ月保障」という枠組みを作り出した

発売から 18か月…1年半の間は、OSのバージョンアップに迅速に対応する。


しかし、Google 純正である Nexus は、この倍である36カ月…3年間のバージョンアップを保証した



その結果、2012 年発売の Nexus 7 は、2015 年リリースの Android 5.1 … Lolipop と呼ばれるバージョンに対応した。

Nexus 7 発売時には、Android 4.1 Jellybeen だった。


Android 端末の OS 世代は、お菓子の名前になっている開発コードネーム頭のアルファベットで示される。

3年間で、 J K L と3世代を超えたわけだ。(ちなみに、K は 4.4 Kitkat)


ちゃんと保証通りに OS を提供して素晴らしい…というわけではない。むしろ、マズい対応だった。

Nexus 7 は、普及を狙って安く作った端末だ。


メインメモリは 1GB だった。4.4 Kitkat なら十分に動作するが、5.1 Lolipop だと、OS を動かすだけで精いっぱい。

アプリを起動しようとすると、足りないメモリをやりくりし始めて「もっさりと」起動することになる。


#ちなみに、5.0 の時点ではメモリリークのバグがあった。

 メモリが足りないのはこのせいだ、と当時言われていて、バグ修正版となる 5.1 が出た時は歓迎された。

 が、そんなことは些細な問題だった。Nexus 7 (2012) に Lolipop は重過ぎるのだ。




…と、このマシンを使わなくなった理由を思い出した。

当時はそれでも、これはあまりにもひどいので Google が対策バージョンを出してくれるだろう…と期待して待っていたのだった。


もう、今更待つ理由はない。内容のリセットもしたことだし、ついでに OS をダウングレードしよう。


PC に接続し、4.4 系列の最終版、4.4.4 のファクトリーイメージ(工場出荷イメージ。ネットで公開されている)を書き込む。


PC に Android 開発環境を入れている人なら難しくない作業だけど、入れていない人は Java の導入から始めないといけない。

Android は一応 Java で開発することになっていて(当時)、開発環境も Java で作られている。

だから、Java を入れて開発環境を入れて、端末側も開発モードにして PC と接続し、開発用コマンドラインツールを使ってファクトリーイメージを書き込む、という作業が必要になる。



作業が終わったら軽快に動く。


妻に見せたら喜んで…というか、事実上とられた。

気になっていたけど見ていなかった動画類を消化するための小型端末が欲しかったそうだ。

まぁ、もともとこれは妻のマシンなのだけど。


実際、動画を見る程度なら問題なく動作する。


Chrome などもちゃんと実用速度で動くが、6年前のマシンなので「軽快な動作」とはいかない。

ただ動画を流しっぱなし、というような、インタラクティブ動作を伴わないものなら十分使えるようだ。



▲目次へ ⇒この記事のURL

別年同日の日記

02年 4/24

15年 PRINT 略記

16年 GAME ON展

16年 未来科学館リニューアル


申し訳ありませんが、現在意見投稿をできない状態にしています

ロードランナー レガシー  2018-04-12 14:30:59  コンピュータ

▲目次へ ⇒この記事のURL

ロードランナー レガシー

Switch のダウンロード販売ゲーム、ロードランナー レガシーを購入した。



最初に書いておくけど、僕は初期のロードランナーが好きです。

作者であるダグ・スミスが亡くなった際に、思いのたけを書いています


これから購入したゲームの感想というかレビューを書くのですが、あくまでも「初代好き」が書いたものだと考えてください。


ロードランナーは歴史が長いから、どのバージョンが好きかは人それぞれ。

僕が良いと思う部分も、人によっては気に食わないかもしれません。




では本題。


ロードランナー レガシーは先に steam 版(PC用のゲーム配信サービス)があったのだけど、その時から少し興味はありました。


でも、僕は基本的に PC は仕事の道具で、本格的にはゲームをしないことにしている。

…気晴らし程度のミニゲームはやるのだけど、それ以上やり始めると仕事に支障が出るから。


そして、今回の Switch 版。興味あり、と思ったら、無料体験版が公開されていた。

早速遊んでみる。


体験版では、各種モード最初の数面が遊べるようになっていた。


「アドベンチャーモード」と、「パズルモード」、「二人協力」ね。


遊んでみると悪くない。初期の、シンプルなロードランナーを今の技術で作り直した、というだけのもの。


一番興味を持っていた「クラシックモード」は、購入しないと遊ばなかった。

でも、遊べる分だけで品質については充分に安心できた。購入する。




ここで「初期」について説明すると、業務用の IREM 版が一番近いと思う。


元祖である Apple II 版には、制限時間などはなかった。

でも、業務用では延々と遊ばれては困るので、制限時間があり、残り時間は「ボーナス点」となった。


いや、むしろ制限時間は「ボーナス点」のためにあると言っても良いかもしれない。

ロードランナーはパズルゲームだが、パズルだと一回解くと終わりになってしまう。


IREM 版は、業務用らしく得点を競わせた。

速く解ければボーナスが入るし、より難しい課題…敵を殺さない、隠れキャラを探し出す、などでも得点が上がった。


本質である「パズルのようになっている面をクリアする」という点では、これらの得点を取る必要はない。

でも、業務用だから得点というわかりやすい目標を掲げることで、繰り返し遊んでもらえるようにしたんだ。



また、IREM 版は遊びやすさに最大限に気を使っている。


ロードランナーには「落とし穴」という、見た目は普通のブロックと同じなのに、実は何もない空間、というものがある。


IREM 版はいくつか続編が作られたが、一番最初のバージョンでは、落とし穴が存在しない。

パズルなのに「見た目でわからない」というのは、遊びやすくはないと考えたようだ。


しかし、この落とし穴もロードランナーの魅力の一つ。2作目からは取り入れられたが、その場合でも「一度落ちると見た目が変わる」ようになった。

落とし穴があることはわかったが…どこだっけ? ということがない。



また、ロードランナーでは、回収すべきターゲットである「金塊」を、敵が隠し持ってしまうこともある。

隠し持っている敵を罠にはめ、回収しないといけないのだが、Apple II 版では、どの敵が持っているかはわからない。


IREM 版では、金塊を持っている敵が見た目でわかるようになった。



「レガシー」は、この IREM 版をベースにし、さらに遊びやすくしている。


例えば、主人公が掘った穴はしばらくすると埋まる。

この「埋まるタイミング」が重要で、遊ぶうちにタイミングになれる必要があった。

これは、IREM 版でも変わらなかった。


でも、「レガシー」では、掘った後に色がつく。だんだん赤くなり、最後に埋まる。

埋まるタイミングが非常にわかりやすい。



でも、そうした細かな改良だけだ。Apple II 版と基本的には「なにも」変わらない。

ロードランナーの良さを何も失わず、最新の技術を、遊びやすさを追求するために使っている。


ルールがシンプルでいながら、ゲーム内容が十分に複雑、という、理想的なゲームのお手本のようだ。




IREM 版が、得点を競い合うようにした、と書いた。


「レガシー」でもその方向性は守られていて、ネット上でランキング集計されている。


ただ、購入している人がそれほどいないのかもしれない…

アドベンチャーモードの前半程度しかやっていないが、一度クリアしただけで極めていないような面でも、30位くらいに入ってしまったりするので。


まぁ、面によっては 150位くらい。それでも、全然最適化していないプレイでこれだ。

購入者は少ないと思う。



一応書いておくと、ハイスコアランキング「以前」の問題として、最近のゲームにありがちな、クリア時の評価がある。


クリアしただけの面には、星1個。

ノーミスクリアできた面には星2個。

ノーミスクリアで規定の点数を超えた場合には、星3個が与えられる。


「一度クリアしただけ」と先に書いたが、最初から星3個を目指したプレイをしているので、クリア時点でそれなりの点数にはなっている。



ロードランナーを好きで遊んだ世代には、いきなり星3個でもそれほど難しくない。

でも、興味を持って始めた子供には、クリアだけでも…つまりは、星1個でも難しいようだ。

一応「パズル」だからね。解き方の手順が思いつくかどうかは慣れによる。



ついでだから書こう。


2人用モードは、長女が遊んでみたいと言ったので一緒にやってみた。


このモード、二人ともロードランナーに習熟しているのが前提。

協力して面クリアを目指すのだけど、パズルを解く手順を二人ともわかっていないと、協力した動きなんてできないから。


ただ、協力して解くというのは面白いとは思った。

子供が慣れたらまたやろう。




その他、「新しい要素」を1つだけ書いておきたい。


「アドベンチャーモード」がメインモードなのだけど、面が進むと出てくる敵が変わる。

IREM 版も敵が変わったけど、基本的にはグラフィックが違うだけだった。


「レガシー」では、動きのアルゴリズムから違ったりする。

重力無視で、壁伝いに動いたりするからね。


これが、新しいのだけど原作の良さを無くさない変更で、なかなか面白い。




さて、それでは新要素の紹介は終わりにして、あえて「Apple II 版を再現した」という、クラシックモードを紹介。

画面が地味だから、あまり紹介している記事を見かけない。


この日記冒頭につけた画面写真がそれだ。

Apple II 版は 150面あったのだけど、全部収録している、らしい。


らしいというのは、Apple II 版は僕は遊んでいないし、その移植であるパソコン版も、友達の家で少しやっただけだから。

でも、だからこそ、あこがれだった「最初の 150面」を遊べるのがうれしい。



「レガシー」では、エディットで面データだけでなく、キャラクターデータも作れる。

全部ポリゴンなので、四角いブロックを使う形で3Dで作らないといけない。


そして、クラシックモードでは、面データだけでなくキャラクターも、Apple II 版に似せたものが使われている。

でも、やっぱり3Dだし、先に書いた「遊びやすさ」などはこのモードでも活きたまま。不思議な感じ。



AppleII 版では、敵を倒すと画面最上部のランダム位置から出現することを使い、主人公が行けないところにある金塊を取ってきてもらう、という面があった。

こうした面では、当然「敵を倒さないボーナス」は望めないし、ランダムが絡むのでタイムボーナスも狙いにくい。


そうした意味では、Apple II の面データの忠実な移植ではあっても、同じ気分で遊べるわけではないかもしれない。

それでも、今改めて初期の 150面を遊べるということがうれしいと思う。




Apple II 版ロードランナーの大ヒット後に販売された、ユーザーが作った特に難しい面を集めた「チャンピオンシップロードランナー」の面データも、別売りでよいから追加配信してくれないだろうか?


もっとも、面エディタはあるのだから、自分で作ればよいのかもしれない。



チャンピオンシップでは、敵の動作アルゴリズムがわずかに違うだけで解けないような面もある。

当時、他機種への移植で問題が続出したと聞いている。


もしかしたら、「レガシー」でも、完全には敵のアルゴリズムが同じわけではなく、チャンピオンシップのデータは移植困難、ということかもしれない。


なにせ、あの敵のアルゴリズムは、もともとバグだったものだからね。

「予測がつきにくい動きのほうが面白い」という理由で残されただけで。


▲目次へ ⇒この記事のURL

別年同日の日記

03年 探し物

10年 最近のうちのこ

16年 タタコット

16年 電話番号のしくみ


申し訳ありませんが、現在意見投稿をできない状態にしています

サターンポリゴンのゆがみ  2018-01-23 17:57:30  コンピュータ 業界記

▲目次へ ⇒この記事のURL

4年ほど前に、サターンのハードウェアに関して…いや、ハードに限らず周辺の噂話まで含めて、長大な記事を書いた。

嬉しいことに、今でも時々反響がある。


で、先日 Twitter で、「たしかに、プレステは大きく歪むが、サターンは歪まなかった」と言っている方がいた。

その言葉を読んで、ハッとしたのだ。


しまった。

サターンの大バグで、わざわざ「歪めて表示しないといけない」場合があったことを書いていない。




セガラリーチャンピオンシップは、サターンのプログラムがこなれてきたころに発表されたビッグタイトルだ。

非常によくできている。僕も当時、レーシングコントローラーまで購入してやり込んだ。


このゲームを遊んだことがある人なら、ゆっくりと走った際に、コースを表現するポリゴンの、一番「手前」…

説明しずらいが、画面の一番こちら側に来る部分が、妙に歪んで表示されていたことを覚えているかもしれない。


あの歪み、ソフトウェアでわざわざ歪めて表示している。

そうしないと、ハードウェアの別のバグにぶつかり、表示がおかしくなってしまうためだ。


サターンのテクスチャは方式上歪みが少なく、プレステのようには歪まない。

しかし別の部分のバグを回避するために、状況によってわざわざ歪ませるように表示しないといけない場合があった。




サターンのスプライト表示 LSI …VDP1 には、クリッピングウィンドウ機能というものがあった。

画面内の「上下左右」の辺の座標を指定することによって得られる四角形の中でだけスプライトを描画し、その外側には描かない、という機能だ。


通常は、この四角は画面の最大サイズになっている。

その外側にはメモリが無いから書き込んではいけないためだ。


でも、例えば画面を分割して対戦できるようなゲームでは、ウィンドウサイズを変えることで、それぞれのプレイヤーの画面の中だけを描くことができる。

車のバックミラーの中だけ別描画、というようなこともできるし、ゲーム内の背景にテレビ画面があってその中に別のものが表示されているような効果も出せる。


工夫次第でいろいろ使える便利な機能だ。




スプライトは「四角」で定義されていて、4つの頂点を自由な位置に指定することで変形表示できた。

これがいわゆる「ポリゴン」だ。


変形表示の際には、元の画像定義の「横1ライン」ごとに画像が転送され、このラインを重ねていくことで面が作られる。

南京玉すだれみたいなものを想像してもらえるといいだろう。


実際には、この「ライン」が送られる直前に、クリッピングウィンドウの処理が入る。

ラインの始点と終点がウィンドウの外にあるかどうかがチェックされ、外にある場合は、ウィンドウの辺とラインの交点を算出する。

交点はつまり「ウィンドウ内に表示される端の点」なので、ここからウィンドウ内だけを描けばよいわけだ。


始点側がウィンドウ外なら、交点を求めるとともに、テクスチャの読み出し開始アドレスをずらす。

終点側がウィンドウ外なら、交点を求めるが、テクスチャ読み出しアドレスは変えない。

(いずれも、テクスチャの読み出しスピードは、クリッピングしない際のラインの長さに依存する)


始点も終点もウィンドウ外なら?

その線は、全部がウィンドウ外だろう。描画の必要はなく、捨てられる。



…ここにバグがある。


おそらく、この処理は System32 の家庭用を作っていた際の名残で、スプライトは四角いまま拡大縮小する程度の前提だったのだろう。

変形しない、四角いスプライトを前提にすれば、始点も終点も描画外なら全体が描画外、は正しい。


しかし、サターンの変形スプライトでは、ラインの一部だけがウィンドウ内に入る、ということがあり得る。

ウィンドウの「角」の部分にかかるように、始点と終点が違う辺(例えば下辺と左辺)をはみ出して描画される場合だ。


この場合、先に書いたクリッピングアルゴリズムだと、ラインの描画全体が捨てられてしまうため、本来必要な描画が行われなくなる。

結果として、サターンで作ったポリゴンゲームの、画面の角の部分は描画が行われないことが多くなり、「穴が開く」状態となる。



レースゲームでは、コースを構成するポリゴンが画面の下左右角にはみ出る、という状況は当たり前に発生する。

そこで、セガラリーチャンピオンシップでは、2次元変換させた後のポリゴンの座標をさらに加工する。


具体的には、「左右」からはみ出さないようにプログラム内でクリッピングしてしまえばよい。


厳密に言えば、クリッピングによって表示が6角形になる場合があるのだけど、セガラリーではおそらくそのような状況にはならない。

クリッピングで5角形になる場合に限定すれば、外側の2頂点を適切に移動してやれば、見た目の上でポリゴンの「辺」の形状を変えないようにできる。


ただし、内部のテクスチャは大きく歪む。

これをどう誤魔化すかは、作る側のテクニックだ。


セガラリーの場合、路面のテクスチャは工夫されていて、多少歪んでもわからなかった。

また、極端に斜め線を作らなければ問題の状況は起きないので、ガードレールなどはポリゴン面が縦に分割されるようになっていたのだと思う。


そもそも、歪んでも十分に高速で動いていれば、一瞬で通り過ぎるためにあまり気にならない。


しかし、崖の斜面などの形状が歪んだ部分にぶつかり、ゆっくり動いたりすると、歪むのがわかった。

このゲーム、そんな下手なプレイしているようじゃダメなので、慣れるにしたがってそういうことは起きなくなるのだけど。




他のゲームでも、よく見ると画面端は歪んでいる場合が結構あった。

描画が破綻するというのは最悪の状況なので、回避のために工夫したのだろう。


初期の SGL には、自動的にゆがめることで破綻しないようにする機能、というのはなかったように思う。

でも、もしかしたらバージョンアップの過程でつけられていたかもしれない。

申し訳ないが、この辺りはちゃんと覚えていない。



この記事、書き上げてからネットで SS のセガラリーの動画探してみたのだけど、思ったような歪みが見つけられない。

記憶で書いているので多少違っている部分もあるかもしれない、と断っておく。


本当は、自分で実機でセガラリー動かして検証すればいいのだけど、そこまでやっていない。



この話はサターン記事の中に追記するのが適切なのだけど、個別論に入った長い話を追記すると話の腰を折ってしまう。

なので、日記に書いたうえで、記事内からリンクしておくことにする。




▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

業界記

関連ページ

細かな話題

別年同日の日記

12年 ゲームボーイの CPU

15年 アプリケーションサーバとしてのQNAP

15年 宮永好道 命日(1993)

16年 iOSでtextのコピー・ペーストができないバグの回避


申し訳ありませんが、現在意見投稿をできない状態にしています

【獣】 歪まないけど汚いっていう印象でしたね~デイトナなんかでは一番手前側にくる道路が、下に落ちていくような感じになっていましたが、あれも表示がおかしくならなくするための対策だったのでしょうか (2018-01-24 13:01:05)

原初のプログラム  2018-01-10 12:02:44  コンピュータ 家族

▲目次へ ⇒この記事のURL

長男が熱心だった Scratch プログラムだけど、この冬休み期間に、長女・次女も再チャレンジし始めた。


以前は難しくてやめてしまったのだけど、今の年齢なら楽しめるようだ。



で、長女(小4)から質問が出た。


Scratch は Flash という言語で作られていて、その Flash はC言語という別のプログラム言語で作られている。

…ここまでは、プログラム言語の多様性を知ってほしくて以前に教えている。


#厳密に言えば、Scratch ver.2 が Flash の ActionScript 言語で作られていて、ActionScript は C言語の拡張である、C++ 言語で作られている。


ここからが長女の質問。


「では、このパソコンで動く一番最初のプログラムはどうやって作られたの?」



あぁ、なるほど。そこに疑問を持ったか。

同じようなことに興味を持っている人もいるかもしれないので、長女に答えたことを記して置こうと思う。




まず、目の前の疑問の答えは、クロスコンパイルだ。

すでに動いているコンピューターの上で、別のコンピューターのプログラムを開発する。


僕はテレビゲームの開発をやっていたけど、テレビゲーム機の上では、普通は「プログラム」を作れない。


長女も Nintendo Switch で遊んでいるけど、そこでプログラムは作れない。

プログラムを楽しみたいときは、パソコンで Scratch をやっている。


Switch でゲームを作っている人も、Switch を使って作っているわけではない。

パソコンの上でプログラムを作って、それを特殊機材で Switch に送って動かしているんだ。



新しいパソコンが作られる時も、同じように別のパソコンでプログラムを作ることになる。


今広く使われているパソコン…IBM PC 互換機、と呼ばれるものが出てきたときも、基本プログラムはすでにあったコンピューターで作られた。


#それ以前の 8bit マシン…CP/M マシン上で開発されていたようだ。




長女はこの答えには納得できないようだった。


「このパソコンの」と言ったのは言葉のアヤで、真意は「最初のプログラム」にあったのだ。


そのプログラムはそれ以前のプログラムで作られたという。

じゃぁ、「それ以前」はどうやって作ったのか。もっともな疑問だ。


そのため、ここで話を切り替える。




コンピューターの中では、すべてを数値として扱っている。

計算をするときには、例えば「1番は足し算、2番は引き算」というように、命令も数値になる。


1 2 3


という3つの数値があったとしよう。

ここで、1 は足し算の命令で、2 3 が足すべきデータになる。結果は 5 だ。



一番最初のコンピューターでは、人間が直接この「数値」の列を作り出した。


もっとも、プログラムを作るときに 1 2 3 と直接書いていると、頭がこんがらがってしまう。

1 は足し算(英語で ADD)なのだから


ADD 2 3


のように紙に書いておき、プログラムが全部出来上がったら、命令を手作業で数値に直していけばよい。




そして、この数値を入力するには、ON / OFF できるスイッチを使う。

コンピューターの中では、数値は全部、電気信号の ON / OFF に置き換えて覚えられている。


ON なら 1 、OFF なら 0 として、寄せ集めるともっと大きな数値も表せるようになる。


#いわゆる2進数だけど、この話では詳しく知る必要はない。

 ちなみに、長女は以前教えて2進数を知っているので、この部分に疑問は持たなかった。


スイッチをぱちぱちやって数値を作り、「書き込み」スイッチを押すと、メモリに書き込まれる。

どんどん連続してメモリに書き込まれていく回路を作ると、これでプログラムを準備できる。


そして、CPU に対して「実行」を指示すれば、「最初のプログラム」が無事動き出す。

最初はこんな風にしてプログラムが作られた。




じゃぁ、最初にどんなプログラムを作ったか。


スイッチをぱちぱちやるのは、プログラム方法としてはかなり面倒くさい。

だから、最初に作るのは「タイプライターのキーを押すと、それが文字だと識別されるプログラム」だ。


これがあれば、もう「ぱちぱち」とはおさらば。タイプライターで効率よくプログラムが作れる。


次に作るのは、ADD なら 1 、SUB なら 2 …という、命令から数値への変換を、自動的にやってくれるプログラムだ。

先ほど「人間が手作業で命令を数値に直す」としていたけど、自動的にやってくれるプログラムがあれば効率が上がる。


#一般には、数値化する作業を「アセンブル」(組み立て、の意味)と呼び、これを自動的に行うプログラムは「アセンブラ」と呼ばれる。




もし、この時点で新しいコンピューターが設計されたとしよう。


新しコンピューターでは、命令の数値なども変わるのが普通だ。

今まで使っていたコンピューターでは、ADD は 1 だったけど、新しいコンピューターでは 10 かもしれない。


そうしたら、アセンブラのプログラムを修正する。

ADD は 1、だったところを ADD は 10 、にするだけでいい。


これで、新しいコンピューター用のプログラムを作り出すことができる。

最初に書いた「クロスコンパイル」というのは、ただこれだけの話だ。




ここで話はひと段落。

スマホで情報を検索して、Altair 8800 の画像を長女に見せてみた。


Altair 8800 は、最初のコンピューターではないが、最初のパソコンとされる。


前面パネルには、ON / OFF のスイッチがたくさんついていて、結果出力のためのランプもある。

入力も、出力も、ON / OFF しかないんだ。



でも、タイプライター(厳密にはテレタイプ)を接続して使うのが普通だった。


電源を入れたら、RAM の中には何もない。

だから、まずはタイプライターからの入力を読み取るためのプログラムを、 ON / OFF スイッチで入れる必要があった。

このパソコンを使っている人は、それが毎日の作業なので、短いプログラムを暗記していた。


タイプライターの入力が読めるようになったら、タイプライターについている紙テープ読み取り機から、紙テープを読み込ませる。


テレタイプでは、入力内容を紙テープ化できた。そうすることで、同じ原稿を何度でも打ち出すことができる。

でも、ここでは紙テープに記録されているのは「文字」ではなく、プログラムそのものだ。


たとえば、テレタイプを入出力として、BASIC 言語を解釈するプログラム。

このプログラムが動き始めれば、タイプライターを使ってプログラムを作れるようになる。


時には、さらに「BASIC で作られたプログラム」を紙テープから読み込み、何らかの実作業に使ったかもしれない。



ここでは、タイプライターだから出力が紙なのだけど、キーボードで文字を入力して、人間にわかる文字で結果を返す、という、誰にでもわかりやすいプログラム環境が出来上がったことになる。




このときは、手っ取り早く Altair 8800 の画像を見せた。


でも、それ以前からコンピューターは存在する。

それらも、構造的にはほぼ同じだった。


うちのページでいえば、TX-0あたりを見ていただきたい。

Altair 8800 よりずっと古い機械だけど、トグルスイッチを使って2進数を入力するあたりも、ほぼ同じ構造だ。


もっとも、TX-0 は紙テープを読み込んでメモリにデータを配置する機能を、ハードウェアで持っていた。

そのため、毎回紙テープを読み込むプログラムを入れる必要はない。



さらに古く、電子計算機の元祖に近い EDSAC では、完成後の改造で「イニシャルオーダー」が備えつけられた。


抵抗とワイヤーで ON / OFF を表現することで、紙テープを読み込むプログラムを固定化したものだ。

必要に応じて取り外せるようになっていて、取り外すとその部分は普通のメモリとして扱われる。


ROM に準備され、コンピューターが起動するときに最初に読み込むプログラム…今でいえば、BIOS や UEFI に相当するものだった。




ともかく「手作業で」最初の小さなプログラムを作り上げ、そこからプログラム環境が整えられていく。

あとは、Scratch の話と一緒だ。



Scratch は Flash で作られ、Flash は C で作られていた。


Altair 8800 では、Scratch に相当するものが BASIC だった。

BASIC はアセンブラで作られ、そのアセンブラは、ON / OFF スイッチを駆使して入力されるものだった。



BASIC から C までの間は長女には説明しなかったけど、想像は付いたようだ。

より便利な環境を作るために、誰かが「その時使える」環境で、新しいプログラムを書いてきた。


その積み重ねの果てに、子供でも使える良く練り込まれた環境、Scratch が存在している。


Scratch も、そろそろ Javascript で書かれた Ver.3 に移行する予定だ。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

家族

別年同日の日記

05年 Switch!

13年 続々・Windows8

16年 国立科学博物館

16年 国立科学博物館(続き)

16年 上野公園


申し訳ありませんが、現在意見投稿をできない状態にしています

無言電話(SIP SPAM)  2017-12-20 18:39:52  コンピュータ 歯車

▲目次へ ⇒この記事のURL

先日 IP 電話を導入したら、すぐに無言電話がかかってきた。


無言なので電話を切ると、すぐにまた掛かってくる。

もしかして、機器の設定を間違えて音声がうまく通じていないのか、と思ったが、自分で確認したら大丈夫。


そもそも、新しい会社電話番号は税理士さんにしか伝えていない。

(この年末調整で、税務署に伝えてもらうためだ)


税理士さんが確認のために電話をくれたのかな、と思ったが、それにしてもしつこい。

10回もかけ続ける、なんて人間が相手ではありえないだろう。


とりあえず、IP電話の機器から電話機のケーブルを引き抜く。

どうせまだほとんど誰も電話番号を知らないのだ。電話がつながってなくても構わない。




忙しくてそのまま数日。

やっと設定を見直す。


ネットで情報を探すと、SIP SPAM とか、 SPIT (SPAM over Internet Telephony)とかいうらしい。

IP 電話に対して、だれかれ構わず電話をかける、SPAM。


もっとも「SPAM」というのは語弊のある部分で、実際には宣伝などの通話をしたいわけではない。

電話機のポートが開いていないかを確認していて、ポートが開いているなら攻撃を試みるのだ。


ネットで対策方法を調査し、機器設定で、一か所ボタンを Yes にするだけで、簡単に対処できるとわかった。

でも、その設定の「意味」を知っておかないと気持ち悪い。


そんなに簡単な対処なら、なぜわざわざ変更可能にしてあり、初期状態が No なのか。

何か副作用があるのではないか。




そんなわけで、VoIP 電話機がどうやって動作しているのか、改めて確認したので、まとめておこう。


ちなみに、同じような「無言電話」に困っている人のために、先に対処を書いておこう。


僕は Grandstream の HT701 を使っている。


設定の FXS PORT というタブに、Authenticate incoming INVITE という項目がある。

初期状態は No なので、 Yes にすればよい。これだけで SIP SPAM による無言電話が無くなる。


他の機器でも、INVITE 、Authenticate あたりをキーワードに設定を探すと見つかると思う。

(日本語では INVITE 認証、と訳されることが多いようだ)




設定の意味を理解するためには、VoIP の概要を知る必要がある。


VoIP は、単純に言えば、アナログ音声をデジタルサンプリングして、パケット化して相手と相互通信する技術だ。

これ自体はそれほど難しいことではない。


問題は「相手」ってなぁに? ってことだ。

インターネットを使うのだから相手は IP アドレスで指定しないといけないが、電話なので電話番号で指定したい。


そこで、VoIP 電話を提供する会社が SIP サーバーというものを用意する。

契約したユーザーには、ID とパスワードを発行する。

電話番号は、この ID と紐づいている。



通信機器は、まず SIP サーバーに接続し、パスワードで認証を行う。

これが成功すれば、ID に対して、接続してきた IP アドレスを記録できる。


先に書いたように ID と電話番号は紐づいているので、IPアドレスと電話番号も紐づけられることになる。



電話をかけたい人は、SIP サーバーに接続して、電話番号を伝える。

すると、SIP サーバーはその電話番号相手の IP アドレスに接続し、「INVITE」(呼び出し)と伝える。


VoIP 通信機器は、INVITE を受信すると、電話を鳴らす。

電話を取った場合、サーバーは発信者の IP アドレスを教え、以降はサーバーを仲介しない直接通信となる。




SIP SPAM は、SIP サーバーでない第三者が、ランダムな IP アドレスに対して INVITE メッセージを送ることで起きている。

INVITE が受け付けられれば、そこに VoIP 通信機器があることがわかる。


PC やサーバーの存在を確認しても、そうした機器は注意を払ってセキュリティを固めてあることが多い。

それに対し、VoIP 通信機器のようなものは、セキュリティに注意を払われにくい。


悪意のある人間としては、乗っ取りやすいありがたい機器だ。

これを知りたいから、SIP SPAM が行われる。



余談になるが、外部ネットワークから参照可能で、設置したらそのままほったらかしの機器は同様の問題を抱える。

Webカメラやルーター、NAS や HDDレコーダーなど。


対策は、常に最新のファームウェアを入れるように気をつけること。

また、脆弱性が見つかったらすぐにファームウェアを更新してくれる、信頼ある会社の製品を使うこと。


VoIP 機器の場合、SIP SPAM で「無言電話」にならない対策をしても、上記問題は解決しない。

やはりファームウェアの更新に気を付けること。




さて、当初の SIP はこのような「悪意」を想定しないで設計されてしまった (RFC 2543)。

しかし、このような攻撃方法が認識された時点で、追加の RFC で対策が立てられた (RFC 4474)。



サーバーは、ユーザー認証のためのパスワードを知っている。

ユーザーも当然自分のパスワードを知っている。


でも、攻撃者はこのパスワードを知らない。


そこで、INVITE メッセージを送る際に、パスワードやそのほかの情報を使って計算した値を一緒に伝える。

両者で計算が合えば「正当な」INVITE メッセージ、それ以外は SPAM だ。



ここで、SPAM かどうかを判断するのは、受け付ける VoIP 機器側だ。

SIP サーバーが数値を伝えてきたとしても、受け取る VoIP 機器側で無視しても何ら問題はない。

(SPAM は無言電話となる)


また、後から追加された RFC なので、SIP サーバーが対応していない場合もあり得る。

この場合は、VoIP 機器側では比較すべき数値が渡されないため、正当な INVITE も、 SPAM と判断せざるを得なくなる。

(一切着信しなくなる)



前者はイライラするだけだが、後者は電話として致命的だ。

そのため、機器の初期設定としては、この機能を使用しない状態になっている。


SPAM に困って「使用する」に設定した場合は、自分で電話をかけて、着信できることを確かめたほうが良いだろう。

正常に着信すれば、SIP サーバーもこの機能に対応しており、他の副作用は生じない。




というわけで、設定変更一つで問題は解決した。

これで、着信待ちだけなら無料の電話回線が一つ用意できた。


以前書いたけど、僕に用事がある人は僕の携帯やメールに連絡をよこすため、多分使わない。

「会社電話番号」を知りたがるお役所のために用意しているだけだ。

その役所も電話をかけてくることは、まずない。


使わないからこそ、無料になるのはありがたい。


▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

歯車

関連ページ

IP電話【日記 17/12/12】

別年同日の日記

02年 ムカツク店員

03年 日記エンジンバージョンアップ

13年 Robot Turtles

15年 honor6 plus 使い勝手レビュー


申し訳ありませんが、現在意見投稿をできない状態にしています

P10 plus に乗り換え  2017-12-18 11:56:25  コンピュータ 歯車 家族

▲目次へ ⇒この記事のURL

Huawei のスマートホン、P10 plus を購入した。


…いやいや、2ヵ月前に、その下位機種の P10 を購入したばかりだろ。

もう買い替えたのか、って思われるかもしれない。


元々、P10 を欲しかったのは妻なのだ。

購入したのだけど、思ったのと違った。それで僕が使うことになった。



「思ったのと違った」のは、主にユーザーインターフェイス部分。

Android で、ランチャとかホームとか言われる、システム標準で付属している、一番操作の中心となる部分だ。


それまで ASUS の ZenFone2 Laser を使っていた。

ASUS では ZenUI というランチャを使用している。


Android には、iOS の通知機能である「バッヂ表示」は存在しない。

でも、ZenUI では謎テクノロジーによって、バッヂ表示を行う。



これに対し、Huawei では HuaweiHome というランチャを使っている。

バッヂ表示は「一部ソフトのみ」対応していて、「一部ソフト」の多くが、Huawei 製のアプリだった。


これが、バッヂ表示はするけれど、アプリとしての出来はそれほど良くない。

いや、出来が悪いわけではないけど、可もなく不可もなく。

探せば無料でもっといいのがあるよ、という感じの出来栄え。




一度は P10 は肌に合わない、と僕に譲り、代わりに僕がそれまで使っていた Huawei Honor6 plus を使い始めた。

でも、その後 HuaweiHome の癖にも多少慣れてきた。


何よりも、Android はランチャを好きなものに交換できる。

無料の「Atom Launcher」が結構望みの操作感を実現してくれる、ということも分かった。



#先にバッヂ表示を「謎テクノロジー」と書いたが、iPhone にあるものを Android で実現すべく、いくつかのホームアプリが「独自の」バッヂ表示 API を作り出していた。

 独自規格が乱立したわけだが、今はそのすべてに対応したホームアプリなどが作られている。

 HuaweiHomeが「一部ソフトのみ対応」だったのも、一部 APIにのみ対応していただけの話。



じゃぁ、ユーザーインターフェイスの問題が無くなったところで、再び新機種を選定しよう。


妻は小柄なので 5.5inch の Honor6 Plus は持ちにくい。

5.0inch の Zenfone2 Laser は持ちやすい。

ちなみに、5.1inch の P10 も、問題なく持てる。


Zenfone2 Laser の不満点は、カメラ性能が悪いこと。カメラ性能は欲しい。

Pokemon GO とかポケ森とか、結構ゲームも好きなので、それなりの処理能力も欲しい。


…というわけで探すと、やっぱり P10 になってしまう。

P10 、コストパフォーマンス高いんだよね。だから以前も選んだのだけど。



じゃぁ、やっぱり P10 は妻が使うことにして、僕は新しい機械を買おう、ということになった。

Honor6 plus に不満はなかったのだけど、SIM サイズが違うので、今更戻れない。


それに今は、Honor6 plus を「空き」の状態にしたいんだ。




じゃぁ、P10 の廉価版であり、Honor6 plus の後継機である、Honor9 にしようかな…と思って調べる。



えーと、一応書いておけば、Honor9 と P10 は、処理性能などはほぼ同じだ。

違うのはカメラとディスプレイで、P10はカメラにいいレンズを使っているため、集光しやすい。つまりは暗い時に強い。

また、レンズ部分に光学手振れ補正が入っているので、揺れに強い。



でも、Honor9 のカメラが貧弱なわけではない。

もともと、レンズなんて気にしないでも十分高性能なのだ。


今では iPhone もダブルレンズだけど、もともとは Honor6 plus が導入した技術だ。

それをさらに進化させたものが、Honor9 と P10 に搭載されていて、レンズ以外は同じもの。


Honor9 だって、スマホとしてはかなり高いレベルのカメラで、P10 はそれをさらに良くしたもの。



ディスプレイは、Honor9 のほうがわずかに大きい。P10 が 5.1inch で、Honor9 は 5.15inch だ。

ちなみに、大きくなったがドット数は同じ。つまり、ここは「大きい方が微細加工が楽になるから安い」部分と思われる。


とにかく、技術的には P10 と一緒だけど、「多少安い部品つかってもいいんじゃないかな」って部分で安くしたのが、Honor9。

海外では、P10 の半額くらいで Honor9 を販売しているようなのだけど…




買うつもりで調べてみると、妙に高い。


honor9 は販売ルートが限られている。あまり Huawei 名を出さない「OEM」に近い販売ルートを取るためだ。

そして、値段は税抜き 53,800円で横並び。税込みだと 58,104円。


もちろん、SIM 契約付き1年縛り、とかで値引きしているところは多いけど、今欲しいのはそういうものではない。



これに対し、「上記機種」にあたる P10 は、販売ルートが自由なので値引き競争がある。

価格.com で安い店を調査すると、税込みで 54,400円の店が並んでいる。


…廉価機種のほうが高い、という逆転現象が起きているんだ。



#…と、購入検討時には思っていた。

 今日記にするために再度調べたら、OCN 販売の SIM 付き Honor9 は、税込み 49,464円なのだけど、この SIM は契約する必要はないそうだ。

 とはいえ、「上位機種」である P10 との差額は5千円程度。わざわざ選ぶかは微妙な値段だ。




P10 をもう一台買って、妻には新しい方を渡そうか…とも思った。

そうすれば、僕は「引っ越し」の必要がなくなるので楽だ。


でも、思い立って P10 の上位機種である「P10 plus」の値段を調べてみる。

58,782円。上位機種と言っても、P10 と5千円も違わない。というか、廉価機種であるはずの Honor9 と600円しか違わない。

何よりも、P10 plus の最安値を Amazon が付けているので、頼めばすぐ届く安心感がある。



P10 plus は、P10 よりもさらに良いレンズを使っている。


また、ディスプレイは 5.5inch になり、表示ドット数も増えている。

その分本体は大きくなるが、大きくなった分バッテリー容量も増えている。


もっとも、画面が大きくなって画素数が増えたのは、デメリットの可能性もある。

処理能力は変わらないのだから、画素数が増えた分だけ描画速度が遅くなるだろうし、電力食いにもなるだろう。

ディスプレイが大きくなった分バックライトも電力食いだろうし、バッテリー容量増加は相殺されるかもしれない。



でも、僕としては Honor6 plus で 5.5inch を使っていたので、このディスプレイが魅力的に見える。

というわけで、P10 plus を購入することに決めた。




前回、13日の日記で「妻のスマホ買い替え待ち」という話を書いたのだけど、それから新機種の選定を始め、注文したのが14日。


15日には P10 plus が届いたので乗り換え作業。

Huawei 機種は、Android / iOS からの「乗り換えツール」が準備されている。

これを使うと、できるだけ同じアプリを入れてくれ、可能ならデータや設定も引っ越してくれる。


そんなわけで、開封して1時間後には乗り換えが完了。

実際には使っていて多少のトラブルはあったのだけど、見た目の上では画面が広くなっただけの上位機種に、ほぼそのまま環境移行できた。

「気づいたら成長して画面が大きくなってました」というくらい、乗り換えの違和感がない。



多少のトラブルというのは、Amazon Prime Video がデータ不整合でもあったのか使えなかったことくらい。

データ消去して、再ログインしたら何も問題なく使えるようになった。


15日の夜には妻にファクトリーリセットした P10 を渡し、16日中に妻も移行作業。

こちらはいろいろ実験していたこともあり、移行ツールを使わずいくつかのアプリを再インストールしただけ。


SIM サイズが変わるのだけど、その申し込みは後にして、とりあえず2台持ちしていた Zenfone2 Laser に電話機能を戻す。



16日の夜には Honor6 plus が空いたので、ファクトリーリセット。

先日契約したゼロSIM を入れ、新規に子供用アカウントを作り、子供の連絡用に仕立て上げる。




なぜこんな突貫作業をしたかというと、17日に家族で出かける用事があったから。

また、18日から長男が塾に体験入学してみることになっていたから。


どちらかというと、大事なのは塾。

僕や妻が中学の頃は、塾は夜9時には終わっていたものなのだけど、今の塾は10時近くまであるのね。

その時間に子供を一人で帰らせるのは危険なので、車で迎えに行くことにしても、連絡手段が欲しい。



で、その前日に家族で出かけるのだから、そこで練習できるといいだろう、というつもりで突貫で仕上げたのだ。

そのお出かけの話は、この後の日記に…



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

歯車

家族

関連ページ

ピューロランドで誕生日【日記 18/04/04】

ピューロランドで誕生日【日記 18/04/04】

ピューロランドのクリスマス【日記 17/12/18】

別年同日の日記

09年 名機の条件

12年 ふたござ流星群

14年 コンラッド・ツーゼ 命日(1995)

15年 CentOS5+Xen3 から CentOS6+Xen4 への引っ越し


申し訳ありませんが、現在意見投稿をできない状態にしています

0sim  2017-12-13 12:06:04  コンピュータ 歯車

▲目次へ ⇒この記事のURL

昨日に続き電話関連の話。


中学1年の長男に、先日塾の模試を勧めてみた。


近所の学習塾が、無料で模試を行っていたのね。

チェーン店なので、県下の1万人以上が同じ試験を受け、学力がわかる。


結果はまだ出てないのでそのことは良いのだけど、このときに「子供との連絡手段欲しいな」と、ちょっと思った。

初めて、子供だけで夜外出させて、車で迎えに行ったので。




まずは、0sim を申し込んでみる。


ゼロシム。月額料金無料、500MByte までは利用料無料の、データ専用 SIM だ。

500M を超えると、100Mごとに100円かかる。時々子供と連絡するだけなら、500Mに収まるだろう。


データ専用だけど、IP電話を使えば通話もできる。

そして、LINE を使えば、相手が限定されるが音声通話でも無料だ。


ちなみに、昔は LINE は SMS が使えないと ID 作れない、と言われた。

今は Facebook アカウントがあれば ID を作れる。データ専用 SIM でも大丈夫。



問題は、これを入れるスマホだな…

昔使っていたLumix Phoneをガラクタ箱の奥深くから発掘。


古いけど、通話するくらいなら問題ないだろう。




ところが…だ。

LumixPhone 、ずっとほったらかしだったので、過放電でバッテリーがダメになっているっぽい。


最初は、1日充電しても5分動作するのがやっとだった。

ただ、過放電で悪くなったバッテリーは、しばらく使っているうちに「ある程度」回復する、と聞いたことがある。


繰り返してみても、30分くらいが限度。


ネットで調べると「冷凍庫に一晩入れ、半日かけてゆっくり解凍するとよくなる」という情報が。

一体何がどういう原理で。オカルトだと思いながら試す。


なんと、4時間くらい動くようになった。

これは、機内モードにして無駄な電力を消費させない状態の話。




ゼロシム自体は、入れて動作させてみたら問題なく動く。


ただし、セルスタンバイ問題が出る。

データ専用 SIM を入れられたスマホが「音声通話回線が見つからない」と思って、一生懸命探し続けて電力を無駄に消費する現象。


ただ、「セルスタンバイ状態」と表示はされているのだけど、この状態でもやっぱり稼働時間が4時間くらい。

「音声が見つからないよー」とは言っているが、それで無駄あがきはしない、ということか。





試しに LINE アカウントも作り、通信できるようになった。

あとは、動作時間さえどうにかなればなぁ。



…まぁ、本命は妻のスマホの買い替え待ちか


現在、僕が以前使っていたスマホと併せ、妻は2台持ちで生活している。


新しい機種を買ってみたのだけど、


「スマホ初心者だったので、Android スマホがメーカーごとにかなり使い勝手が違うのを知らなかった」


のが主な原因で、使わずに僕に譲ったのだ。

でも、そろそろ機種差に慣れてきて、本当に欲しい機能が何かまとまってきているようだ。



譲れない機能、諦められる機能などが見えてくれば、適切な1台を買える。

そしたら、少し古い機種が2台余るので、そこにゼロシムを入れればいいだろう。


▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

歯車

関連ページ

3度目のキッザニア【日記 18/04/22】

3度目のキッザニア【日記 18/04/22】

P10 plus に乗り換え【日記 17/12/18】

P10 plus に乗り換え【日記 17/12/18】

別年同日の日記

02年 ページ更新

03年 東海道旅行終了

04年 忘年会

09年 風邪その後

10年 盛りだくさんの週末

12年 答えは重要ではない


申し訳ありませんが、現在意見投稿をできない状態にしています

IP電話  2017-12-12 17:16:02  コンピュータ 住まい

▲目次へ ⇒この記事のURL

ルーターを入れ替えてから、IP電話が使えなくなった。


…早くどうにかしなくちゃなぁ、って思いながら、元々ほとんど使ってなかった電話なのでほったらかしになっていた。


会社の電話番号なのだけど、関係者はみんなメールとか僕の個人携帯電話にかけてくるので、もし掛かってくるとしてもお役所か、セールス電話だけ。

で、お役所からかかってきたことなんて、ない。


でも、ずっとそのままにはしておけない。

重い腰を上げて、やっと「どうにか」した。


電話番号変わってしまったので、お役所には新たな番号を届けないといけないのだけど。

セールス電話は、来なくなるだろうからかえって良いだろう。




元はといえば、NTTコミュニケーションズの運用する IP 電話を、NTT 純正のルーターで使っていたのだった。


ところが、今年の春にルーターが壊れた。

IP 電話設定できるルーターはかなり古いバージョンが「最新の現役」であり、事実上開発が止まっていた。


というのも、NTTコミュニケーションズは現在スマホで使用できる 050plus という IP 電話を展開していて、家庭用の「固定 IP電話」は縮小傾向だから。

過去に契約した人たちへのサービスは維持しているが、新規獲得する気はないのだろう。



対応したルーターが無いと、使い続けることはできない。

でも、NTT コミュニケーションズ系の IP 電話を、VoIP アダプタで使用している、という人のブログ記事などを見つけた。


なるほど、それで行こう。

というわけで、ルーターと一緒に VoIP アダプタを購入してあった。




NTT コミュニケーションズ「系」という書き方をしたが、過去において展開された家庭用の IP 電話は、NTT コミュニケーションズが直接運用しているものではない。


インターネットサービスプロバイダ…各家庭からインターネットに接続する業者が、サービスを「再販」する形で展開したものだ。


僕はアサヒネットを使用しているので、アサヒネットの「IP電話C」というサービスに当たる。


#朝日ネットでは、他に「IP電話F」も展開している。

 C はコミュニケーションズで、F は富士通のサービスを再販した形。



僕は、アサヒネットから振り出された、NTTコミュニケーションズ系の IP 電話のサービス ID などを VoIP アダプタに設定すればそのまま使える、と思っていた。

でも、話はそんなに簡単ではなかった。




VoIP というのは、Voice Over Internet Protocol の略。

「インターネットで音声通話」って意味合いだな。IP 電話の技術の総称だ。


問題はこれが「総称」であることで、少しづつ違ったいろんな技術がある。

そして、VoIP アダプタでは、ものすごくたくさんの設定項目を用意することで、どの技術にも対応できるようにしてある。


NTT 純正ルーターでは、この「膨大な設定項目」をすべて隠し、ユーザーごとに与えられる値だけを設定すればいいようにしてあった。

というか、VoIP を独自拡張し、設定すべき項目を自動的にサーバーから取得するようにすらしてあったようだ。



この項目を正しく設定する必要があるわけだが、問題は「サーバーから自動取得する」ような値。

NTTコミュニケーションズ系の IP 電話でも、サービスプロバイダによっては公開されていて、公開されていなくても解析されていて、場合によっては一切の情報がない。


アサヒネットは、比較的情報がない方だった。一切ないわけではないが、僕は VoIP の専門知識が乏しいため、正しい設定方法を見いだせなかった。



VoIP を扱う無料ソフトウェア… Asteriskというものがある。

これを使うと電話構内交換機を作れるのだけど、まぁややこしいことはいいや。つまりは、VoIP アダプタの内部ソフトと同じようなことをしているはずだ。


これにアサヒネットの IP電話C を登録している例は、いくつか見かけた。

でも、一般的な VoIP アダプタの設定方法とは、大きく異なる。

そこを解決するだけの知識が、僕にはなかったのだ。




一応書いておけば、春から設定を始めて、夏くらいまではいろいろ粘ったのだ。

アサヒネットの知り合いのつてを頼って、技術の偉い人に「IP電話Cの設定パラメータわかりませんか」なんて直接聞いたりもした。


でも、ダメだった。

NTTコミュニケーションズのサービスを再販しているだけで、詳しいことは知らないんだそうだ。


#偉い人だから末端の細かなパラメーターまで知っているわけがない、という側面もあるとは思う。


得られた答えは「解約して別のサービス使ったほうがいいです」っていう答え。


サービスしている会社の人に解約して、って頼まれるのもすごい話だ。

でも、それだと電話番号変わっちゃうからなぁー、って思ったまま半年が過ぎた。




先ほど、妻に「あの電話結局どうなってるの?」と聞かれて、再挑戦することにした。

もう、電話番号は変わってもいいので使えるようにしよう。


そう腹が決まれば展開は速い。以前から考えていたことはある。


smartalkの電話番号をすぐに取得する。

月額無料の IP 電話だ。その代わり、通話料が少し高い。


でも、元々家の電話は別にあり、仕事用の待ち受け専用だ。

通話料っていうのはこちらから掛けたときに発生するものだから、高くても関係ない。



smartalkはスマホアプリで使うことを前提としているのだけど、普通の VoIP だ。

IP電話Cのような、特殊なことはやっていない。


だから、VoIP アダプタに設定すれば、固定電話でも使用できる。

サポート対象外だから、設定は自己責任で、というだけ。


設定は主にこの辺とか、この辺を参考にさせてもらった。


最初はつながらず、いろいろいじる。

NAT 越えができてないのかな、と思ってルーターにサーバー設定を行い、VoIP ルーターは NAT 越えがいらないようにする。


でもなかなかつながらないなぁ、と思っていたら、パスワードの設定個所を間違えていた。

正しく設定したらあっさりつながった。




調べると、うまく NAT を越えないと「発信は出来るが待ち受けできない」状態になるようだ。

まぁ、仕組みから考えるとそうなるだろうな。


NAT というのはルーターの機能。家庭内の複数のマシンをまとめ、1台に見せかける。


サービスプロバイダは「1台」の接続しか提供しないのだけど、NAT によって複数台を繋げるのだ。

電話をかけるときはこれでいい。


でも「呼び出し」の時は、家の外から接続が行われれる。

機械が1台に見えるからアクセスするのだけど、それはルーターで電話じゃないから通話できない。


これを解決するのが NAT越え、という技術。

これもいろんな方法があるけど、ともかくルーターに「電話にアクセスがあったら VoIPアダプタにデータを渡してね」って教えておく。



今回僕が使ったのは、あらかじめ手動で設定して教えておく、という方法で、NAT 越えは使わない。


設定方法としては難しいので、参考にしたページはみんな「NAT 越え」の一番原始的で適用範囲の広い(でもトラブルも起きやすい)方法で設定するようになっていた。


原理を理解して、一番シンプルな方法を使えば、トラブルは少ない。

うちの設定としてはこれで行こう。




そんなわけで、今まで使っていた(半年ほどは使えないのにお金を払っていた)IP電話C は解約。

解約してください、って偉い人にも言われちゃってたし。


まだ電話番号を誰にも教えていないので、当面どこからもかかってこないはず。




追記 2017.12.20


どこからもかかってこないはず…と思ったら、無言電話が沢山きました。

SIP SPAM と呼ばれるものです。


対策方法書きました。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

住まい

関連ページ

無言電話(SIP SPAM)【日記 17/12/20】

別年同日の日記

01年 12/11

02年 粗大ゴミ

11年 カレンダー

12年 nexus 7 と US キーボード

14年 ロバート・ノイス 誕生日(1927)


申し訳ありませんが、現在意見投稿をできない状態にしています

リロケータブル  2017-11-27 14:09:53  コンピュータ

▲目次へ ⇒この記事のURL

2年ほど前に、LSI-Cの作者さんの訃報に触れ、追悼文を日記に書いた


LSI-C というのは、コンピュータープログラムに使われる「C」という言語の亜種。(実装の一つ)

作者さんに面識はなかったが、昔お世話になったので追悼文を書いたものだった。


で、そちらの日記を見た方が、Twitter に感想を書いてくださっていた。


#時々エゴサーチしてますよ


MS-DOS には、COM と EXE と呼ばれる、二つの実行形式ファイルがあった。

プログラム言語の話なので実行ファイルとも関連が深く、Cでもこの二つのファイルが作れたことを書いたところ、「初めて知った」と素直に感想をくださったのだ。



あー、…ごめん。

知識を得て喜んでくれたところ申し訳ないのだけど、あちらのページに書いたのは正確ではない。


以前書いたことの概要を示そう。


MS-DOS のC言語には「メモリモデル」という概念があり、プログラムを作るときにはメモリモデルを選ぶ必要があった。


このうち、プログラムとデータをすべてひっくるめて 64Kbyte 以内で作れるものは、COM ファイルになる。

それ以外は EXE ファイルだ。



…でも、これは「C言語で、64Kbyte 以内のメモリモデルを選ぶと COM ファイルを作れた」というだけで、COM ファイルの要件ではない。

COM ファイルで 64Kbyte を超えるデータを扱うことも可能だったし、COM と EXE の違いは、プログラムやデータのサイズよりも大切なことがある。


嘘を書いてしまったみたいで申し訳ないので、もう少しちゃんと書いておこう。




メモリの話なので、簡単な基礎知識から。


メモリは「アドレス」を使って参照される。

アドレス=住所、の名前の通り、1つのメモリ(記憶)には、1つのアドレスが対応している。


1000番地に 123という数値を入れておけば、1000番地を読みだしたときには、必ず123が入っている。

1001番地に 45 という数値を入れても、1000番地の内容には影響がない。

あいかわらず 1000番地は 123 だし、1001番地は 45 だ。


当たり前の話なのだけど、この当たり前が成立するから、安心してプログラムも作れるし、計算もできるんだ。

基本はしっかり抑えておきたい。


コンピューターの中では、文字も、プログラムも、すべて数値で表現される。

だから、メモリの中に文章データも、プログラムも、もちろん計算結果も、すべて置いておける。



もう一つ、以下の説明で使うので「レジスタ」というものを覚えてほしい。

これは、CPU の中にある、特別なメモリ。

アドレスは割り振られておらず、CPU が特別な意味を持って利用する。




さて、MS-DOS に COM ファイルの実行を指示すると、OS は空きメモリを見つけ出して、ファイルの中身をそのままメモリに読み込む。

その後、OS は CPU の中にある「データの場所」と「プログラムの場所」を示すレジスタを、読み込んだ場所にセットする。


そして、読み込んだデータを実行する。

これが、COM ファイル実行の仕組みだ。



「データの場所」と「プログラムの場所」のレジスタとは何だろうか?


MS-DOS が使えるパソコンは、8086 という 16bit CPU を使っていた。

この CPU は、8bit CPU の 8080 の後継機種で、8080 のプログラムを「簡単に移植」できるように作ってあった。


8bit CPU では、メモリアドレスは 16bit (8bit 2個分)あった。これで、64Kbyte のメモリを扱える。

プログラムの中でアドレスを扱うレジスタも、当然 16bit だった。


これが 8086 になると、16bit なのだからメモリアドレスが 32bit になったか…というと、そうでもない。

中途半端に見えるかもしれないけど、20bit になった。

そして、アドレスを扱うレジスタは、あいかわらず 16bit だった。


これは、8bit CPU 8080 のプログラムを移植しやすいようにするためだ。



でも、メモリアドレスは 20bit なのに、レジスタが 16bit では全部を扱えない。

そこで、プログラムの中では「メモリの開始位置」をずらせるようになっていた。


たとえば、「データの場所」として、1000番地を指定したとしよう。

すると、プログラムの中では「234 番地」を指定した場合に、自動的に 1000 + 234 で 1234 番地が使われる。


データの場所と、プログラムの場所は、別々に指定ができた。

だから、最大で 128Kbyte のメモリが扱える。


もしそれ以上のメモリを扱いたいときには、プログラムの中で「データの場所」「プログラムの場所」を示すレジスタを書き替えればいい。



しかし、MS-DOS の COM ファイルは、データもプログラムも同じ場所にあり、さらに場所の書き替えは行わない、という前提で作られる。

最初に書いたように、場所をセットするのは OS の役目で、プログラムはその「場所」で動くことになる。




ここで一つ説明が必要になると思う。


なんで、プログラムやデータを示す「場所」のレジスタをセットする、という必要があるのか。

1234 番地を使いたいのなら、プログラムの中で 1234番地、って書いとけばいいのに。



この答えは単純で、プログラムが同時に複数読み込まれるからだ。


あるプログラムが 1234 番地を使う、と指定していたとしたら、別のプログラムで 1234番地を使ってはならない。

でも、プログラムを作るときに、他の「知り得ない」プログラムが、どこのメモリを使っているかなんてわからないのだ。


プログラムの中では 234番地、とだけ指定して置けば、この問題を解決できる。


2つのプログラムが、それぞれ 234番地をつかおうとしていても、OS が片方は「1000番地から」、もう片方は「2000番地から」使うように指示する。

そうすれば、片方は実際には 1234番地、もう片方は 2234 番地を使うことになり、同時に使って問題ない。



そもそも、8086 が 20bit のアドレスを 16bit のレジスタとの組み合わせで示す、という変なアドレス指定方式を採用しているのは、このような使用方法を想定していたためだ。

MS-DOS の COM ファイルは、素直にそのやり方を実現したプログラム形式なのだ。




でも、これでは大きなプログラムを作れない。COM ファイルの限界を無くしたいときには、EXE ファイルを使う。



COM ファイルは、単純にプログラムを入れてあるだけのファイルだった。

でも、EXE ファイルの中は構造になっていて、少なくとも次の3つのものが入っている。


・プログラム

・データ

・再配置情報


COM ファイルでは、プログラムとデータは混然一体となっていた。

でも、EXE では分離してある。


…まぁ、もちろん混然一体にしてもかまわない。

でも、先に書いたように 8086 は「プログラムの場所」と「データの場所」を別々に指定できる仕組みを持っている。


だから、分離しておけば、読み込み時点で OS が適切にメモリに配置してくれる。



最後に残る「再配置情報」っていうのは何かというと、プログラムを実行する間に OS が書き替えるためのヒントだ。


しつこく繰り返すことになるが、8086 には「データの場所」「プログラムの場所」を、それぞれ 64Kbyte 確保する仕組みがある。

それ以上のメモリアクセスが必要なら、これらの「場所」を示すレジスタを書き替えないといけない。


でも、ここで先に書いた問題が再燃する。

OS が「1000番地から」使うように指示をくれていたのに、勝手に「2000番地から」使うように書き替えることは許されないのだ。

そんなことをしたら、他のプログラムとぶつかってしまう。


そこで、プログラムを作る際には、仮に「0番地から」メモリアドレスを始めて、場所を示すレジスタも、自由に書き替えてよいことにする。

ただし、プログラム中でレジスタを変更する場所は、すべて「再配置情報」に記しておく。


OS は、ファイルからプログラムを読み込み、メモリに配置する際に「再配置情報」を参照する。

そして、書かれた数値に、適切な数値を足していくのだ。


1000番地から使用するのであれば「0番地から」になっている部分に 1000を足し「1000番地から」に変える。

アドレスを指定している個所をすべて変更すれば、そのプログラムはメモリのどこに置かれても、正しく動作する。




プログラムをメモリのどこにおいても大丈夫なように作る…このようなプログラムを「リロケータブル」という。

英語で書けば relocatable。re(再び)locate(配置)able(可能)で、日本語訳は「再配置可能」。


COM ファイルは、そのままでリロケータブルだ。「場所」を示すレジスタさえ正しく整えれば、どこにおいてもそのまま動く。


EXE ファイルのプログラムは、読み込むアドレスを「仮に固定して」作られている。リロケータブルではない。

でも、再配置情報を使って、OS が書き替えを行うことで、リロケータブルになっている。

利用者にとっては気にする必要はないだろう。どちらもリロケータブルだ。



さて、ここでやっと、最初の問題に戻れる。


僕は、COM ファイルの要件を「プログラム、データ含めて 64Kbyte 以内のもの」というように書いたのだけど、実はこれは嘘だ。

COM ファイルはサイズが問題なのではなく、「そのままでリロケータブル」なプログラムを意味している。


メモリのどこに読み込んでも実行できる。

MS-DOS の仕組みでは、「読み込み時点」では、64Kbyte 以内に収まることが大切だ。

これは、ファイルサイズが 64Kbyte 以内であること、と同じ意味になる。


実行された後に、空きメモリを探して確保して、外部データファイルを読み込むのは構わない。

こうすれば、COM ファイルでも 64Kbyte を超えるデータを扱える。




歴史的には、MS-DOS の元になった CP/M という 8bit OS があり、その OS の実行ファイルが COM だった。

8bit なので、同時にいくつものプログラムを読み込むことはできない。


MS-DOS では、8086 の仕組みを利用して、COM を複数同時に読み込めるようにした。

CP/M にはできない芸当で、便利だった。


でも、16bit らしい大きなプログラムは作れなかった。

そこで、MS-DOS の Ver 2 になってから、EXE ファイルの仕組みが拡張された。



先に書いたように、仕組みは違うがどちらも「リロケータブル」なファイルで、ユーザーから見たら特に違いはない。


形式が古く、制限の厳しい COM ファイルを好きこのんで作る理由なんて、どこにもなかった。

DOS 標準プログラムも、ver1 から使われている command.com 以外には、非常に小さなプログラムでもほぼ EXE で作られていたと思う。


しかしまぁ、ファイル構造を示すヘッダがない、構造を解析してパッチを当てる時間が不要、などの理由で COM ファイルは「実行が速い」とされた。

ディスクアクセス時間に比べれば、そんなものは誤差範囲レベルなのだけど。


制限が厳しいからこその腕試し、というような側面も相まって、それなりに COM ファイルは作られていたと思う。




さて、ここからは余談。



EXE ファイルのような、「OS がアドレスを変えることで」どこにでも読み込めるようにする…という形式が、いつ頃考案されたのか僕は知らない。


マルチタスクなら、複数のプログラムがメモリに読み込まれるので、当然「プログラムをどこにおいても良い」、つまりはリロケータブルである必要がある。


マルチタスクの元祖は、Multics か、その前身となる実験だった TSS あたりになるのだけど、今調べたら TSS では当たり前に「リロケータブル」となる仕組みが作られていたようだ。


おそらくは、シングルタスクでも複数のライブラリを組み合わせて使用する場合などで、アドレス調整の必要からリロケータブルの仕組みが作られたように思う。



以前調べた中では、WhirlWind I のライブラリプログラムは、リロケータブルにできるように作られていた。

もっとも、これは OS が仕組みを作っているとかではなくて、ソースコードレベルで「別のアドレスに置くときは、ここの部分を改造する」など、適切なコメントを人間に残す形なのだけど。


ともかく、プログラムを置くアドレスが変わっても、正しく動作するプログラムを作ろう、という意識はあったことになる。

となれば、後はどこかの段階で、機械的なサポート方法が考案されたのだろう。



MS-DOS は、Ver 1 では COM ファイルしか使えない。

CPU がサポートする機能を使ってリロケータブルを実現してはいるが、「OS の機能」として、制限の少ないリロケータブルをサポートするのは Ver 2 以降だ。


大型機で使われていた技術を取り入れたものだろう。




X68000 という 16bit パソコンがあった。

CPU に 68000 という、昔の Apple Macintosh や、セガの「メガドライブ」に使われたものと同じ LSI を使用していた。


この CPU では、MS-DOS は動かない。

だけど、MS-DOS を参考にしたと思われる、Human68k という OS を標準搭載していた。



実行ファイルも、MS-DOS のように2種類あった。x 形式と r 形式だ。

x 形式は、EXE と同じように、実行前にプログラムが OS によって書き替えられる。


r 形式は書き替えずにそのまま実行する。この点は COM ファイルと同じだ。

でも、68000 には MS-DOS のような「メモリの始まる場所」を示すような数値はなかった。


それでも、リロケータブルなプログラムを作ることができた。




8086 では、アドレスを表すのに3つの方法があった。


・今実行中のアドレスに、1byte 分、-128~127 の数値を加える。

・今セットされている「場所を示すレジスタ」を先頭として、2byte 分、0~65535 の数値を加える。

・場所を示すレジスタも書き替えて、全メモリ(20bit)を指定する。



これに対して、68000 では、大きく分類して2つのアドレス指定方法があった。


・今実行中のアドレスに、2byte 分 -32768~32767 の数値を加える。

・全メモリ (24bit) を指定する。



8086 の COM ファイルは、「場所を示すレジスタ」を OS がセットしてくれるのを前提として、リロケータブルになっている。


それに対し、68000 では、レジスタの助けを無しにリロケータブルにできる。

アドレスの範囲は同じ 2byte に見えるが、常に「実行中のアドレス」を中心とするため、作り方次第で 64Kbyte を超えるプログラムも作れる。


68000 の「リロケータブル」は、8086 の「リロケータブル」よりも、もっと制限が少ないのだ。



でも、X68k では、「 r 形式」としてリロケータブルなプログラムを実行できるようになっていたにも関わらず、開発のためのサポートはなかった。


MS-DOS なら、C言語でメモリモデルを選択すれば作れた。

だけど、X68k のC言語は x 形式しか作ることができず、r 形式を作るには、アセンブラですべてを書くしかなかった。



先に、MS-DOS でも COM を作るのは腕試しの側面があった…というようなことを書いた。

とはいえ、C言語でも簡単に作れる。


でも、X68k の r 形式はすべてをアセンブラで書く必要がある。

「適切に書かれれば」という前提付きだけど、C言語の生成するコードよりも効率が良く、高速動作する…ことも考えられる。


だから、r 形式のプログラムは「速い」という神話が生まれた。

いや、ただの神話で、r だから速いなんてことは全然ないのだけど。


僕もあこがれて、いくつかの小さなプログラムを r 形式になるようにアセンブラで書いていた。

まぁ、習作だよね。特に発表はしてなかったと思う。


#特に、シングルタスクの OS 上でマルチタスクな動作を実現する「常駐プログラム」はアセンブラで書く必然性があったので、そういうものを試作していたはず。


大学2年生の時に作った、BANDITS も r 形式ではなかったかな。

ただ、このゲームは未完成。習作何本か作っていい気になって大作に挑み、失敗した。


技術が伴わないのに大きな目標を立ててはいけませんね。



▲目次へ ⇒この記事のURL

関連ページ

【追悼】森公一郎さん (LSI-C の作者)【日記 15/01/20】

別年同日の日記

03年 ピザ

06年 クリスマス飾り

15年 エイダ・ラブレイス 命日(1852)

15年 NTT工事延期

16年 セガ・サターン復活


申し訳ありませんが、現在意見投稿をできない状態にしています

Android Chromeでスクロールがおかしくなるバグの原因と修正  2017-10-27 11:30:48  コンピュータ

▲目次へ ⇒この記事のURL

フリーのプログラマーとしてやっているので、仕事内容はどんどん変わる。

ここ数カ月は、ある企業の WEB サイトデザインの大規模変更を手伝っている。


すでに長年運用されているサイトで、Wordpress で構築されている。

プログラムは拡張を繰り返してスパゲッティ状態だが、今回は「デザイン改修」が趣旨なので、プログラムは出来るだけそのまま活かして…

という指示。


ほぼ完成していたのだが、今月の中ごろに、一部の Android 端末でスクロールがおかしい、というバグが報告された。




Chrome のアップデートで、スクロールがおかしくなるバグが混入したらしい


…と報じているサイトがあった。9月28日の記事で、アップデートは9月25日…ということになっているが、実際には19日。


#Android アプリを配布する Google Play ストアでは、バグやウィルス入りのアプリが一気に広まるのを防止するため、複数のサーバーで徐々に配信が開始される。

 アプリの登録・公開は19日だったが、実際にアップデートが入るのは端末ごとに接続するサーバーにより異なり、25日が嘘だということではない。



あぁ、Chrome のバグならしょうがない。そのうちアップデートされるだろうから、この件は一時保留…となったのだが、大きなバグに思える割になかなか修正されない。


クライアントからの強い修正依頼もあり、たとえ Chrome に原因があろうとも、多少別の機能に影響が出ても回避・修正せよ、となったのが昨日。

徹底的に原因の解明が始まった。




改めて確認すると、自分の端末でもバグが出た。


先日新しい端末にしたばかりで、以前の端末では問題が出なかった…と思う。

普段は PC の Chrome で、スマホエミュレートして確認をしているが、やはり問題は出ていない。


ともかく、手元でバグを再現できるようになった。こんなに心強いことはない。

しばらくいじって、バグの出る状況を確認。



スマホのブラウザの場合、スクロールによってアドレスバー…URL を表示したり、入力したりするところが、現れたり消えたりする。

この状態が切り替わった後、最初の Idle 状態にブラウザがなった時に、スクロール位置がトップに戻ってしまう、というバグが出現した。


Idle 状態って表現は説明がいるだろう。

アドレスバーはスクロールに合わせて出入りするが、スクロールが「止まって」も、指が放されるまではスクロールが続いている、と考える。

また、指を放す際にフリックすると、慣性スクロールが始まる。この慣性スクロールが終わるまでは、スクロールが続いている。


そして、スクロールが終わった時が「Idle 状態になった時」だ。

この瞬間にバグが出る。



多少の心当たりはあった。

作製しているサイトでは、画面上にある「ナビゲーションボタン」を、スクロールに合わせて表示を切り替えていた。


ページ表示時には、ページのヘッダ部分があり、その下にナビゲーションがついている。

文章を読み進め、下に向かってスクロールすると、当然ヘッダとナビゲーションは上に消えていく。


…はずなのだが、ナビゲーションがちょうど画面の上に貼りついたタイミングから、ナビゲーションだけがその位置に固定される。

CSS を position:fixed に変えているわけだが、これは画面スクロールに合わせて行っている。


スクロールのタイミングに合わせてバグが出る、というのは、この一連のプログラムと関係があるのかもしれない。

そこで、Javascript の該当プログラムを動かないようにしてみる。


…それでもバグは出た。




サイトはすでに古いものだし、Wordpress で構築されている。

他にも無数の Javascript プログラムが動いている。


このどこかでおかしくなっているのかもしれないし、全く違うバグかもしれない。


いろいろとプログラムや CSS など、外部から読み込むプログラムを外しては、リロードしてみる。

この最中、不思議なことに気が付いた。


ある程度スクロールを進めた状態でリロードを行うと、まず画面のトップ位置が表示され、続いてリロード前の位置にジャンプし、さらにまたトップ位置に戻される。


…普通は、直前まで読み進めた位置にジャンプして終わりのはずだ。最後の「トップ位置に戻る」が余計だ。


何度かリロードして観察して、このタイミングは、画面上の全要素を配置し終わったタイミング、いわゆる「window.load」だ、と見きわめた。

Javascript で何か処理が行われている可能性が高い。



無数の Javascript ファイルのどこで処理が行われているのかわからないが、ステップ実行を延々と…10分以上も繰り返して、やっと最後の「おかしな動作」をするタイミングを見極めた。


ウィンドウのロード、リサイズ時に、document.body.scrollTop を調べ 0 ならば window.scrollTo(0,1) する、というプログラムがあった。




このプログラム、5年くらい WEB サイト構築をしている人なら何かわかるだろう。


5年ほど前に、「ページを開いた瞬間から、アドレスバーが消えて画面が広く読みやすい」という WEB デザインが流行したことがある。


アドレスバーは、下にスクロールすれば消える。これを Javascript で実現するのが、上のプログラムだ。

ロード・リサイズ時に画面の一番上を表示していたら…つまり、ページ読み込み直後なら、1ドットだけ下にずらしてやる。

すると、アドレスバーが消えた。


しかし、アドレスバーが消えると表示中のサイトの URL もわからなくなるわけで、フィッシング詐欺には好都合だった。

他のサイトと同じような動作なら疑問に思う人もいない。そういう詐欺サイトが横行した。


これをうけて、スマホのブラウザでは、人が操作しない、Javascript でのスクロールはアドレスバーに影響を与えないようになった。



つまり、先のプログラムは今となっては無意味だ。

無意味だけど、やっぱり読み込み直後には1ドットスクロールする。

それ以外は何もせず、無害なプログラム、のはずだった。




スクロール位置は、古くは document.body.scrollTop で調べられた。

しかし、body 要素は「ドキュメントの表示部分」を意味する。それに対し、スクロール位置というのは、表示ウィンドウの問題とか、もっと別の次元のものだ。


この論理的なおかしさをただすため、document.documentElement.scrollTop でスクロール位置を調べる、という方法が標準化された。


Chrome の元となっていた webkit にもこの変更は反映された。

だけど、コンパイル時のオプション設定により、新しい「標準モード」と、古い「互換モード」を、切り替えられるようになっていた。


Chrome では過去との互換性のため、body.scrollTop が使い続けられていた。

しかし、9月頭にアップデートされた Chrome で、body.scrollTop から documentElement.scrollTop に切り替えられたらしい


こちらにgitログがある。

 …が、超巨大なページの上、技術者でないと意味が分からないので、特に興味が無ければ読まないのがお勧め。

 で、このログで scrollTopLeftInterop を検索すると、default が Enable され、WebView が Disable されているのがわかる)



これは、「いつか行う、と予定されていた変更」が実行されたに過ぎない。


すでに documentElement を使用していたブラウザもあるし、「ブラウザを調べて」ではなく、「環境を調べて」動作を変えるプログラムを作っておかなくてはならなかった。


そのための期間も十分に与えられていたにもかかわらず、動作がおかしくなったサイトがあったとすれば、そのサイトに潜在バグがあったと言わざるを得ないだろう。


これは Chrome のバグなどではなく、もちろん今後のアップデートで修正されるものでもない。




上に書いたのはデスクトップ版の話で、同じ変更が9月下旬に Android 版 Chrome に入った。


今後、body.scrollTop は、実際のスクロール位置を反映せず、常に 0 となる。



これが、2012 年ごろに流行った「アドレスバーを消す」ための Javascript と、非常に相性が悪い。


画面ロード時・リサイズ時には、本来「現在のスクロール位置が 0 なら」、scrollTo(0,1) でアドレスバーを消していた。

これが、現在のスクロール位置に関わらず、いつでも scrollTo(0,1) で、ページトップに戻ることになる。


いや、これでもまだ、PC 版で同じプログラムが動いていたとしてもあまり害をなさない。

ロード時に動くのは問題ないし、ページ中でのウィンドウリサイズも、それほど行わないからだ。



スマホだと、スクロールしただけで、アドレスバーが表示・消去される。

アドレスバーを消す理由は、コンテンツの表示領域を広げるためだ。


このため、Chrome ではスクロールしただけでリサイズイベントが発行されることがある。

どうも、このイベントの発行は、Scroll イベントが置き続けている時は避けて、Idle 状態になった時に行われるようだ。



これで、最初に書いたバグの条件がすべて整った。


スクロールに伴い、アドレスバーの表示・非表示が切り替わると、その後最初に Idle 状態になったタイミングで、現在のスクロール位置に関わらず、画面トップに戻される。




原因が理解できれば、修正も簡単。

幸いなことに、「1ドットスクロールさせる」というプログラムは、2012年頃には意味のあるものだったが、今では全く意味をなさない。

このプログラム自体を消してしまおう。


これで正常な動作に戻った。



今回の仕事ではこれで終わりだったが、「スクロール位置を変更したい」場合の動作も変わっているらしい。


jquery 的表現だと、今まで Chrome は $('body').scrollTop(y) などでスクロール位置を指定できた。

これを、$('html').scrollTop(y) にする必要がある。


…FireFox では、html に指定しなくてはならなかったので、$('html,body').scrollTop(y) としているサイトも多いかもしれない。

この場合、特に問題は出ず、今まで通り動き続ける。


機種判別して使い分けていた場合は、修正が必要だ。


▲目次へ ⇒この記事のURL

別年同日の日記

01年 10/27

02年 妹主演の劇を見る

04年 枝豆

11年 太陽電池

16年 ダイナマイト刑事


申し訳ありませんが、現在意見投稿をできない状態にしています

P10 に乗り換え  2017-10-23 15:40:13  コンピュータ 歯車

▲目次へ ⇒この記事のURL

P10ってわかりにくい商品名だな。Huawei P10。いわゆるスマートホンだ。


今まで使っていた Honor6 Plus と同じ会社の、比較的最新の上位機種に当たる。

買い替えになるのだけど、Honor6 Plus に不満があったわけではない。




Honor6 Plus を購入したのは2年近く前。妻も一緒にスマホを購入した。

妻のスマホは Zenfon2 Laser 。


購入時点でのネットでの評価は悪くなかったし、値段の割に性能が良くて当時のベストセラー機種の一つなのだけど、その後評価が落ちた機種でもある。

Pokemon Go がブームになった時に、この機種ではうまく遊べなかったから。


Zenfon2 Laser は GPS のアンテナが弱く、位置データ取得が怪しい。

どうも「GPS を ON にしてから最初の位置測定」までが時間がかかるようで、バックグラウンドで常に GPS 測定をしているとそれなりに正しい位置を測定してくれる。

でも、それだと無茶苦茶電池を食う。


Pokemon Go を快適に遊ぶための電子ガジェット「Pokemon Go Plus」も公式に対応しておらず、実際うまく接続できない。

もう1年以上前、発売したばかりで入手困難な時期に購入したにもかかわらず、1度も使えていないまま。



さらに加えて、Zenfon2 Laser はカメラ性能が低い。

「レーザー測位するから暗がりでもピント合わせが速く、良い写真が撮れる」というのが名前の由来の機種だけど、肝心のカメラが暗がりに弱く、明るくても写真写りが悪い。



そんなわけで、我慢して使っていたのだけど、半年くらい前から買い替えを検討していた。




上のような理由なので、できることなら Go Plus が動く機種がいい。

でも、これが非常に難しい。


Go Plus は、Android での動作が壊滅的だ。

動く機種もあるのだけど、動かない機種が多い。動作報告されている機種でも、動かないという報告もある。


これに対し、iPhone は安定して動く…とされていた。iOS 11 が出るまでは。

先日 iOS 11 が出てからは、動かなくなったという報告が相次いでいるのだ。


…えーとつまり、iPhone を買っても Android を買っても、Go Plus を使うのはギャンブルだということになる。


ずっと妻は悩んでいたが、本格的に「思い切って買い換えようと思う」と相談を受けたのが1か月ほど前。

調べてみると、Android なら「最近の」Huawei 系の端末は動作しやすい、とわかる。


僕が使っている Honor 6 Plus は最近の機種ではないのでダメだ。



Go Plus の動作がギャンブルなら、それ以外の観点で選ぼう。

カメラ性能にも不満があるのだから、せめてカメラが満足いきそうな機種を選んだらどうだろう。


こうやって調べていた中で、Honor 9 の発売のニュースを知った。




Honor 9 の性能を調べるうち、これが P10 の廉価版に当たる。ということも分かった。

P10 を調べると、カメラ性能が少し上で、値段も少し高い。


カメラ性能が満足できるものを買おう、と考えていたので、少し高くても P10 にすると決定。



…で、購入決定の翌日には届いたのだけど、結論から言えば Go Plus は使えなかった。


多くの動作報告があるのになぜ? と思ったが、調べると動かないという報告もあった。

さらに調べると、他の機種での報告なのだけど、「発売してすぐに買った Go Plus はつながらなかったけど、最近買ったのはつながった」という報告を発見。


つまり、Go Plus にはバージョン違いがあり、初期バージョンはとにかく接続性が悪いらしい。



じゃぁ、Go Plus 買い直せばよかったんや!

と調べてみるが、どうも生産を停止しているようだ。売っているのは転売屋ばかり。


…これはあれだな。あまりにも「不良品」というクレームが多いので、設計直すことにしたかなにかで生産停止しているんだな。



ちなみに、Go Plus は「たとえ初期不良でも修理・交換に応じない」と最初から明言して販売している、という不思議な販売方法を取っている。

多分、発売前から何らかの不良品であることを、発売側が認識していたのではないかと思う。


#解析したわけではないので正確なことは言えないが、おそらく Bluetooth の標準的な規格に沿っていない。

 iPhone しか繋がらなかったのは、iPhone のバグか何かに由来した接続方法をしていて、iOS 11 になって繋がらなくなった、というのはそのバグが修正されたためではないかと思う。

 Android で接続できる機種・できない機種があったのは、同じようなバグを抱えていたかどうかによるのだろう。

 (Huawei は、あるころのアップデートで Go Plus が動作するようになったので、わざわざバグを再現したのかもしれない。

  また、同じバグを持った機種が偶然でそれほど多いとも思わないので、どこかのチップメーカーが提供した標準デバイスドライバがバグ含みで、そのチップを使った機種を中心にバグがあった…と想像)




とりあえず仕方がないから P10 を使おう、それでも、Zenfone2 Laser よりは GPS 感度良いのだし…と決めた翌日、妻の方から提案があった。


僕が P10 を使うことにして、中古の honor 6 plus を譲ってくれないか。



僕としては最新機種を使わせてもらうのはありがたい。

特にガジェット好きではないし、honor 6 plus に不満はなかったのだけど。


妻が Go Plus を使いたい一番の理由は、手の小さな妻では、スマホを持ちながら走り回っていると、良く落としてしまうからだった。

Go Plus があれば、スマホはカバンなどの中に入れたままでゲームの操作ができる。


ここで、Go Plus が使えないまま P10 を使うと、折角の新しい端末を落としまくってしまい、もったいないことになりそうだ、という懸念。

それなら、中古機種を最初から使っていたほうが、落としたとしても気が楽だそうだ。



と、説明が長かったが、そんな経緯で急に P10 を使うことになった。




Honor 6 Plus は micro SIM だったが、P10 は nano SIM 。なので、SIM 交換が必要だった。

ちなみに、Zenfone2 Laser は micro SIM なので、妻はそのまま乗り換えられる。


新しい SIM を待ちながら、P10 に乗り換えの準備。

同じ会社の上位機種なので、使い勝手はほとんど変わらない。特に戸惑いもなく移行できた。


Huawei は、iPhone を強く意識して端末を作っている。Android としてはかなり使い勝手を改造していて、Androidに慣れた人が使うと戸惑うだろう。

しかし、iPhone から Android に乗り換える際には良い端末だと言える。


そして、この改造のついでに、普通の Android では使えない「ちょっとした機能」をたくさん搭載している。

機能が多すぎて、設定するのが大変ではあるのだけど、何も設定しなければ普通の Android と同じように動くので気にしないでもいい。


たとえば、登録されている WiFi 局がないときは、WiFi を OFF にしてしまい、時々確認のために ON にする、という機能がある。

これにより、電池の持ちをよくできる。僕は以前、この動作を Llama でプログラムしていたのだけど、P10 は OS で持っている。


例えば、画面ロック…画面が消えて、パスワードなどの認証が必要な画面に戻る際に、アプリを「閉じて」しまう機能がある。

アプリごとに ON / OFF を設定できるのだけど、使っていない時は閉じてしまえば、動作しなくなるので電池の持ちをよくできる。

僕は以前、この動作を Llama でプログラムしていたのだけど、P10 は OS で持っている。


例えば、アプリごとの通信許可。本来通信が必要ないアプリで、広告を出すためだけに通信するのを「許可しない」ことができる。

僕は以前、この動作を Llama でプログラムしていたのだけど(以下略)



まぁ、こんな調子で、今まで Llama を使って実現していた「ちょっと便利な使い方」を、ほとんど OS レベルで持ってしまっている。

とりあえず Llama は入れたのだけど、今のところ何も動作していない。

(これから使っているうちに、必要だと思ったらプログラムを組むのだけど)


まぁ、Llama は作者さんが「最近の Android では役割を終えた」と感じたようで、メンテナンスが止まったままだ。

僕としても、そろそろ使うのをやめるべきかと思っている。




全然 P10 のレポートらしいこと書いてないな…

でも、本当に honor 6 plus とあまり変わらない、という実感。


・上に挙げたように、細かな使い勝手の良さは上がっている。

・CPU が良くなったので、軽快な動作感になっている。

・指紋認証は素晴らしい。ポケットからつまみ出そうとしただけで指が触れる位置にあるので、出したときには使えるようになっている。逆に言うと電源を切ってポケットに入れるときにも起動することがある。

・カメラは、少し暗がりに強くなった。これはレンズの良さによるのだろう。でも、honor6 plus も結構カメラ性能良かったので、ライカすげー、というような感覚はない。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

歯車

関連ページ

0sim【日記 17/12/13】

P10 plus に乗り換え【日記 17/12/18】

P10 plus に乗り換え【日記 17/12/18】

別年同日の日記

03年 当たりました

15年 古くて非力なマシンをLinuxBeanで再生してみた

15年 マイケル・クライトン 誕生日(1942)


申し訳ありませんが、現在意見投稿をできない状態にしています

続・ヒューマンリソースマシーン  2017-09-16 17:00:13  コンピュータ

▲目次へ ⇒この記事のURL

先日の続き。


Switch のヒューマン・リソース・マシーンで遊んでみた。

アセンブラで、課題のプログラムを作るゲーム。


購入して3日で全問題を「とりあえず」解き終わった。


1日目は2時間半くらい遊んでしまったけど、翌日、翌々日は1時間程度しかやってない。

5時間弱で全部解けた、ということになるのかな。その程度のボリューム。


#夜子供が寝た後にゲームをしている。

 妻もスプラトゥーン2を遊びたいので、1時間程度で交代する約束。


5時間というのは僕がアセンブラ経験があるからで、プログラム経験があってもアセンブラ経験がない人は、もう少し時間がかかるだろう。

世間的には、エンディングまで6~8時間程度、ということになっているようだ。


エンディングは、2日目に見ている。

最後の問題はソートアルゴリズムだったのだけど、1回目の正答でコードサイズ・速度共に規定をクリアした。

ささやかながら自慢。




中学生の長男が興味を持ち、遊び始めた。


Scratch はやっているから、プログラムをすることには抵抗がないようだ。


命令が少なすぎて、パズル的に面白いと感じているようだ。

これが「アセンブラ」と呼ばれるもので、コンピューターは本来この程度の命令で動いているのだ、と教えた。


#まぁ、前回も書いたがヒューマン・リソース・マシーンでのアセンブラは、1960年代のコンピューターのようだ。

 命令が少なすぎ、サブルーチンも作れない。現代のアセンブラはもっと多くの命令を使える。

 しかし、この程度が「基本」だということは変わらない。


ついでに、ファミコン時代のゲームはアセンブラで作られ、CPU 速度も遅かったので、コードサイズや実行速度を気にしなくてはならなかったことも話す。


この程度の命令でゲームを作る、というのは想像もつかないようだが、少し興味はあるようだ。




さて、ヒューマン・リソース・マシーンは、1つの課題を解き終えると次の課題に進めるようになっている。

でも、時々分岐がある。エンディングに向かって進むルートと、行き止まりだけど上級者課題に挑むルート。


エンディングを見た時点で、最後の分岐の上級者課題の最後の問題を解いていなかった。

この課題、ステージの最初に「難しいからやらなくていいよ」って言われる。

だから後回しにして、先にエンディングを見た。


3日目にこの課題に挑む。


与えられた数値を素因数分解する。


割り算は使えないし、当然「素数列」のデータもない。

基本的にメモリ同士の足し算引き算と、+1 、-1 のみ。


データをあらかじめ持たせる、なんてこともできず、使える数値は 0 だけ。

条件分岐も、数値が 0 の時と、負の時の2種類のみ。



とりあえずクリアはしたが、コードサイズ・速度とも規定に達していない。

今考えると、大きな無駄があったことに気付いているが、まだ改良に手を付けていない。


#配列が使えるもので、つい「答えをいったん配列に入れる」プログラムにしてしまった。

 求められているのは、答えを出力することなので、配列に入れずに直接出力するだけでも、速度・コードサイズ共に大きく改善する。



素因数分解をまだ改良していないのは、途中の課題にもまだ速度・コードサイズが規定に達していないものがあるから。


途中までは一発で両方を満たすプログラムを作っていた。

途中からは課題が難しくなってくるので、まずはクリアしてから改良。

さらに進むと、両者を同時に満たすプログラムは作れなくなるので、個別にクリアしていく。


でも、いくつかの課題はその時に改良が思いつかず、残されたままになっている。

それを、初期の課題から順に少しづつクリアして行っている。


素因数分解の改良は最後の楽しみだ。


といっても、とりあえず全部の問題を終了はしたし、ゆっくりやっていく予定。


#スプラトゥーン2も遊びたい。ゼルダもまだ終わらせてない。

 最初に書いたけど、毎日1時間程度しかゲームで遊ぶ時間ないので、今はスプラを中心に遊んでいる感じ。



▲目次へ ⇒この記事のURL

別年同日の日記

06年 成長記録

16年 トヨタとセガとドリームキャスト


申し訳ありませんが、現在意見投稿をできない状態にしています

ヒューマン・リソース・マシーン  2017-09-12 17:28:45  コンピュータ

▲目次へ ⇒この記事のURL

Switch 購入時から遊んでみたかったゲームなのだけど、やっと購入して遊んでみた。

僕の周囲では評判の良いゲーム。


これがまぁ、変わったゲームではある。



課題を出されるのでアセンブラでプログラムを作る、というゲームだ。


…ゲームなのか? まぁ、楽しいのだけど、人を選ぶのは間違いない。




表面上は、小さな人がチョコマカと動き回ったりして、ゲームらしくなっている。

でも、これはあくまでも飾り。ゲームの本質はそこではない。


ゲーム内容的には純粋にプログラムをするだけだし、そのプログラムも「入力データを8倍して出力せよ」とか、「0 を区切りとする入力データ列の合計を出力せよ」とか、いかにもプログラム演習っぽい物。


使用言語はアセンブラ。それも、1950年代くらいの、飛び切り古いアセンブラだと思っていい。


アキュムレータ(レジスタ)は1つだけ。

条件分岐は「0」と「負」しかない。

メモリはあるけど、配列として使えない。

スタックなんてないからサブルーチンも呼び出せない。


いや、1950年代の計算機は、「計算機」なので掛け算や割り算の機能を持っている。

でも、このゲームではそれすらない。足し算引き算だけ。


ちなみに「直値」という概念もない。扱えるデータは、すべてあらかじめメモリに入っているもののみ。



#翌日追記

 途中のステージから命令が追加され、間接アドレッシングでメモリを配列として使えるようになりました。

 後の部分で書いてあるのだけど、この文章書いた時点で最後までゲームを終わらせていなかったための勘違い。

 もっとも、序盤のステージでは配列を使いたくても使えない、というのは事実。



しかし、この厳しすぎる制約の中でプログラムをする、というのが、適度に頭を使う心地よいものなのだ。

プログラムをするゲームというよりは、ちょっと複雑なパズルゲームだと言って良いだろう。


「A ÷ B の余りを求めよ」と言われたら、普通のプログラム言語なら1行で終わってしまう。

でも、こんなに制約が多いアセンブラだと、ちょっと工夫しないといけない。

そもそも割り算命令なんてないのだ。割り算って何だっけ? ってところから考える必要がある。



ゲーム的には、入力に対して正しい出力が得られれば「成功」となる。

各ステージは「成功」すれば次に進めるのだけど、さらに「十分小さいプログラム」と「十分速いプログラム」を作れたか、ということも評価される。


これがまた、アセンブラでゲームを作っているようで楽しい。




ゲームとしては、入力されるデータは毎回変わる。

そのため、入力を「決め打ち」して高速化するような姑息な手段はとれない。


その一方で、データはランダムに決められているわけではなく、非常に巧妙に作られている。


「0区切りデータの合計」であれば、あえてデータがない「nullデータ列」が入っていたりする。

データが無いから合計は 0 なのだけど、ちゃんとプログラムを組んでいないとおかしな出力を出してしまい「失敗」となる。



デバッグもプログラムの楽しさだと思うのだけど、わざとバグが出やすい課題とデータを用意してあるのだ。



昨日ダウンロードして遊び始めたところなので、まだ全部は遊んでいない。

昨日は、たった3つのデータをソートするプログラムで頭を悩まし、一端プレイを終了した。


ソートプログラムって、配列を前提に考えてしまうもので、配列がない環境でのアルゴリズムが思いつかなかった。

その後もお風呂に入りながら考えたり、家事をしながら考えたりして、「今晩試してみよう」というアルゴリズムは思いついている。


ゲームを離れている時間まで考え続けてしまうのだから、ゲームとしてはかなり成功していると思う。




僭越ながら、僕も過去に Z80 vs 6502 というページを作ったことがある。

Z80 と 6502 で、よくあるプログラムを「課題」として、高速なプログラムを作る競争で、結構盛り上がった。


もっとも、最初から競争を意図していたのではない。

僕がプログラムを作って公開したら、多くの人が改良案を送ってきてくれたので競争になってしまっただけ。



でもね、多くの人が参加してくれたというのは、つまり、「アセンブラの最適化は楽しい」ってことに他ならない。


そんなの、プログラマの中でもほんの一部の上級者だけが理解できる楽しみだと思っていた。

でも、それを多くの人に届けようというのがこのゲーム。


プログラム経験があったほうがすぐに楽しめるとは思うけど、最初は簡単な課題からなので、経験が無くても理解できる。

よくわからない時は、ゲーム中で「上司」に相談すると、回答例を教えてくれる。


(プログラムの正解例ではなく、こんな入力があったら、こんな出力になればいい、と教えてくれる)


足し算だけで「40倍するプログラムを作れ」というのは、アセンブラ経験者じゃないと悩むかもしれない。


同じものを足せば2倍になる。2回繰り返せば4倍になるし、3回繰り返せば8倍になる。

また、4倍になったものに元のデータを加えれば5倍になる。


8倍と5倍が作れるのだから、8*5で40倍も作り出せる。



フィボナッチ数列を作れ、に至っては、言っていることもわからないかもしれない。

一応簡単な説明はゲーム中にあるのだけど、フィボナッチ数列とは何か、と調べることも面白いだろう。


プログラムを組むって、対象を理解することだから。ゲームとはいえ、ゲーム機の前を離れて調査することも楽しみのうち。




おまけ的な要素だけど、このゲームは「ブラック企業」が舞台になっている。


ちょこまかと画面上を動く小さな人は、CPU でいえば「アキュムレータ」だ。

データをどうにかする単純作業を、延々と繰り返す社畜。


課題は上司から出されるし、よくわからない時は上司に聞けばいい。

だけど、この上司の受け答えがまた、ブラック企業感を出している。


英語が元のゲームのはずなのに「忖度」とか「プレミアムフライデー」とか、時事ネタもたくさん入っている。

この会話がいちいち面白い。


さらに、時々ストーリー進行があり、企業の外ではなにかとんでもないことが起きている、とわかってくる。

ブラック企業過ぎて、主人公は何年も本社ビルから外に出ていないようなのだ。

だから、外の世界がどうなっていても、会社で楽しく働いていられる。



「グーの惑星」を作った会社なのだけど、あれも楽しかった。

(Wii 版が発売されてすぐに買って遊んだ)


あちらも、少し陰のある独特の世界観だった。

今作も同じような雰囲気。


まぁ、このセンスも、好き嫌いがはっきり分かれそうなところではあるのだけど。

いろいろな意味で、すごく面白いのだけど人を選びそうなゲームです。




▲目次へ ⇒この記事のURL

関連ページ

続・ヒューマンリソースマシーン【日記 17/09/16】

別年同日の日記

02年 あれから1年

08年 家族旅行2日目

14年 「テレビテニス」が出荷された日(1975)

15年 レイ・ドルビー博士 命日(2013)


申し訳ありませんが、現在意見投稿をできない状態にしています

スプラトゥーン2 その後  2017-08-08 11:36:45  コンピュータ 家族

▲目次へ ⇒この記事のURL

1度目のフェスも終わり、ある程度遊んでからの感想。

まぁ、まだ1ヵ月も遊んでいないわけで、「やり込んでいる」状態ではないのだけど。



フェスはルールがよくわからなかったので、「チーム分けして戦うのだろう」程度の気持ちで参加した。

そしたら、チーム分けの時点で得票率で勝敗があるのね。


「マヨネーズ vs ケチャップ」というお題だったので、日本人なら多くがマヨネーズを選ぶと判断した。

しかし、長女と次女がマヨを選んだので、同じでは面白くないと思ってケチャップを選んだ。


人数に偏りが出たらどうするのだろう…と思ったのだけど、勝敗数を競うのであれば「マッチングした」ことが前提になる。

マッチングできなければノーカウントなので、人数の偏りは問題ではないのだろう。


実際遊んでいると、マヨ vs マヨとか、ケチャ vs ケチャのような試合が始まることがあった。

勝敗集計としてはノーカウントだろうけど、遊べないより遊べた方が良いということか。


で、結果は得票率、ソロ戦、チーム戦の3つでそれぞれ勝敗が出され、2つ以上勝ったほうの勝ち。

じゃぁ、得票率の時点で予想を立てて勝つほうに乗ったほうが良いだろうと思うのだけど、ヨーロッパとアメリカでは共に、得票率はケチャップが多く、勝敗はソロ・チームともマヨが勝つ、という結果になっていた。


もっとも、勝敗部分はいずれも僅差。スプラ2のシステム上、勝敗は運に左右される部分が多いので、必然的に僅差になるだろう。

予想の利く得票率は重視したほうがよさそうだ。


#余談。

 マヨネーズって、数あるドレッシングの一つだと思う。それに対し、ケチャップは使用用途の広いソースの一つ。

 日本では、マヨネーズ会社の戦略もあり、バブル期に「マヨネーズ料理専門店」もできるほど流行し、ソースに格上げされた感がある。

 日本と海外で反応が違うのもその影響かと思っている。




遊んでいると経験値が入る。

勝つとボーナスもあるが、上に書いたように勝敗は時の運なので、このボーナスは平均半分、と考えてよいだろう。


すると、塗り面積が経験値を最も左右する。

塗りたくればいっぱい入る、というわけでもなくて上限も定まっているのだけど、そうなると結局経験値は「遊んだ回数」が最も重要になる。


そして、経験値によってランクが上がる。

ランクが上がると選べる武器(ゲーム中の表記では「ブキ」)が増えたり、遊べるモードが増える。



これ、ランクが上がったご褒美というより、慣れないうちはシンプルで判り易いゲーム、慣れると奥深いゲームになっていく、というデザインだ。


ランクが上がって使えるブキは、決して強いわけではない。

実は、一番最初に使える「わかばシューター」は非常にバランスがとれていて、後から使えるブキになるにしたがってバランスが崩れていく。


崩れていく、というのは使いにくいという意味でもあるのだけど、長所をうまく活かせば非常に強力だ。

そういう意味では「強いブキ」でもあるのだけど、実際ランクが高くても最初の頃に入手できるブキを使っている人もよく見かける。



僕は、多少戦えつつも、塗りやすいブキを使っている。

FPS はもともと苦手で、戦いたくないのだ。前線の後ろで細かな塗り残しを潰しているほうが楽しめる。


狙撃できるようなブキも存在する。敵側に狙撃手がいると、なかなか苦戦することもある。

でも、狙撃ブキは連射が効かない、塗りつぶしに適していない、などの弱点がある。


そして、このゲームは塗りつぶし面積で競うゲームだ。

狙撃手は怖いのだけど、実は狙撃手が多いチームは弱い。


このバランスが非常に面白いと思う。




先日の話。

夜子供が寝た後で遊んだら、そんな夜半に遊んでいるような人は「ガチ勢」ばかりだった。


僕は今ランク 15 なのだけど、僕以外で一番低いランクが 24。上は 35までいた。


「うわ、これはやられまくってつまらないゲームになりそうだ」とおもったら、そうではなかった。

敵味方含めて、全員が血気盛ん。一気に中央に登り、そこで前線が形成される。

やられた人も、すぐに前線に向かう。周囲を塗りつぶそうとする人はいない。


僕は、前線には登らずに自陣をせっせと塗りつぶした。チームは勝利し、塗りつぶし面積で評価されるチーム内の貢献者のトップに。


FPS でありながら、前線に行かずに逃げ続けている人が一番偉い、というのは面白いバランスだと思う。


ゲーム終了時に連戦すると、基本的に同じ顔触れでもう一戦となる。

誰も塗りつぶそうとしない不思議な試合を連戦、連勝してずいぶん稼がせてもらった。




ランクが上がると遊べる他のモードは「ガチバトル」と呼ばれる。

このモードでは、前線に行かないわけにいかない。


「シャチホコ」のようなものを奪い取り、相手陣地に運ぶ「ガチホコ」

乗ると相手側に向かって動き出す「ヤグラ」を奪い、これも相手陣地を目指す「ガチヤグラ」

ステージ中央付近の一定エリアの塗りつぶし・保守を狙う「ガチエリア」


の3種類がある。

いずれも、「全体の塗り潰し面積」というようなふんわりとした目標ではなく、明らかなターゲットが設定される。

これにより、全員がそこに向かい、戦闘が行われることになる。「ガチ」であるゆえんだ。



…先に書いた通り、僕は FPS が苦手なので、このモード遊んでいない。

でも、中1の長男が特にガチヤグラを気に入って遊んでいる。


というか、前回も書いたのだけど、長男のプレイがヘタレだ。

状況を理解しない行動をとりがちなので、普通の対戦をやっていてもなかなかチームの勝利に貢献できない。


ならば、目標物がわかりやすいガチバトルで…と思ってやっているようなのだけど、今度は目標物にばかり向かいすぎて、やはり周辺状況を理解しない。


ガチヤグラであれば、ヤグラに乗ったままでいると、周囲から狙われてすぐにやられてしまう。

自分が載っているならできるだけ「やられない」ようにすることが大切だし、載っていないなら周囲の敵を殲滅し、上の人を守るのが大切。


でも、長男のプレイは「がむしゃらに乗りに行く」ことが中心で、周囲を整えようとしない。

周囲を整えないといけない、と気づいたら、今度は進む道をあらかじめ塗ろうとしすぎて、敵側にヤグラを取られているのに奪回に向かおうとしない。




小4の長女のプレイは、相変わらず見ていて楽しい。


すっかり切り込み隊長だ。使用ブキは、比較的序盤から使えるスプラローラー。

ローラー系の武器は、塗りつぶしが目的で、戦闘に向いていない。にもかかわらず、敵をバッタバッタとなぎ倒す。


一度、敵陣の前に陣取り、やられて復活した敵を瞬殺、を繰り返したことがあった。

(スプラ2では、そういうプレイがしにくいようにデザインされているにもかかわらず!)


その間に見方が全体を塗りたくり、80% 近くを塗るという圧勝。相手側の人が気の毒になる。



長女は、ローラー系でも臆せず敵に突っ込み、なぎ倒す。

だけど、そもそも戦いに向いていないことは理解していて、ステージごとの「敵陣への侵入ルート」の研究を行っている。


通常通れないと思っている部分を、実はジャンプでギリギリ通れるとか、いや、ぎりぎり落ちるので、落ちる先の壁を軽く塗っておくことでよじ登れるとか、そういう無茶なルートで敵陣に侵入するのだ。


えー、そんなことできるの! って、見ていて驚く。



そして、敵陣をインクが切れるまで一気に塗りたくり、切れた瞬間に「スーパーチャクチ」作動。


これは、武器ごとに定められた「スーパーウェポン」で、一定の面積を塗るごとに使えるようになる。

スーパーチャクチをすると、周囲の一定範囲にインクを飛ばして塗ることができ、その範囲内にいる敵は即死する。


それだけでなく、これを使うと瞬時にインクが満タンになる。そして、また塗り進む。

もちろん、スーパーチャクチを、インク切れの前に敵の近くで作動させることもある。


敵にまわしたら怖い存在だ。



先日、長女にフレンド申請が来た。

一緒にプレイした人には、フレンド申請を送れるのね。ゲームの機能ではなく、OSの機能なので知らなかった。

フレンドになっておくと、一緒にチーム戦を行ったりできる。


長女は相手の名前を憶えていた。

同じように切り込んでいくタイプの人で、その人は塗るのには適さないけど戦闘に適したブキの使用者。

お互いの弱点を補うような形で、二人で敵陣を塗りたくって圧勝した、非常に楽しいゲームだったらしい。


メッセージのような機能はないので、子供でも安心。フレンド申請を受け付けておいた。




さて、最後に僕の話。


通常の対戦もやっているのだけど、ヒーローモードを非常に楽しく遊んでいる。

ヒーローモードは、ネットワークを使用しない、一人用のゲーム。


多くのサイトで「チュートリアル」だと書かれている。

まぁ、チュートリアルの側面があることは否定しない。


だけど、良く練り込まれていて、やり込み要素も多い。

チュートリアルというより、僕のように FPS 苦手な人でも楽しめるようにするための、サービスではないかと思う。



基本的には、ゴールを目指すだけのゲーム。時間制限はないけど、クリアタイムを競うようにはなっている。

各ステージに必ず「イリコニウム」と「ステッカー」が落ちているので、それを取得してあるかどうかも記録される。


ステージによっては、初プレイ時に「これを使え!」と、ブキを渡される。

一度はそのブキでクリアしないといけないのだけど、大抵そのステージは、そのブキの特性を活かしたものになっている。


そして、ステージには「どのブキでクリアしたか」も記録される。

コンプリートを目指すなら、すべてのブキでクリアしないといけない。


これが、ブキによっては先に進むのが非常に難しくなったりする。

一度クリアしているのでルートは知っているのだけど、ブキの違いで進み方を変える必要があるのだ。


遊ぶことでブキの特性を自然に覚えてしまう、という意味では、チュートリアルだろう。

でも、そこで使われる特性は、時には「対戦には全く使わない技術」だったりもする。


先に書いたようにチュートリアルというよりは、やり込みゲーとして作られているように思う。



ゼルダを楽しめている人なら、このモードは気に入るのではないかな。

僕は対戦に疲れたらこのモードで遊んでいる。


▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

家族

別年同日の日記

02年 …てなわけで

04年 マハラージ

07年 おもちゃ


申し訳ありませんが、現在意見投稿をできない状態にしています

スプラトゥーン2初感  2017-07-24 17:16:12  コンピュータ 家族

▲目次へ ⇒この記事のURL

先日もゼルダ雑感書いていたし、Switch漬けだな、と思いながら。


前作「スプラトゥーン」はやっていない。WiiU 持ってないから。

そもそも、僕は3Dの「撃ち合い」ゲームは好きではなく、今回のスプラ2も興味はあったが、購入直前まで迷っていた。


子供が興味を持って遊びたがっていて、発売前までどうするか悩んでいた。

中学生の長男なら十分遊べそうだけど、小学校2年生の次女には遊べないんじゃないかな、という気持ちもあったから。


購入に踏み切ったのは、ゲームは好きだが詳しくはない妻が、発売日の夜に「スプラトゥーンっていつ発売なの?」と聞いてきたから。

ツイッターで周辺の人がみんな話題にしていて、そろそろ発売なのかな、と気になったのだそうだ。



#注:「撃ち合いゲーム」を、以下 FPS と書く。

 First Person Shooting、「自分視点の撃ち合い」の意味で、自分が画面に表示されるスプラトゥーンは、厳密には FPS ではなく、TPS (Third Person Shooting) だ。

 しかし、TPS という用語は FPS ほど一般的でないので、TPS も含めて FPS と言われてしまうことが多い。




で、購入後15分ほど遊んでみる。

3試合して、この段階ではまだ「思ったよりも悪くない」程度の感想だったけど、そもそも妻の言葉で購入に踏み切ったので、妻に交代する。


その後妻のプレイを見ながら…自分でやっているのではないので、冷静に分析しながら、思った以上に初心者に優しいゲームだと知る。



翌日は土曜日。

子供に購入を伝え、夏休み入ったし、土曜日なので思いっきり遊ぶのを許可する。



普段は、ゲーム時間は1人1日1時間半程度に制限している。

というか、学校もあるし、3人で時間を分け合うと、その程度しか遊べない。


でも、この日は朝からゲーム三昧。30分~1時間程度で交代しつつ、1人3時間づつ遊んだ。




先日、ゼルダの話を書いたときに、「触っていても面白いゲーム」を作るのは難しい、と書いた。


ゼルダは、触っているだけで面白い。

戦うのが怖いなら、敵から逃げ続けていてもゲームが成立する。


森の中でリンゴや鳥の卵、キノコなどを拾い、それらを組み合わせて料理しているだけで面白いから。


いや、そんな目的すら不要だ。

緻密に描かれた美しい風景は、歩き回っているだけで世界を観光している気分にさせてくれる。


「ガノン征伐」なんて目的は、些細なことだ。目的なんて気にしないでいい。ただいじっているだけで面白いゲーム。

それがゼルダだった。



それに対して、スプラトゥーンは、対戦ゲームだ。

触っているだけ、というわけにはいかない。「戦うのが怖い」なんて言っていられないし、相手に勝つ、という目的を強要される。


にもかかわらず、目的を忘れて「触っているだけで面白い」状態を作り出している。



こんなこと、1からやっている人は今さらだろうけど、僕が感心したので細かく説明する。


普通、FPS は「敵を倒した数」を中心とした評価を競う。

でも、スプラトゥーンでは敵を倒すことは、評価に一切関係しない。

(後で書くけど利点はある)


敵を倒した数になると、経験が最大の武器となる。

ゲーム慣れして、冷静沈着に敵を倒せる人が強いし、長い時間遊んで強い武器を持っている人が強い。

一番良いのは、やられた人が復活するポイント付近で物陰に隠れて待ち構え、倒し続けることだ。


これ、初心者お断りのゲームだ。

もちろん、様々な評価軸で強さを算出し、同じくらいの強さの人同士をマッチングするようなシステムにより、皆が楽しく遊べるようにする。


それでも、ゲームに十分に慣れたうえで、あえてアカウントを作り直して1から始める、などで「俺だけが最強の世界」を楽しもうとする人がいる。

もちろん、ゲーム制作者側はあまりこのような行為をしてほしくない。


初心者が嫌な思いをすればプレイヤーが先細りになるし、ひいては続編もなく打ち切り、ということになりかねないからだ。

ゲームが好きで、ハマり込んでいる人が自らの好きな世界を壊す、という悲しい例だが、事実として存在する。



スプラトゥーンは、1の時点から、このような「FPS の問題点」を克服するべく作られていた。


評価の軸は「塗りつぶした面積」だ。

だから、敵がいたら逃げ回わる、という戦略が可能になる。


敵の目をかいくぐり、敵地に侵入し、すでに敵が塗った部分を自分の色に染め上げていく…

「撃ち合い」のゲームであるにもかかわらず、撃たない鬼ごっこが成立する。


これが、思った以上に幅の広い遊びになっていることに感心した。




まだ2日しか遊んでいないが、家族のプレイの様子を書いてみよう。

ゼルダの記事も読んでもらうと、家族の性格がよくわかるかもしれない。


まず中一の長男。一番遊んでみたがっていた。

ゼルダでは、敵との戦いを極度に恐れる傾向にあった。


スプラ2でも、ヘタレぶりは変わらず。

なんとか「敵に見つからずに生き延びる方法」を見つけようとして、物陰に隠れていたりする。

それでは、塗り面積を広げられない。


詳細は後で書くけど、塗った面積は個人評価につながり、評価を溜めることでより強い武器などを入手できる。

だから、思い切って「塗り」に出ようとすると、今度は無防備に敵に突っ込み、討ち死に。


頭は良いのだけど、判断力が悪い。

「敵の色を塗りつぶせば、相手の陣地も減るし、こちらの陣地は増えるから、2倍の効果!」

と言って、敵の陣地に切り込みたがる。当然討ち死に。



最初は全然チームに貢献できていない感じだった。

でもまぁ、遊び続ければ慣れるもので、500pt程度は確実に塗れるようになってきた。




小4の長女。

ゼルダでは、人の話を聞かず、地図も入手せず、度胸だけで世界を突き進んで探検し、見つけたものは手持ち資金で買いあさっていた。


スプラ2でも同じプレイスタイル。

ただ、こちらはストーリーなどないので、人の話なんて聞かないでいい。地図のような、ゲーム中に入手するアイテムもない。


だから、度胸で敵陣に突っ込んでいく、というプレイスタイルは、スプラ2に向いている。

もっとも、これで討ち死にしていたら無謀な馬鹿なのだけど、勝負勘が良くて、自分よりランクが高い相手でもバタバタとなぎ倒す。


広い面積を塗ろうとするよりも、敵陣深くに続く道を開拓しようとする。

なので、後についてきて援護してくれる人が出る場合があって、そんなときは本当に…相手チームが可哀そうになる試合展開となる。



はっきり言って、我が家で一番「横から見ていて楽しい」プレイスタイルだ。

ついたあだ名が「切り込み隊長」。


#小学校4年生だから、「切り込みってなに?」と、言われていることを理解していない。教えたけど。




小2の次女。

彼女は、ゼルダはやっていない。「敵と戦うのが怖い」というのが理由。


同じ理由で、スプラ2も最初は見ているだけだった。

でも、あまりに長男・長女が楽しそうに遊んでいるので、ちょっと遊んでみる、と手を出して…十分楽しんでいる。


戦うのが怖い小2女児でも、「対戦シューティング」を遊べるのだ。これってすごいことだと思う。


プレイスタイルは、前線での戦いを避けるもの。

みな前線に突き進むし、そういうゲームなのだけど、最後の「塗り面積のジャッジ」を見ていると、結構「塗り残し」が勝負を分けるのがわかる。


プレイフィールドは基本的に四角く、出撃地点は辺の中央あたりか、角。

そこから、中央に作られる(であろう)前線にまっしぐらに進むと、どうしても自陣近くの角に塗り残しが出やすい。


こうした部分を着実に塗っていく。

自陣近くは、大抵自分の側の色になっているが、たまに「切り込んできた」相手によって、まだらに色が違う。

そうした部分も、着実に塗り戻していく。


この戦略は僕が教えたものだけど、細かな部分をちまちま塗るのは、ゲーム慣れしていない子でも楽しいようだ。


残り1分程度になったら、その後の身の振り方を決める。


自分のチームが勝つと、勝利ボーナス点が全員に入る。

だから、勝ちそうならそのまま細かな部分の塗りつぶしを続行し、勝ちを確実にする。


負けると、ボーナス点は入らず、個々人の「塗りつぶしポイント」が入るだけ。

だから、負けそうなら前線に進んで、思い切ってポイントを稼ぐ。


なに、やられてもかまわない。

負けているということは、前線は自陣側に寄っている。やられても、すぐに前線に復帰できる。


それでいて、すでに自分側の色の部分をちまちまと塗っているより、敵側の色の中で適当にインクをばら撒いているほうが、「塗りつぶした面積」は多いのでポイントが稼げる。


目標は、500pt 稼ぐこと。

慣れないうちは 300pt とか、ひどいときは 100pt で終わっていたのだけど、次女も2日遊ぶ間に慣れ、500pt は確実にとれるようになった。




さて、遊ぶ人によって幅広い戦略が可能になる、とわかってもらったところで、細かなルールの説明を行っておこう。


Switch のゲームには説明書が付いてこないので、僕もよく理解できていない部分があるのだけど。


試合中は、塗った面積が「ポイント」として表示されている。

壁は塗ってもポイントにならない。ただ、壁を塗ると登ることができ、周囲にインクをばら撒きやすくなるので、無意味ではない。


何も塗られていないところに塗っても、敵の色のところに塗ってもポイントは同じ。

すでに自分側の色のところを塗っても、何ももらえない。



まず、塗った「ポイント」は、そのままゲーム内で武器などを買える通貨となる。

勝利すると、ボーナスで 1000 ポイント上乗せされる。


通貨とは別に、経験値があり、経験値によってランクが上がる。

塗ったポイントは、100 の単位ごとにもらえる。100,200,300,400,500 で、それ以上はない。


また、参加者全員に、3分遊んだことに対する報酬 300pt が、勝利したチームならさらに 600pt がもらえる。


他にもボーナスはあるのだけど、以上が基本。


これが、次女の遊び方の話に書いた、「勝てそうなら勝ちを確実にするように動き、負けそうなら 500pt を超えることを目指す」という理由だ。




話は脇にそれるがここで書いておこう。


3分遊んだ報酬は、おそらく「途中で通信を切断されないため」のものだと思う。

ゲーム作成者として、途中で通信切断されるのは困るから、ポイントをちらつかせて最後まで遊んでもらおうとしているのだろう。


でも、実はこれ目当てで、遊ぶ気がない人も参加してくる。

全く動かず(スタート地点に棒立ちはおかしいから、適当な物陰に潜んでいる)、最後の戦績表示画面を見ても、全く塗っていない。

チームとしては迷惑な話で、子供たちはそういう人がいることに怒っているようだ。



しかし、ゲーム制作者の端くれとして言わせてもらうなら、そうすることで得をするシステムになっているのだから、そのプレイヤーは悪くない。

ゲームの遊びかたはそれぞれだ。「まじめにやれ」なんて強要される覚えもない。


ただ、運営側は遠からず対策をするんじゃないかな。

全くやる気がない人には、参加賞の 300pt や、たまたまチームが勝利した際のボーナスなどを一切与えなければよい。


次女が初めて遊んだ際でも 100pt は塗れていたから、100pt ボーナスを取得しなくては、それ以外のボーナスももらえない、とかね。




相手チームが強いと…というか、組み合わせは時の運だし、必ずしも強い人がいるチームが強いわけでもない。

だから、「うまく歯車がかみ合うと」くらいのイメージなのだけど、前線が中央付近からずいぶんと偏ることがある。


こんな時は、さすがに勝ち負けがはっきりする。


だけど、前線は案外中央付近にでき、動きにくいものだ。


当然な話で、倒されたキャラクターはそれぞれの陣地のスタート地点から復活するし、そこから前線まで行かなくてはならない。

自陣に前線が近づけば、前線に早く到達できる。遠いと遅くなる。


ということは、自陣に近い前線は相手側に押し戻しやすいし、自陣から遠い前線は、押し戻されやすい。

結果として中央付近が前線になる。



このことを前提とすると、前線までの「自陣側」を、塗り残しなく、より緻密に塗ったほうの勝ちだ。

これが、次女に授けた「塗り残しを無くす」作戦となる。



しかし、チームの勝ちなんて関係なく、自分がポイントを…仮想通貨を稼ぎたいのであれば、思い切って敵陣に飛び込むといい。

自分側の色はほとんどないので、どこを塗ってもポイントになる。


戦うことは目的ではないので、敵のいないところを狙って大量に塗りつぶせば、一気に大量得点。

もちろん、敵陣に近いのですぐに塗り返されることになる。


戦いが目的ではないとはいえ、倒されると復活までに数秒間(状況により短縮もされるが、5秒程度)かかるし、陣地一番奥のスタート地点に戻される。


だから、相手側に前線を進めるために、相手を倒すことは決して無駄ではない。

戦いが得意な人は前線で戦いつつ、陣地を広げる。


苦手な人は相手に塗られてしまった部分を後方で「修復」したり、戦いを避けつつも相手陣地に忍び込んで塗ってみたり、やれることは結構ある。



戦いはあまり起こらず、お互いに相手陣地を塗るような混戦になることがあるのだけど、そういう時は終了時のポイントも総じて高い。

みんなが「塗り続ける」わけだからね。


負けたとしても、結構稼げたので良しとしようか、と思える。


長女が「切り込んでいく」と、そういう試合展開になりやすい。

ランクを上げる経験値に関しては、500pt で頭打ち。それ以上稼ぐ必要はない。


でも、通貨としては、稼いだだけもらえる。大量に塗ることにはそれなりの利点がある。

買い物を楽しみたい人には良い戦法。


#そして、長女はゼルダと同じく、武器や服を買いまくる。




僕や妻がどうしているかというと、実は子供に時間を奪われて、あまり遊べていない。


まぁ、それでも遊んではいるけどね。

僕は、最初は突き進んで前線形成に加担して、その後は倒されて戻るたびに、すこし寄り道して塗り残しを消しながら前線に向かう、というスタイル。


500pt を超えるまでは前線に進むことを優先しているけど、それ以降は自陣の塗り残しをできるだけなくす。

残り一分を過ぎたら、思い切って敵陣に切り込んでいく…と言う感じ。


でも、塗りやすい武器を中心に使っているので、戦闘力は低い。

敵陣に切り込んだ場合でも、戦いは避けて、あまり人が通らない裏通りを塗る感じかな。


#自陣と敵陣は対称形。普段から塗り残しを気にしているので、人が入りにくいエリアも把握している。

 人が入りにくいなら奪い返されにくいので、この戦略は結構効く。


▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

家族

関連ページ

年棒制【日記 18/07/18】

スプラトゥーン2 その後【日記 17/08/08】

別年同日の日記

15年 マイコプラズマ肺炎


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

10000

-- follow --




- Reverse Link -