学校のiPadでweb開発

MDM管理下でweb開発する方法です。
...なんか[どっか](https://tnsk.ie-t.net/index.php?id=37)でみたような気が...
※サービス名などは不都合が生じるとまずいので全て伏せています。

# うちの構成

<h5>iPad 8th gen.</h5>

ただの板。全然愛がないiPad(さっむ)であり、ホームすら変更できないほど厳しい。
MDM(もび接続)と愛がないfilterは機能自体に不満はない。むしろここまでロックできるから賞賛もの。設定している人が悪いだけ。
GIGAスクールとか言ってるのにIDE(codepen)とかレンタルサーバー(XFREE)までも規制されている。

<h5>鬼filter</h5>

極悪。
Gmailですら規制。
上述したようにIDE、レンタルサーバーまでも規制。
家でも使いたいほど機能は優秀だが、設定している人の頭がおかしい。

<h5>もびい</h5>

官公庁御用達のMDM。
設定している人が極悪で、ホーム画面のレイアウトまでも規制済み。
ブラウザ上のFTPも規制済み。

<h5>Rugged Combo 3</h5>

ただのソフトケース。
打ちやすさはまぁまぁ。
タッチパッドが欲しかったなぁ...

# そしてここから本題

まずはショートカットを追加する。
`about:blank`を開いて、ブックマークに追加。
その後、以下を設定。
※なんとsafariではURIエンコードが勝手に走るのでそのまま。

1. eval(おすすめ)
    ```JavaScript
    javascript:%20var%20s%20=%20prompt(%22eval%22,%20%22alert()%22);%20eval(s);
    ```
1. viewsource(おすすめ)
    ```JavaScript
    javascript:(function()%7Bvar%20d%3Ddocument%2Cs%2Ce%3Bvar%20el%3Dd.getElementById('snpy')%3Bif(typeof%20Snoopy!%3D'undefined')%7BSnoopy.toggle()%3Breturn%7Delse%20if(el)%7Bel.className%3D%2Fclosed%2F.test(el.className)%3Fel.className.replace('closed'%2C'')%3Ael.className%2B'%20closed'%3Breturn%7Ds%3Dd.createElement('link')%3Bs.setAttribute('href'%2C'https%3A%2F%2Fjf6deu.net%2Fsnoopy-min.css')%3Bs.setAttribute('rel'%2C'stylesheet')%3Bs.setAttribute('type'%2C'text%2Fcss')%3Bd.getElementsByTagName('head')%5B0%5D.appendChild(s)%3Be%3Dd.createElement('script')%3Be.setAttribute('src'%2C'https%3A%2F%2Fjf6deu.net%2Fsnoopy-min.js')%3Bd.getElementsByTagName('body')%5B0%5D.appendChild(e)%7D)()%3B
    ```
    こっちはSnoopyをSSL非対応だからとうちのサーバーでホスト
1. ffmpeg
    https://ffmpeg-online.vercel.app/
    珍しくここはただのURL
1. cookie削除
    ```JavaScript
    javascript:document.cookie.split(';').forEach(cookie%20=%3E%20document.cookie%20=%20cookie.replace(/%5E%20+/,%20'').replace(/=.*/,%20%60=;max-age=$%7B0%7D;%60));
    ```
    正規表現を使って短くまとめた自信がある
1. Unicode
    ```JavaScript
    javascript:alert(eval(%22String.fromCodePoint(%22+prompt('string%20code')+%22)%22))
    ```
    ただ`fromCodePoint`で引いただけ
1. about:blank
    about:blank
    やっと出ました、そしてただこれだけ
1. 天気予報(CITYNUMを変えてね)
    ```JavaScript
    javascript:%20function%20start()%20%7B%20var%20fr%20=%20document.createElement('iframe');%20fr.src%20=%20%22https://eco.mtk.nao.ac.jp/cgi-bin/koyomi/sunmoon.cgi?id=45%22;%20fr.style.width%20=%20%22180px%22;%20fr.style.height%20=%20%22370px%22;%20fr.setAttribute(%22frameBorder%22,%20%220%22);%20var%20body_node%20=%20document.querySelector(%22body%22);%20body_node.appendChild(fr);%20var%20file%20=%20new%20XMLHttpRequest();%20file.open('GET',%20'https://weather.tsukumijima.net/api/forecast?city=CITYNUM');%20file.send();%20var%20tenkidiv%20=%20document.createElement('div');%20tenkidiv.id%20=%20%22tenki_disp%22;%20body_node.appendChild(tenkidiv);%20file.onreadystatechange%20=%20function()%20%7B%20if%20(file.readyState%20===%204)%20%7B%20var%20tenkitmp%20=%20file.responseText;%20var%20tenkijson%20=%20tenkitmp;%20var%20tenki%20=%20JSON.parse(tenkijson);%20var%20tenkitext%20=%20tenki.description.text%20+%20%22%3Cbr%3E%22;%20var%20todaytenki%20=%20tenki.description.publicTimeFormatted%20+%20%22%E7%99%BA%E8%A1%A8%E3%80%82%3Cbr%3E%22;%20var%20main%20=%20tenkitext%20+%20todaytenki%20+%20%22%3Chr%3E%22;%20var%20todayimage%20=%20%22%3Cimg%20src=%5C%22%22%20+%20tenki.forecasts%5B0%5D.image.url%20+%20%22%5C%22%20width=%5C%22%22%20+%20tenki.forecasts%5B0%5D.image.width%20+%20%22%5C%22height=%5C%22%22%20+%20tenki.forecasts%5B%200%5D.image.height%20+%20%22%5C%22%20style=%5C%22vertical-align:middle;%5C%22%3E%22;%20var%20todaytenki%20=%20%22%3Cdiv%20style=%5C%22vertical-align:middle;%5C%22%3E%22%20+%20tenki.forecasts%5B%200%5D.telop%20+%20todayimage%20+%20%22%3C/div%3E%3Cbr%3E%22;%20var%20todaykousui%20=%20%22%E9%99%8D%E6%B0%B4%E7%A2%BA%E7%8E%87&emsp;%22%20+%20%220%E6%99%82~6%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B0%5D.chanceOfRain%20.T00_06%20+%20%22&emsp;6%E6%99%82~12%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B0%5D.chanceOfRain.T06_12%20+%20%22&emsp;12%E6%99%82~18%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B0%5D.chanceOfRain.T12_18%20+%20%22&emsp;18%E6%99%82~24%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B0%5D.chanceOfRain.T18_24%20+%20%22%3Cbr%3E%22;%20var%20main%20=%20main%20+%20%22%E4%BB%8A%E6%97%A5%EF%BC%9A%3Cbr%3E%22%20+%20todaytenki%20+%20todaykousui%20+%20%22%3Chr%3E%22;%20var%20todayimage%20=%20%22%3Cimg%20src=%5C%22%22%20+%20tenki.forecasts%5B1%5D.image.url%20+%20%22%5C%22%20width=%5C%22%22%20+%20tenki.forecasts%5B1%5D.image.width%20+%20%22%5C%22height=%5C%22%22%20+%20tenki.forecasts%5B%201%5D.image.height%20+%20%22%5C%22%20style=%5C%22vertical-align:middle;%5C%22%3E%22;%20var%20todaytenki%20=%20%22%3Cdiv%20style=%5C%22vertical-align:middle;%5C%22%3E%22%20+%20tenki.forecasts%5B%201%5D.telop%20+%20todayimage%20+%20%22%3C/div%3E%3Cbr%3E%22;%20var%20todaykousui%20=%20%22%3Cdiv%20style=margin-bottom:30px;%3E%E9%99%8D%E6%B0%B4%E7%A2%BA%E7%8E%87&emsp;%22%20+%20%220%E6%99%82~6%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B1%5D.chanceOfRain.T00_06%20+%20%22&emsp;6%E6%99%82~12%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B%201%5D.chanceOfRain.T06_12%20+%20%22&emsp;12%E6%99%82~18%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B1%5D.chanceOfRain%20.T12_18%20+%20%22&emsp;18%E6%99%82~24%E6%99%82%EF%BC%9A%22%20+%20tenki.forecasts%5B1%5D.chanceOfRain.T18_24%20+%20%22%3C/div%3E%3Cbr%3E%22;%20var%20main%20=%20main%20+%20%22%E6%98%8E%E6%97%A5%EF%BC%9A%3Cbr%3E%22%20+%20todaytenki%20+%20todaykousui;%20document.getElementById(%22tenki_disp%22).style.LetterSpacing%20=%20%222em%22;%20document.getElementById(%22tenki_disp%22).style.textAlign%20=%20%22center%22;%20document.getElementById(%22tenki_disp%22).innerHTML%20=%20main;%20document.getElementById(%22kidou%22).style.display%20=%20%22none%22;%20%7D%20%7D%20%7D%20if%20(systemdisp)%20%7B%20alert(%22%E3%81%99%E3%81%A7%E3%81%AB%E8%B5%B7%E5%8B%95%E6%B8%88%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82%5Cn%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%95%E3%83%83%E3%82%BF%E3%83%BC%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22);%20%7D%20else%20%7B%20if%20(navigator.onLine)%20%7B%20var%20systemdisp%20=%20true;%20var%20s%20=%20document.createElement('div');%20systemdisp%20=%20true;%20s.innerHTML%20=%20%22%E8%B5%B7%E5%8B%95%E4%B8%AD%E3%81%A7%E3%81%99...%22;%20setTimeout(function()%20%7B%20s.innerHTML%20=%20%22%E5%8F%96%E5%BE%97%E5%A4%B1%E6%95%97%E3%80%82%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22;%20%7D,%202000);%20s.id%20=%20%22kidou%22;%20document.querySelector(%22body%22).appendChild(s);%20start();%20%7D%20else%20%7B%20alert(%22%E5%8F%96%E5%BE%97%E5%A4%B1%E6%95%97%E3%80%82%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82%22);%20systemdisp%20=%20false;%20%7D%20%7D
    ```
    ...なっが。
    これ中学の頃から使ってるからいつか短くまとめたいなぁ...
1. 音声プレーヤー
    ```JavaScript
    javascript:%20var%20audio%20=%20new%20Audio();%20var%20file%20=%20document.createElement(%22input%22);%20document.body.appendChild(file);%20file.type=%22file%22;%20file.addEventListener(%22change%22,%20function(e)%7B%20audio.controls%20=%20true;%20document.body.appendChild(audio);%20%20%20%20%20%20%20%20%20const%20reader%20=%20new%20FileReader();%20%20%20%20%20%20%20%20%20reader.onload%20=%20()%20=%3E%20%7B%20%20%20%20%20%20%20%20%20%20%20audio.src%20=%20reader.result;%20%20%20%20%20%20%20%20%20%7D;%20%20%20%20%20%20%20%20%20reader.readAsDataURL(e.target.files%5B0%5D);%20%7D);
    ```
1. 動画プレーヤー
    ```JavaScript
    javascript:%20var%20video%20=%20%20document.createElement(%22video%22);%20var%20file%20=%20document.createElement(%22input%22);%20document.body.appendChild(file);%20file.type=%22file%22;%20file.addEventListener(%22change%22,%20function(e)%7B%20video.controls%20=%20true;%20document.body.appendChild(video);%20%20%20%20%20%20%20%20%20const%20reader%20=%20new%20FileReader();%20%20%20%20%20%20%20%20%20reader.onload%20=%20()%20=%3E%20%7B%20%20%20%20%20%20%20%20%20%20%20audio.src%20=%20reader.result;%20%20%20%20%20%20%20%20%20%7D;%20reader.readAsDataURL(e.target.files%5B0%5D);%20%7D);
    ```
    それぞれ音声と動画を再生するのみ。
1. Geolocation APIのお遊び
    ```JavaScript
    javascript:navigator.geolocation.getCurrentPosition((position)%20=%3E%20%7B%20location.href%20=%20%22https://google.com/search?q=%22%20+%20position.coords.latitude%20+%20%22,%22%20+%20position.coords.longitude;%20%7D);
    ```
    これも中学の頃作って持ち越した

以上。
これを使って作っていく。

# よく使うサービス
[vscode.dev](https://vscode.dev/)
これでほとんどは開発。
それをcloudfree(前XFREE)にコピペ。(XFREEがドメイン変えたからアクセスできるようになった)
もしくはGitHubと連携させてGitでアップロード。
ほんとはGitにこんな使い方をしたらダメだけど、しかたない。

[cloudflare](https://dash.cloudflare.com/)
ここでドメイン管理。
DNSの機能しか使っていない。
なまえcom使いたくないからこっちにした。
gm<del>おっとっと</del>全般に言えるけどダークパターン多すぎ。

[GitHub](https://github.com/)
なぜブロックされないのか謎。
使えてるしいいや。

[cloudfree](https://www.xfree.ne.jp/)
XFREE時代にユーザーに対していくつもの嫌がらせをしてきた。
今は立て直しているみたい。
ちょうどその頃にいたけどあの時は酷かったと思う。

そのほかにも善意で使わせていただいているWebサーバーがありますが、公開しないことにします。
著名サイトにリンクすると悪意を持った人が申し込むかもしれません。

# おわりに
iPadの標準機能で<del>形だけの</del>GBスクール構想に打ち勝ちましょう！
そして、学生の方がもっと身近に参入できるようにしましょう！