5chの「なんJ」でAAが「貼れない」規制を突破できるようにAAを変換するサイト　（をgithub.ioで無料公開する方法）

# AAを貼れるように変換するサイトはこちら

https://j-j-j-j.github.io/

* 上のurlにアクセスするとAAを貼れるように変換できます

* 使い方は入力フォームにAAをコピーして「実行」ボタンを押すだけ
変換ずみのAAがクリップボードにコピーされます

=========================

現時点でも「なんj AA 貼れない」などと検索しても出てこないのでここで紹介しておきます。qiitaなら多分上位に来ると思うので
chmateなど専ブラがAA変換に対応してくれればいいのにって感じだけど
ちなみにこの記事の著者は製作者じゃありません

=========================

# なんJなど実況系板のAA規制とは

一定以上空白がある文章が書き込めなくなったため、5chの実況系板でほとんどのAAがはれなくなった規制。

# スクリプトの内容

この変換サイトだと

空白やらNG判定になりそうなところを読み込んで
置き換えて
新しい文字列の固まりとして出すのは
jsのプログラミング部分でやってる

それをクリックポチポチッてできるWebのサイトとして成り立たせてるのはHTMLとgithub.ioの鯖


* index.html

サイトにアクセスすると基本的にindex.htmlが最初に表示されます。

```{.html}

<!DOCTYPE html>
<meta charset="utf-8">
<script src="index.js"></script>
<link rel="stylesheet" href="index.css">
<title>j-j-j-j</title>
<div>
    <textarea id="input" cols="64" rows="16" onfocus="this.select();">　　　　　　　　　　　　　 ／.i
　　　　　　　　　　／i∠__ノ
　　　　　　 ／.i∠__ノ‘ｊ’　)ﾉ　　ｴｰﾗｲﾔｯﾁｬ
　　　　　∠／.i‘ｊ’　)ﾉ==|┘
　　　　〈,(∠__ノﾉ ／.i__〈　　ｴｰﾗｲﾔｯﾁｬ
　　　　 〈,(　‘ｊ’∠_／.i
　　　　　└i=〈,(∠__ノﾉ　　　　　
　　　　　　〈__〈,(　‘ｊ’　)ﾉ　　ｼﾞｪｲｼﾞｪｲｼﾞｪｲｼﾞｪｲ
　　 　 　　　　└i===|┘
　 　 　 　 　　　〈＿_〈</textarea>
</div>
<div>
    <button type="button" onclick="main()">実行</button>
    <p id="result"></p>
</div>
<div>
</div>

```

３行目の\<script src="index.js"\>\</script\>で「index.jsに以下の内容を受け渡す」ということを宣言しています

2行目\<link rel="stylesheet" href="index.css"\>はスタイルシートといい、サイトのデザイン（アイコン画像など）を決める.cssファイルを指定しています

4行目の\<textarea id="input" cols="64" rows="16" onfocus="this.select();"\>は入力フォームを作っています。ここで渡された情報はindex.jsに渡されます。

index.jsではfunction escapeToUnicode(s)という関数内で文字列をunicodeに変換（これで5chの規制は適用されなくなる） 、function clipboard(s) でクリップボードにコピーします

* index.js

```{.js}
let CHARS = ' .,\'`"\\:;\\-=~_|＼／<>';

function main() {
    let s = document.getElementById('input').value;
    s = escapeToUnicode(s);
    clipboard(s);
    checkByteCount(s);
}

function escapeToUnicode(s) {
    let r = /[　 \n][　 ]{3}[　 \n]/;
    while (r.test(s)) {
        s = avoid(s, r);
    }

    r = RegExp(`[${CHARS}\n][${CHARS}]{3}[${CHARS}\n]`);
    while (r.test(s)) {
        s = avoid(s, r);
    }

    return s;

    function avoid(s, r) {
        return s.replace(r, (sub) => {
            // 最後の1文字を数値参照化
            // 最後の1文字が改行の場合は最後から2文字目を数値参照化する
            if (sub.slice(-1) === '\n') {
                return sub.slice(0, -2) + toEntity(sub.slice(-2, -1)) + '\n';
            } else {
                return sub.slice(0, -1) + toEntity(sub.slice(-1));
            }
        });
    }

    function toEntity(c) {
        return '&#' + c.charCodeAt() + ';';
    }
}

function clipboard(s) {
    const tempElement = document.createElement('textarea');
    tempElement.style = "position: absolute; left: -9999px; top: -9999px";
    tempElement.value = s;
    document.body.appendChild(tempElement);
    tempElement.select();
    document.execCommand('copy');
    document.body.removeChild(tempElement);

    const result = document.getElementById('result');
    result.textContent = 'クリップボードにコピーされました';
    result.className = '';
}

function checkByteCount(s) {
    // バイト数チェック
    // UTF-8ではなくShift_JISでカウントされる

    const bytes = countBytes(s);
    if (bytes > 4096) {
        result.textContent = `総バイト数が${bytes - 4096}バイト超過 連続するスペースや記号を減らしてください`;
        result.className = 'error';
    }

    s
        .replace('\n', ' <br> \n')
        .split('\n')
        .some((s, i) => {
            const bytesOfRow = countBytes(s)
            if (bytesOfRow > 1024) {
                result.textContent = `${i + 1}行目が${bytesOfRow - 1024}バイト超過 連続するスペースや記号を減らしてください`;
                result.className = 'error';

                return true;
            } else {
                return false;
            }
        });

    function countBytes(s) {
        let bytes = 0;
        for (let c of s) {
            let code = c.charCodeAt();
            if ((code >= 0x0 && code < 0x81) || (code >= 0xff61 && code < 0xffa0) || (code >= 0xf8f0 && code < 0xf8f4)) {
                bytes += 1;
            } else {
                bytes += 2;
            }
        }

        return bytes;
    }
}
```

こういう簡単なフロントエンドのwebアプリなんでソース見ればやってることはすぐわかるよね

以下のgithubのレポジトリに置いてあります。

https://github.com/j-j-j-j/j-j-j-j.github.io

# github.ioでの公開の仕方

GitHubリポジトリ画面の「Settings」 → GitHub Pages → Source　→　master branch →　Save ボタン　→　https://ユーザ名.github.io/リポジトリ名　にサイトが公開される

# 5ch運営はなぜAAを規制したのか

5ch運営の行動は基本的に不可解なので追求するだけ無駄。

運営がjimﾜﾄｷﾝｽになってから日本語読めない人が技術的な部分を担うようになってる（jimやcode monkeyは8chanの運営にしか興味ない）ので仕方ない

米国では掲示板のRedditのDAUやアクセス数（平均して全米4位-7位にいる）がinstagramやtwitterなどSNSを上回っているというのに、遥か前から掲示板文化のある日本ではゴミみたいな5chや爆サイが最大の掲示板で、どんどん衰退してるというのは、不幸なこと（板やスレのあるシステムは不特定多数との交流に本当に優れている）

5ch運営がタグ導入によるSEO最適化や、旧態依然としたUIでもChmate等の専用ブラウザ導入を促すなどやっていれば状況は違ったかもしれないけど、今も昔も運営にやる気がないので仕方ない

5ch+chmateは軽量でジェスチャーなどredditよりも使いやすいところが多いのに専門板はこういう意味不明な規制や荒らし放置で人が減るばかり、伸びてる板はなんJやyoutube板のようなゴミばっか、

一方のredditの日本語コミュニティーはAPI規制で移住したケンモメンの残党（ほとんどはchmateなどが使えるようになった時点で嫌儲に帰った）のあつまるnewsokurが内ゲバで崩壊

日本でも掲示板文化の復興が望まれます

5chでもredditでもいいので。。。