Stack Overflowを機械翻訳したサイトをChromeの検索結果から除外する

(発信内容は所属団体とは関係無く個人の見解です)

## Intro
[Stack Overflow](https://stackoverflow.com/)はSoftware Engineerにとって大変便利なサービスです。

私の利用ケースとしては、一次情報（ソースコード含む）を見ただけでは判断できない、が、この事象であれば既に他の誰かが何かしらtryして結果を知見として共有してくれているのでは、と思わせるような対象を調査する時などによく利用させていただいています。英語を学習している身でもあるので、基本的には英語のまま利用します。

最近、Stack Overflowを機械翻訳しただけに見えるサイトが[Yahoo! JAPAN](https://www.yahoo.co.jp/)や[Google](http://google.co.jp/)の検索結果に数多くhitするようになったように感じており、上述したようなモチベーションでStack Overflowを利用する私にとってそれらのサイトは不要なので、普段利用しているブラウザである[Google Chrome](https://www.google.com/intl/ja_jp/chrome/)の検索結果から除外する方法を調査してみました。

## How
`Intro`項目で述べた要件を満たすために下記2点を調査しました。

* Google Chromeの検索結果から該当サイトを除外する方法
  - 私はYahoo! JAPANとGoogleが提供する検索サービスを共に利用するので、どちらでも利用可能な方法、というのも要件の一つです
* Stack Overflowを機械翻訳しただけに見えるサイトを洗い出す


### Google Chromeの検索結果から該当サイトを除外する方法 
Yahoo! JAPAN / Google共に、除外したいドメインをdenylistのようなものに登録して設定として保存する、というような機能はなさそうでした :cry: 

拡張機能だと[uBlacklist](https://chrome.google.com/webstore/detail/ublacklist/pncfbmialoiaghdehhbnbhkkgmjanfhe?hl=ja)が多く利用されているようでdenylistのようなものも定義できそうでしたが、少し試してみたところ、こちらはブラウザの拡張機能という性質上、検索結果のDOMに干渉するのみで、1ページに表示される件数自体は減ってしまうような振る舞いに見えました。
それだとあまりうれしくないので、Yahoo! JAPANやGoogleが、常にdenylistとして伝えた情報を元に検索した結果を返してくれる方法がないかさらに調査したところ、
[Google Chromeの検索エンジン設定](https://support.google.com/chrome/answer/95426?co=GENIE.Platform%3DDesktop&hl=ja&oco=1)と[検索演算子(`-site:`)](https://support.google.com/websearch/answer/2466433?hl=ja)を使う方法を思いつきました。

[Google Chromeには検索エンジン設定](https://support.google.com/chrome/answer/95426?co=GENIE.Platform%3DDesktop&hl=ja&oco=1)という機能が存在します。
知っている方も多いと思うので詳細はlinkしたドキュメントを読んでいただければなのですが、ざっくり説明すると、

Chromeに下記のように登録しておけば、
(e.g. 私が英単語検索するため設定している[weblio](https://ejje.weblio.jp/)の場合)
![スクリーンショット 2020-12-29 23.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/b89c4d47-5a27-af36-f5c3-114b755a55b2.png)


Chromeの検索バーで{{指定したキーワード}} + tabと入力すると、直接、登録した検索サービスを利用することができる、というような機能です。
![スクリーンショット 2020-12-29 23.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/37ea85e7-ca67-651d-1d7f-998319e38e0c.png)



次に[検索演算子](https://support.google.com/websearch/answer/2466433?hl=ja)です。こちらも知っている方が多いと思うので、詳細はlinkしたドキュメントを読んでいただければなのですが、提供されている演算子(Google / Yahoo! JAPAN共通のはず、確か)を検索時に利用することで、特定のドメインに絞って検索したり(`site:`)、逆に特定のドメインを除外したり(`-site:`)できる機能です。

以上の調査結果から、これらの機能を組み合わせて、以下のようなURLを、Stack Overflowを機械翻訳しただけに見えるサイトを除外したい時に利用する検索エンジンとしてChromeに登録することで、私のモチベーションは満たせそうだと考えました。

```
https://search.yahoo.co.jp/search?p=%s -site:{{Stack Overflowを機械翻訳しただけに見えるサイト1}} -site:{{Stack Overflowを機械翻訳しただけに見えるサイト2}} -site:{{Stack Overflowを機械翻訳しただけに見えるサイト3}}
```



### Stack Overflowを機械翻訳しただけに見えるサイトを洗い出す
howは見つかったので`-site:`指定するためのサイトを洗い出していきます。

その方法は、Stack Overflowで人気のあるページを機械翻訳して、機械翻訳後のそのページのタイトルでYahoo! JAPAN / Googleで検索する、という愚直なものです。
結果、下記を洗い出すことが出来ました。

(一つ一つのサイトをそこまで詳細に見てはいないので、Stack Overflowを機械翻訳しただけではないサイトが含まれていたらすみません、、)
([アグスネット株式会社](aguse.jp)が提供する[aguse.jp](https://www.aguse.jp/)で確認したところ[Barracuda Reputation Block List (BRBL)](https://www.barracudacentral.org/rbl/)に登録されているドメインも存在したので、アクセスは自己責任で :pray:)

* qastack.jp
* www.it-swarm-ja.tech
* www.it-swarm.dev
* python5.com 
* projobs.tistory.com
* www.javaer101.com
* codehero.jp
* code-examples.net
* www.366service.com
* stackoverrun.com
* www.voidcc.com
* qa.codeflow.site
* code.i-harness.com
* www.nuomiphp.com
* stackovernet.xyz
* tutorialmore.com
* fooobar.com

あとはこれらを、Yahoo! JAPAN / Googleごとに`-site:`で指定したURLsを、Chromeの検索エンジン設定にて登録すればdoneです。

（私は、これらをprogrammingに関する調査をする際に利用する検索エンジンとしてそれぞれChromeに登録してみました）

### search.yahoo.co.jp

```
https://search.yahoo.co.jp/search?p=%s -site:qastack.jp -site:www.it-swarm-ja.tech -site:www.it-swarm.dev -site:python5.com -site:projobs.tistory.com -site:www.javaer101.com -site:codehero.jp -site:code-examples.net -site:www.366service.com -site:stackoverrun.com -site:www.voidcc.com -site:qa.codeflow.site -site:code.i-harness.com -site:www.nuomiphp.com -site:stackovernet.xyz -site:tutorialmore.com -site:fooobar.com
```

### google.co.jp

```
https://www.google.co.jp/search?q=%s -site:qastack.jp -site:www.it-swarm-ja.tech -site:www.it-swarm.dev -site:python5.com -site:projobs.tistory.com -site:www.javaer101.com -site:codehero.jp -site:code-examples.net -site:www.366service.com -site:stackoverrun.com -site:www.voidcc.com -site:qa.codeflow.site -site:code.i-harness.com -site:www.nuomiphp.com -site:stackovernet.xyz -site:tutorialmore.com -site:fooobar.com
```

### 気になる点
[検索演算子](https://support.google.com/websearch/answer/2466433?hl=ja)はいくつまで指定できるのでしょうか。 

Googleが[検索演算子](https://support.google.com/websearch/answer/2466433?hl=ja)について説明しているページにそのような記載はないので、HTTPのspecである[RFC2616](https://tools.ietf.org/html/rfc2616)を見てみると、

>   The HTTP protocol does not place any a priori limit on the length of
>   a URI. Servers MUST be able to handle the URI of any resource they
>   serve, and SHOULD be able to handle URIs of unbounded length if they
>   provide GET-based forms that could generate such URIs. A server
>   SHOULD return 414 (Request-URI Too Long) status if a URI is longer

>   than the server can handle (see section 10.4.15).
>     Note: Servers ought to be cautious about depending on URI lengths
>      above 255 bytes, because some older client or proxy
>      implementations might not properly support these lengths.

https://tools.ietf.org/html/rfc2616#section-3.2.1 より

URIのサイズに制限はありませんでした。よって、ブラウザやリクエスト先のサービスに依存しそうです。

やはりあまりに長いとダメそうなので`-site:`の数は増えすぎないように適宜メンテした方が良さそうです。


### Stack Overflowを機械翻訳しただけに見えるサイトの管理
ということで、適宜メンテするためのGitHubリポジトリを用意しました。
https://github.com/shikato/stackoverflow-translation-sites-for-chrome

リポジトリは下記3つのtxtで構成されています。

* [original.txt](https://github.com/shikato/stackoverflow-translation-sites-for-chrome/blob/main/original.txt)
  - 該当サイトをlistしただけ
* [search.yahoo.co.jp.txt](https://github.com/shikato/stackoverflow-translation-sites-for-chrome/blob/main/search.yahoo.co.jp.txt)
  - Chromeの検索エンジンとして登録する用 for `search.yahoo.co.jp`
  - [original.txt](https://github.com/shikato/stackoverflow-translation-sites-for-chrome/blob/main/original.txt)でlistされているサイトすべてが`-site:`指定されている
* [google.co.jp.txt](https://github.com/shikato/stackoverflow-translation-sites-for-chrome/blob/main/google.co.jp.txt)
  - Chromeの検索エンジンとして登録する用 for `google.co.jp`
  - [original.txt](https://github.com/shikato/stackoverflow-translation-sites-for-chrome/blob/main/original.txt)でlistされているサイトすべてが`-site:`指定されている

私と同じようなモチベーションを持つ方で、新たにStack Overflowを機械翻訳しただけに見えるサイトを見つけた時や、listされているサイトが無くなったことに気づいた時には、updateを要求するようなissueを立てる、もしくは、updateしてPRを送っていただけると嬉しいです :pray:



## Outro
Stack Overflowを機械翻訳しただけに見えるサイトに対して、私と同じようなモチベーションがある方は是非、本記事で紹介したhowを活用してみてください！

[こちらのリポジトリ](https://github.com/shikato/stackoverflow-translation-sites-for-chrome)へのPRも大歓迎です :pray: 

(この記事で紹介したhowは、この記事を書きながら調査して見つけたhowということもあり、まだほぼ実運用できていないステータスなので、何かしら見落としなどがあり、もしかしたら期待通りにworkしない可能性もあります。そのような時には、また追記させていただきます)



## Appendix
これでやりたいことを実現できそうな見込みは立ちましたが、まだ、いろいろと気になる点が残ったので、さらに調査してみました。

### Stack Overflowを機械翻訳しただけに見えるサイト運営者のモチベーション
これらのサイト運営者のモチベーションは何でしょうか。どのサイトも、そのサイトが何のために提供されているか、または、運営会社などの情報を全く掲載していないように見えるため、色々と想像が入っていますが、少し考えてみました。

#### 広告収益
どのサイトももれなく広告が掲載されているので、やはり広告掲載による収益がメインの可能性が高そうです。
Software Engineerしか利用しないようなサービスで広告収益が期待できるのだろうか、広告をクリックするユーザーは少ないのでは、というような考えがよぎるかもですが、広告の課金方式にはクリック以外に表示回数によって課金が発生するものもあり、例えば[Google 広告](https://ads.google.com/intl/ja_jp/home/)だと下記の四種類があります。

1. [クリック単価（CPC）](https://support.google.com/adsense/answer/32725)
1. [インプレッション単価（CPM）](https://support.google.com/adsense/answer/18196)
1. [アクティブ ビューのインプレッション単価（アクティブ ビューの CPM）](https://support.google.com/adsense/answer/3541685)
1. [エンゲージメント単価（CPE）](https://support.google.com/adsense/answer/4643299)

https://support.google.com/adsense/answer/1055545?hl=ja より

2や3だと、表示回数ベースでの課金となるので、PVさえ多ければある程度の収益は見込めそうです。
（[Google 広告の場合、1〜4の内、どの課金方式の広告を配信するかは、Google 広告側でターゲティングやオークション結果によって制御するようです（サイト運営者が制御するわけではない）](https://support.google.com/adsense/answer/160525)）


### 如何にして実現しているか
ではモチベーションが広告掲載による収益だとして、次はそれらのサイトの実現方法について調査してみます。

まずは、如何にしてStack Overflowのコンテンツ（と思われる）を利用しているか、ですが、[Stack Overflowは3rd party開発者向けにAPI](https://api.stackexchange.com/docs)を提供しているため、こちらを利用している可能性が高そうです。

次に、そのStack Overflow APIの利用規約に則って提供されているか、ですが、Stack Overflowおよび[Stack Exchange](https://stackexchange.com/)のコンテンツは基本的には[**CC BY-SA 4.0**](https://creativecommons.org/licenses/by-sa/4.0/)にてライセンスされ配布されています。

(もしかしたら今更な内容かもしれないのですが、私はこの調査をするまで知りませんでした)

* 参考
  * [What is the license for the content I post?
](https://stackoverflow.com/help/licensing) 
  * [Stack Exchange, Inc. API Terms of Use
](https://stackoverflow.com/legal/api-terms-of-use)
  * [Public Network Terms of Service](https://stackoverflow.com/legal/terms-of-service/)

なので、CC BY-SA 4.0にて公開されているStack Overflowのコンテンツに対して、下記のようなことを遵守できるのであれば、3rd party開発者が機械翻訳による改変などして再配布（公開）しても問題はなさそうです。

1. 何らかの方法で、そのコンテンツが Stack Overflow や Stack Exchange network から来たものであると視覚的に示してください。露骨に強調する必要はありません。短く簡単に書いてあれば良いです。
1. 元のサイトの元の質問に直接ハイパーリンクしてください
(例: http://ja.stackoverflow.com/questions/12345)。
1. それぞれの質問と回答で、著者の名前を示してください。
1. それぞれの著者の名前にハイパーリンクを張り、元のサイト上のユーザー・プロフィール・ページに直接リンクするようにしてください - (例: http://ja.stackoverflow.com/users/12345/username)。

[ "Attribution Required" (Jeff Atwood、2009年6月25日) の和訳](https://ja.meta.stackoverflow.com/questions/2940/%E8%A1%A8%E7%A4%BA%E3%81%8C%E5%BF%85%E8%A6%81-attribution-required)より

上記を踏まえて[リストアップしてみたサイト](https://github.com/shikato/stackoverflow-translation-sites-for-chrome/blob/main/original.txt)を見ると（アクセスは自己責任で :pray:）、ほとんどのサイトが上記条件を満たしていそうに見えます。（満たしていないサイトもありそうです）

ということで、ここまできてやっと、Stack Overflowを機械翻訳しただけに見えるサイトが数多く存在する理由（Stack Overflowのコンテンツは3rd party開発者にとって再利用しやすいライセンスにて提供されている）が分かったのでした。

上記のようなサイトが数多くある理由は何となく分かりましたが、冒頭でも述べた通り私にとって、Stack Overflowを機械翻訳しただけに見えるサイトが不要ということには変わりはありません。よって可能な限り除外させていただきますが、Stack Overflowのコンテンツに対して機械翻訳以外の付加価値を何かしら提供できるのであれば、マネタイズのチャンスが我々にもありそう、というような気付きもありました。


* cf.
 * [Stack Overflowの英語から日本語に機械翻訳されたコンテンツのサイトについてどう思いますか？](https://ja.meta.stackoverflow.com/questions/2905/stack-overflow%E3%81%AE%E8%8B%B1%E8%AA%9E%E3%81%8B%E3%82%89%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AB%E6%A9%9F%E6%A2%B0%E7%BF%BB%E8%A8%B3%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%A9%E3%81%86%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B)
 * [機械翻訳されたコンテンツを含むサイトへのリンクの投稿をブロックすべきですか？](https://ja.meta.stackoverflow.com/questions/3118/%e6%a9%9f%e6%a2%b0%e7%bf%bb%e8%a8%b3%e3%81%95%e3%82%8c%e3%81%9f%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e3%82%92%e5%90%ab%e3%82%80%e3%82%b5%e3%82%a4%e3%83%88%e3%81%b8%e3%81%ae%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ae%e6%8a%95%e7%a8%bf%e3%82%92%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%81%99%e3%81%b9%e3%81%8d%e3%81%a7%e3%81%99%e3%81%8b?noredirect=1&lq=1)