|
| 1 | +--- |
| 2 | +title: "子育てDIY:YouTubeの視聴をご褒美に変えた話" |
| 3 | +date: 2025/06/23 00:00:00 |
| 4 | +postid: a |
| 5 | +tag: |
| 6 | + - Squid |
| 7 | + - Network |
| 8 | + - DIY |
| 9 | + - 育児 |
| 10 | + - 子ども |
| 11 | +category: |
| 12 | + - Infrastructure |
| 13 | +thumbnail: /images/20250623a/thumbnail.png |
| 14 | +author: ys_nishida |
| 15 | +lede: "子育てをする中で、意外にも本職の知識でDIYして役に立つことってありませんか?子どもの年齢や家庭でのデバイス・IT環境も千差万別ありますが、抽象化した悩みとしては2つに集約すると思います" |
| 16 | +--- |
| 17 | +# はじめに |
| 18 | + |
| 19 | +子育てをする中で、意外にも本職の知識でDIYして役に立つことってありませんか?子どもの年齢や家庭でのデバイス・IT環境も千差万別ありますが、抽象化した悩みとしては2つに集約すると思います。 |
| 20 | + |
| 21 | +1. 子どもが夢中になっている事を後押しするためにやる事 |
| 22 | +2. 子どもが夢中になっている事を制限するためにやる事 |
| 23 | + |
| 24 | +私の話で言えば、1はマインクラフトのサーバ構築やマルチプレイ環境の構築が当てはまり、 |
| 25 | +2は本記事の主題の通り、YouTube視聴に制限をかけてご褒美にした話です。 |
| 26 | + |
| 27 | +# 具体的な悩み事 |
| 28 | + |
| 29 | +* 男の子はとにかくゲーム/YouTubeが大好き!放っておくと無限にやってしまいます! |
| 30 | + * 私の家庭では、やること自体はもちろんいいんですが、生活や体調に支障をきたすレベルに過度に依存しないルールを設けています |
| 31 | + * Nintendo Switchはみまもりアプリで時間の上限が設定できるのでそれで問題ありませんでした |
| 32 | +* 問題はテレビ/DVD含めた映像媒体です。一度つけたら最後、そんなに見たいわけでもないのに宿題/夕ご飯/風呂/歯磨きなど、とにかく自分で進められない。親が促しても『今じゃない』とかいろいろ言い訳つけて、21時過ぎてあわてて寝る準備するなんて言う日も普通にありました |
| 33 | +* そこで、『それらの準備を終わらせたらYouTubeを見ても良い』『早ければ早いほど見える時間が増える』、というルールと、それを実現するITインフラを準備しました |
| 34 | + |
| 35 | +# フローチャート |
| 36 | + |
| 37 | +* まず、子どもがYouTubeを見ることが出来るフローチャートはこんな感じです |
| 38 | +* 基本的には、生活の上で最低限やるべきことをやった後で、ご褒美的な位置づけに変えました |
| 39 | + |
| 40 | +<img src="/images/20250623a/flowchart.png" alt="flowchart.png" width="481" height="381" loading="lazy"> |
| 41 | + |
| 42 | +# 構成 |
| 43 | + |
| 44 | +* 構成に関しては、特に難しい要素はありません |
| 45 | + |
| 46 | +<img src="/images/20250623a/diagram.drawio.png" alt="diagram.drawio.png" width="591" height="341" loading="lazy"> |
| 47 | + |
| 48 | +* Windows はいつの頃からか、pac ファイルはローカルを参照できなくなったので、github 上に pac を公開しています |
| 49 | +* 後は Proxy コンテナを `docker compose up` するかどうかで Youtube を見えるかどうかを制御しています |
| 50 | + |
| 51 | +# Config 等 |
| 52 | + |
| 53 | +## 子どものPC側の設定など |
| 54 | + |
| 55 | +* 子どものアカウント(標準ユーザ)にて、Pac ファイルの指定 |
| 56 | + |
| 57 | +<img src="/images/20250623a/2025-06-12_222922.png" alt="2025-06-12_222922.png" width="1020" height="724" loading="lazy"> |
| 58 | + |
| 59 | +* 管理者アカウントにて、プロキシの設定を変更出来ない設定 |
| 60 | + * `gpedit.msc` でグループポリシーエディタを起動 |
| 61 | + |
| 62 | + <img src="/images/20250623a/2025-06-12_222625.png" alt="2025-06-12_222625.png" width="400" height="204" loading="lazy"> |
| 63 | + |
| 64 | + * `プロキシの変更が出来ない` というポリシーを有効にする |
| 65 | + |
| 66 | + <img src="/images/20250623a/2025-03-09_201437.png" alt="2025-03-09_201437.png" width="1200" height="704" loading="lazy"> |
| 67 | + |
| 68 | +## github に上がっているPac |
| 69 | + |
| 70 | +* Pacファイル |
| 71 | + |
| 72 | +```js user.pac |
| 73 | +function FindProxyForURL(url, host) |
| 74 | +{ |
| 75 | + // . が含まれない場合。つまりローカルドメイン |
| 76 | + if (isPlainHostName(host)) |
| 77 | + return "DIRECT"; |
| 78 | + |
| 79 | + // ローカルIP宛の通信は direct |
| 80 | + if (isInNet(host, "192.168.0.0", "255.255.0.0")) |
| 81 | + return "DIRECT"; |
| 82 | + |
| 83 | + // ドメイン名に基づくproxyの設定 基本的には www.youtube.com を向ければ問題な |
| 84 | +い |
| 85 | + if (shExpMatch(host, "youtube.com")) |
| 86 | + return "PROXY 192.168.11.64:10080"; |
| 87 | + else if (shExpMatch(host, "*.youtube.com")) |
| 88 | + return "PROXY 192.168.11.64:10080"; |
| 89 | + else if (shExpMatch(host, "youtu.be")) |
| 90 | + return "PROXY 192.168.11.64:10080"; |
| 91 | + else if (shExpMatch(host, "youtubekids.com")) |
| 92 | + return "PROXY 192.168.11.64:10080"; |
| 93 | + else if (shExpMatch(host, "*.youtubekids.com")) |
| 94 | + return "PROXY 192.168.11.64:10080"; |
| 95 | + else if (shExpMatch(host, "*.netflix.com")) |
| 96 | + return "PROXY 192.168.11.64:10080"; |
| 97 | + |
| 98 | + // どこにも合致しない場合は、諦めて direct 接続 |
| 99 | + return "DIRECT"; |
| 100 | +} |
| 101 | +``` |
| 102 | + |
| 103 | +## 親のPC側でやること |
| 104 | + |
| 105 | +* docker compose でプロキシを起動 |
| 106 | + |
| 107 | +```yaml compose.yaml |
| 108 | +services: |
| 109 | + proxy: |
| 110 | + image: ubuntu/squid:latest |
| 111 | +# volumes: # マウントは特に要りませんでした、細かくホワイトリスト設定したい場合などは必要 |
| 112 | +# - ./work:/work |
| 113 | +# - ./conf/squid.conf:/etc/squid/squid.conf |
| 114 | + ports: |
| 115 | + - "10080:3128" |
| 116 | +``` |
| 117 | +
|
| 118 | +* 後は、子どもの準備が整ったら、`docker compose up` をすると `youtube.com` にアクセスが出来る様になります |
| 119 | + |
| 120 | +# その他細かい話 |
| 121 | + |
| 122 | +* YouTubeは、動画のストリーミング自体は、別の FQDN から行われているらしく、全量は調べられていません。なので動画を見ている途中でコンテナを落としても動画は見えてしまいます。でも、次の動画は見えない挙動になります |
| 123 | +* 逆にこの仕様を逆手にとって、21:00にコンテナを落とすので、「その動画を最後まで見たら終わり」という整理にしています |
| 124 | + |
| 125 | +# あとがき |
| 126 | + |
| 127 | +* 話としては以上です。非常に簡単な仕組みなので、技術として難しい要素はないですね |
| 128 | +* 子どもアカウント側で、『Proxy の変更が出来ない』制御はいらないかもしれません。『Proxy を変更すると見える!』という事がわかるくらいの年齢なら、どっちかというと自制心を育てる何かの活動をすべきです |
| 129 | +* タブレットやスマホも同様にwifi設定する際に、PAC URL を指定できるので、同じ制御が可能です |
| 130 | + * 可能ですが、SIMを入れて外で使いたい場合は、PACを外すか、PAC内で判別させるか、もう一歩複雑な処理を入れる必要があります |
| 131 | +* Chrome Cast など経由ではなく、TVで直接 Youtube を見る場合は... ちょっとわかりません |
| 132 | +* Youtube のチャネルによって制御したいケースは、試していませんが、Proxyで中間CA局を立てて、中間サーバ証明書をhttpsリクエストのたびに発行する、という設定をすればおそらく細かい制御も出来るとは思いますが、httpsのどのリクエストパラメータにチャネル名が入っているのか?などは確認できていません |
| 133 | +* 嫁の反応は、基本的には自分のスマホが取り上げられなくなる事、PCのキー操作を覚える事などは肯定的です。ですが、マインクラフトのマシンガントーク実況のチャンネルの音量がとても大きく、そこは否定的です😂 |
0 commit comments