分速計算機と解せぬ点

初めまして、ゆきし-です。

少し前自作の分速計算機を公開したところ炎上しました。
1週間考えた結果、何が起きていて何によって炎上したのか。
本記事では分速計算機をめぐって炎上した経緯とそれに対する自分の見解を興しています。内容上主張が自己擁護的です。
また煽りに捉えかねない文章など不快に感じる要素が多分にあります。
苦手な方はブラウザバックお願いします。

また多くを簡易的な説明に留めている為厳密性に欠けます。
全て自己責任でお願いします。

ブックマークレットとは何か

ブックマークレットという言葉に聞き馴染みが無い方も多いと思います。
何が起きたか理解するためにはこのブックマークレットへの理解が不可欠です。
従って、まずブックマークレットとは何かについて解説する事とします。

ブックマークレット (Bookmarklet) とは、ユーザーがウェブブラウザブックマークなどから起動し、なんらかの処理を行う簡易的なプログラムのことである。携帯電話のウェブブラウザで足りない機能を補ったり、ウェブアプリケーションの処理を起動する為に使われることが多い。

wikipedia「ブックマークレット」より

上記の通りブックマークレットとはブックマークに実行コードを直接埋め込む事により、クライアント側で容易に任意の処理を行えるようにする画期的な機能です。

ブラウザのURLを入力する部分は基本的にhttps://のようになってることが多く、この"https://"の部分をURLスキームと呼びブラウザにどのような挙動をさせるか指定しています。

例えば馴染み深いであろうhttps://~~~であれば"https"部分がURLスキームになり、[HyperText Transfer Protocol Secure]の頭文字を取ったhttpsというプロトコル(通信の決まり)で処理をせよ!…といった挙動をさせるよう指定しています。

httpsの他に馴染み深い例としてブラウザ設定系があげられます。
もしchromeを使っている場合chromeで設定へ行くとURL部分がchrome://settings/となっているのではないでしょうか?
これはchromeに設定を変更せよ!といった挙動をさせるよう指示しているのです。
他にもある程度グラブルを最適化しようとしている方ならiron等chromium系ブラウザでchrome://flagsを弄った事がある方も多いのでは無いでしょうか?

つまる所、ブックマークレットはhttpsの部分がjavascriptとなっており、ブラウザ側にjavascriptを実行せよと命じている訳です。

以下はそのjavascriptのサンプルコードです。
至極単純な物でアラートでHello worldと表示させるものです。

javascript:alert("Hello world");

上の説明通りならこれをアドレスバーに貼りつければ上記コードが実行され"Hello world"と表示されるはずですが、実際は何も実行されない場合が殆どだと思います。

その理由は幾つかあるのですが、主な理由としては悪意を持ったjavascriptコードが実行されれば容易にPCに攻撃を加えることが可能になってしまうからです。

ブラウザは通常サンドボックスとして実行され適切に対処すればPC内へのアクセスは不可能なはずですが、その様な知識を万人が持っている訳はなく結果的に重要な情報が抜き取られたり、マルウェアが侵入する恐れがあります。
その様な理由より多くのブラウザはURLで直接javascriptを実行出来ないようになっています。

以上を理解すればブックマークレットとは何者か自ずと推測することが出来ます。
ブックマークレットとはユーザーが能動的にブックマーク形式でjavascriptを保存することで悪意のないコードであることをユーザーが担保し、それを実行する仕組みなのです。

長くなりましたが、読み飛ばした方は以下2点
・ブックマークでjavascriptを記述出来、それをブックマークレットと呼ぶ
・リンクによるjavascriptの実行はブラウザ標準機能
を押さえておけば大丈夫です。

何故炎上したか?

自分が公開したブックマークレットは分速計算機と呼ばれるもので、あるボスに対して与えたダメージを分で割り分速を出すものでした。
分速という言葉に対し忌避感を持つ方も多いと思いますが、ここでは本題から外れる為分速の是非については取り上げません。

炎上した当初、何故炎上しているのか全く分かりませんでした。
しかし時間を経るにつれ何が起こっていたのか輪郭が明らかになって来たように思えます。

主に理由としては2点があった様に考えます。
・既に分速計算機のブックマークレットを作っていた先駆者がいた
・ツールを使用している事への忌避感

順々に見ていきます。

既に分速計算機のブックマークレットを作っていた先駆者がいた

らしいです。炎上後存在を初めて知りました。
恐らく剽窃だと思われたのでしょう。
不快に感じたのならこの場を以て謝罪します。
申し訳ございませんでした。

ただ、もしこの計算機について著作権を主張しようとしているならかなり弱い気がしています。

コードは通常著作物です。絵や音楽と同等で著作物は権利者に帰属します。
しかし著作物を定めている著作権法では次のように著作物を定義しています。

思想又は感情を創作的に表現したものであつて、文芸、学術、美術又は音楽の範囲に属するもの

著作権法第2条第1項第1号

特にこれ以上書く事は無いと思います。

ですが万が一分速計算機が著作物の範疇だと認められる可能性があった場合を考えます。
分速計算機の仕組みは至ってシンプルで、グラブルのリザルトから特定のセレクターで必要な要素を抜き出し、それを整形した物をアラートで表示すると言った具合です。

詳しく確認していきます。

グラブルはご存じの通りブラウザゲーです。ページは基本的にはHTML・CSS・JavaScriptの三要素で記述されており、どのような表示のページであってもこの3要素で基本的には記述可能です。

特にjavascriptは重要でページの個性を決定付けるのはjavascriptと言っても過言ではないでしょう。
このjavascriptの働きによりページ内で複雑な処理が出来るようになります。
ページを表示した状態でF12を押すと開発者ツールが起動し、ページの構成をDOMと呼ばれるツリー上の構成で見れます。

このDOMとは前述のjavascriptを動かすのに必要な構造で、この構造がある為javascriptはHTMLをオブジェクトとして操作することが可能になります。
そしてこのDOM構造にはページに表示されるほぼ全ての情報が記述されており、これらの構造を把握すればページ内のテキストから動作に至るまで凡その構造を把握する事が可能です。

となると分速計算機を作るにあたり必要なのは、リザルトに於ける討伐時間と与えたダメージの二項目です。
となれば実装は早く、これら二項目を特定する為に必要なセレクタを見つけ出し、二項目の値を取得し計算させれば容易に達成出来てしまうわけです。

主なフローとしては以下の通りです。
1.リザルトが記述されているクラスの行をループさせる。
2.ループ内で討伐時間とダメージが記述されているクラスを見つけ出し取得する
3.ダメージを討伐時間で割り、結果をアラートで表示する。
実際のコードはより複雑になりますが、大まかな動きはこの通りです。

分速計算をしようとしたら誰でもこのようなコードの作りになると思います。
そこまで複雑な機構では無いため、これに著作権が及ぶという発想に至らず炎上時はゆっくり解説を上げていたらゆっくり実況を商標登録してしまった人物から使用料請求が来たような気分でした。(法的種類は違いますが)
正直少しでもjavascriptを触ったことがある方なら1時間足らずで誰でも作成出来ると思います。

補足ですが著作物になるには、創作性が必要であり、誰がやっても同じ結果になるような実装や手順書レベルのものは、通常著作物と認められにくいです。
特に実用的なコードやアルゴリズムは、アイデアや手順に該当するため著作権では保護されないことが多いとされています(著作権法のアイデアと表現の二分論に基づく)。
今回のような単純な計算式やDOMからの要素取得と表示という処理は、表現上の創作性が認められにくいため、著作物とは見なされない可能性が相当高いです。

それに加え自分の計算機はダメージ割合にキャラ毎のダメージ割合、次の分速までのボーダー表示も実装しています。中身は通常の分速計算機と完全に別物と言って良いでしょう。

画像
実行図
下にも分析結果は続いています
それにしてもクリマキラのピヨピヨ12%は凄まじいですね…


炎上後、先駆者様のnoteも拝見しましたが、サンプル画像は分速部分のみの実装に留まっており、明らかに別物だと感じました。(残念ながらコード部分は悪用の為削除との旨の記載と共に削除されており、お目にかかれませんでした)

以上より自分の分速計算機は剽窃ではなく、れっきとした自作のコードという主張の根拠とさせて頂きます。

ツールを使用していることへの忌避感

ツールを使用している事への忌避感はあると思いますが、今回は感情的な部分の議論は置いておき、これが不正にあたるのかどうかを考えていきます。
まず不正とは何かについて考えていきます。
幾つかツールに対して運営が記述している文面を見つけました。

運営事務局(株式会社Cygames)が提供するプログラムツール以外の不正ツール(マクロ、チート等)を入手したり配布する行為、また作成や利用することは禁止しております。
不正ツールを使用することによりゲームサーバーへ負担をかけたり、チート(データの改ざん)を行うことで他のユーザーに不利益を与えることにもなります。
また、サービスの運営に支障をきたし、正常なサービス提供が行為。

違反行為に対する措置について 不正ツールの利用禁止

本サービスおよびこれに関連するデータ(権利表示を含みます)、サーバーまたはネットワークシステムに対し操作、改変、毀損、除去、不正にアクセスするなど支障を与える、または支障を与える可能性があると当社が判断した行為

利用規約第十二条 禁止事項(14)

本サービスに影響を与える外部ツール、BOTなど当社より提供されていない技術的手段、または改変を行った端末の利用・作成・頒布・販売などを行う行為、ならびにこれらを用いてサービスを不正に操作する行為

利用規約第十二条 禁止事項(16)

上記に共通している部分はツールではなく不正ツールと呼称している部分です。
何故ツールと直接記載しないのか疑問に思った方もいるでしょう。
これは自分の推測ですがツールと明記しない理由についてはツールという物に解釈の幅を持たせいが為と考えています。

ツールとは何でしょうか?
Wikipedeaは言葉の定義を求めるのに弱いと考え広辞苑を捲ろうとしましたが面倒が勝ったので検索して一番上に来たgoo辞書より引用します。

工具。工作機械。道具
コンピューターを効率良く利用したり、アプリケーションソフトの開発を支援したりするソフトウエアのこと。

goo辞書 ツールより

範囲が大きすぎます。

1番は物理的な道具だと仮定して、今回の対象から除外したとしても2番のソフトウェアが内包する可能性が多すぎるのです。

これは極論ですが、この定義に従えばPC周辺機器メーカーであるLogicoolやRAZER付属の製品補助ツールの機能がグラブルの快適性に寄与しているのならツール判定に当たります。
また、マウスにバックリロードや再読み込みなどキー設定をしている方も内部的にはボタンの押下と共にプログラムが発火している為ツールと看做されていてもおかしくありません。
PCやスマホはプログラムコードの塊ですから、そのプログラム上で動くゲームにはツールの定義が難しいのだと思います。

従って自分の推測としては、ツールではなく"不正"ツールとすることでゲームに好ましくない影響を与えるか否かを利用規約に適用したのだと考えます。

不正に関して、どのような部分が不正に当たるかは、幸いにも上の文面よりそれらしい記述があります。

1.ゲームサーバーへ負担をかけたり、チート(データの改ざん)を行うこと
2.データ、サーバーまたはネットワークシステムに対し操作、改変、毀損、除去、不正にアクセスするなど支障を与える
3.本サービスに影響を与える外部ツール、BOT

自分が考えるに分速計算機は上記のいずれにも違反していません。

1についてですが、ブックマークレットの実行はPC内でのみ完結しており、サーバーへの負荷はかけていませんし、勿論データの改竄は行っていません。

2についても同様で自分が行っている操作はゲーム上のUIで見れる情報を計算させ表示させる物で、コード上でしか見れない情報や本来知りえない情報などは一切アクセスしていませんし、ユーザーに見せる為のUIに表示させている情報にアクセスしている以上、不正なアクセスとは呼べないでしょう。

3についても同様一切影響を与えていません。
これらの数値は電卓を叩けばすぐ出てくる数値の為、手動で計算する手間を簡略化しているだけに過ぎず、出てきた数値も分速な為優位に働くような情報ではありません。
この情報によってグラブル内で優劣がつく可能性は限りなく低いでしょう。またもしこの計算・情報自体が望ましくないのであれば、分速計算機は愚かExcelや電卓を叩く行為すらも違法となりうる可能性があります。
もっとも多くの方にとって分速は限りなくどうでも良い情報だと思います。

上記の情報を整理すると不正ツールが何を指すかについても凡そ見当がつきます。
それを使用した者が使用してない者に比べて優位に立ってしまう。または
使用してない者が使用した者により劣位に立ってしまう
がその答えでしょう。

これは多くのBAN事例でも確認出来、BANされた者の多くが自動周回ツールやUIの表示を変更して見やすくするツール、敵のモーション中に攻撃出来てしまうツールなど、使用した者が使用してない者に比べ優位に立てるツールを使用しています。

このように演繹的にも帰納的にも今回の分速計算機が利用規約に違反していないと自分は考えています。

長々と述べてきましたが一番確実なのは運営に是非を問う事でしょう。
しかし自分は運営に問いたくありません。
答えが定まっているからです。

バックリロードが推奨外の挙動なのはご存じでしょうか?
以前リロードの不具合をお問い合わせをした所、以下のような文面が返ってきたグラブルユーザーがいました。

ご申告を受け再度確認を行っておりますが、お客様と同環境にて検証を行うことができかねるため、事象が再現できず原因の特典に至っておりません。
また、たいへん申し上げにくい内容となりますが、本件はお客様のご利用環境や推奨外操作に依存した事象にあると考えられます。
「リロード」た「ブラウザバック」といった推奨外操作を行った場合。正常に動作を行わない場合がございますため、お控えいただけると幸いでございます。

(特典は原文ママです)

バックリロードが推奨外の操作であるならば、ブックマークレットが推奨外の操作でお控え願われるのは火を見るよりも明らかでしょう。
分速計算機はクライアントで計算をしている以上、リロードに比べグラブルに負荷をかけていませんし、実行することでより優位に立つような行為でもありません。
リロードよりもグラブルに対する負担、影響共に軽いと言えます。

また分速計算機と似たような存在としてドロップ情報を集計してくれるGBFDropが存在します。
あちらも(推測ですが)原理的には似たような機構で動いており、実行で優位に立つ部分が無く、手計算の手間を省いてくれていると言う点で完成度に、月とスッポン、雲泥の差はあれど非常に近しい存在と感じています。
今回自分を批判して来た方の中には、これらを使いながら批判して来ている方も見受けられ我が目を疑いました。

バックリロードをしていない者だけが石を投げてください。

まとめ

長々と書いてきましたが、主張したい部分は
・自分のコードは剽窃ではない。
・分速計算機は不正ツールではない。
の2点のみです。

ブックマークレットはその特性上、書き手によってはチートや自動周回に近しい行為が出来ます。
それも手伝いブックマークレットは秘匿され、作れない者が作れる者を神聖視する、「ブックマークレットを作れるのは特定の者のみ」だと考える独占状態にあったのでしょう。
そのような思考が充満していたのであれば自分が作った物が剽窃の無断二次配布とすぐに決め付けられたのにも整合性が取れます。

ですが上述した通り分速計算機はそこまで複雑な処理はしていません。
自分が書いたのも4KB少々であり過去に作った100KB程度はあろう自作Modと比べても相当見劣りします。
もし何も考えず剽窃だと決め付けてしまった方は恐らくプログラムを触ったことが無いのだと思います。
そんな方は是非プログラミングを学んでみてください。初めてなら王道にC言語なんが良いです。
間違っても動的型付け言語は学ばない方が良いです。(JavaScriptは動的型付けですが…)
特にPythonは悲惨です。SOLID原則のDはDon’t use Pythonです。

またブックマークレットで自動周回に近しい行為が出来ると書きましたが、自分の知る限り自動周回やUI変更系など、使用した者が使用してない者に比べ優位に立ってしまう系の不正ツールは悉くBANされています。
決して作成しようとも思わない方がいいでしょう。

また自作ブックマークレットについてですが、このnoteを見ている方も多くは無いでしょうし、javascriptについて感情的な拒否反応が出てしまうのも理解はします。その為今後公開は控えようと思います。

最後となりますが、自作で新たにブックマークレットを作ってみました。
グラブルで根を詰めたい時に発火してください。爆破出来ます。

javascript:(function(){
if(document.getElementById("ms-wrapper")) return;

const R=9,C=9,M=10,map=[],btn=[],wrap=document.createElement('div');
let open=0,t=20,tm,txt,cd;

for(let i=0;i<R;i++){map[i]=Array(C).fill(0);btn[i]=[];}

Object.assign(wrap.style,{position:'fixed',top:'10px',left:'10px',background:'#fafafa',padding:'8px',border:'1px solid #aaa',zIndex:'9999',opacity:'0',transition:'opacity 2s'});
wrap.id='ms-wrapper';

const xbtn=document.createElement('button');
xbtn.innerText='×';
Object.assign(xbtn.style,{position:'absolute',top:'2px',right:'2px',background:'#b33',color:'#fff',border:'none',fontWeight:'bold',width:'24px',height:'24px',cursor:'pointer'});
xbtn.onclick=()=>wrap.remove();
wrap.appendChild(xbtn);

tm=document.createElement('div');
Object.assign(tm.style,{textAlign:'center',fontWeight:'bold',marginBottom:'4px'});
tm.textContent=`制限時間: ${t}秒`;
wrap.appendChild(tm);

txt=document.createElement('div');
Object.assign(txt.style,{textAlign:'center',color:'#b33',fontSize:'13px',marginBottom:'5px'});
wrap.appendChild(txt);

const g=document.createElement('div');
Object.assign(g.style,{display:'grid',gridTemplateColumns:`repeat(${C},26px)`,gap:'1px'});
wrap.appendChild(g);

document.body.appendChild(wrap);
setTimeout(()=>wrap.style.opacity='1',30);

let m=0;
while(m<M){
  const r=~~(Math.random()*R),c=~~(Math.random()*C);
  if(map[r][c]==='*')continue;
  map[r][c]='*'; m++;
  for(let i=-1;i<2;i++)for(let j=-1;j<2;j++){
    const y=r+i,x=c+j;
    if(y>=0&&x>=0&&y<R&&x<C&&map[y][x]!=='*')map[y][x]++;
  }
}

function o(r,c){
  const b=btn[r][c];
  if(b.disabled||b.textContent==='🚩')return;
  const v=map[r][c];
  b.disabled=true;
  b.textContent=v||'';
  open++;
  if(open===R*C-M){
    clearInterval(cd);
    txt.textContent='爆破失敗...';
    setTimeout(()=>wrap.remove(),3000);
  }
  if(!v){
    for(let i=-1;i<2;i++)for(let j=-1;j<2;j++){
      const y=r+i,x=c+j;
      if(y>=0&&x>=0&&y<R&&x<C)o(y,x);
    }
  }
}

for(let r=0;r<R;r++)for(let c=0;c<C;c++){
  const b=document.createElement('button');
  Object.assign(b.style,{width:'26px',height:'26px',padding:'0'});
  b.dataset.r=r; b.dataset.c=c;
  b.oncontextmenu=e=>{e.preventDefault(); if(!b.disabled)b.textContent=b.textContent==='🚩'?'':'🚩';};
  b.onclick=()=>{
    if(b.textContent==='🚩')return;
    const rr=+b.dataset.r,cc=+b.dataset.c;
    if(map[rr][cc]==='*'){
      b.textContent='💣';
      clearInterval(cd);
      txt.textContent='爆破成功!';
      setTimeout(()=>wrap.remove(),3000);
    }else o(rr,cc);
  };
  g.appendChild(b);
  btn[r][c]=b;
}

cd=setInterval(()=>{
  t--;
  if(t>=0){
    tm.textContent=`制限時間: ${t}秒`;
  }else{
    clearInterval(cd);
    if(wrap.parentElement){
      txt.textContent='タイムアップ!';
      setTimeout(()=>wrap.remove(),3000);
    }
  }
},1000);
})();


いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
分速計算機と解せぬ点|ゆきしー
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1