xparseで条件分岐コマンドを生成 LaTeX

準備

\usepackage{xparse}
\usepackage{mleftright} %あったほうがいい

ドキュメント https://ctan.org/pkg/xparse

leftとrightを楽にしたい

\NewDocumentCommand\ld{}{\left.}
\NewDocumentCommand\rd{}{\right.}
\NewDocumentCommand\alc{}{\mleft\lparen}
\NewDocumentCommand\arc{}{\mright\rparen}

関数に変数を明示したい

\NewDocumentCommand\funct{m}{
    {#1}_{\alc t \arc}
}   %f(t)

積分記号の引数処理を楽にしたい

\NewDocumentCommand\intet{moo}{
    \IfValueTF{#2}{
        \IfValueTF{#3}{
            \int_{#2}^{#3}
        }{
            \int_{#2}
        }
    }{
        \int
    }
    {#1} {\mathrm{d}t}
}

\[
  \intet{\funct{f}}[T]
\]
  • #2があって#3があるなら $ \int $ の上下に引数を入れる
  • #2のみなら $ \int $ の下に引数を入れる
  • #2もないなら $ \int $ のみ

これだと $ \int_T f_{(t)} \mathrm{d}t $ が生成される

微分ry

\NewDocumentCommand\difft{mo}{
    \IfValueT{#2}{\ld}
    \frac{\mathrm{d}}{\mathrm{d}t} {#1}
    \IfValueT{#2}{\right\vert_{#2}}
}

\[
  \difft{x^2}[2] &= 4
\]
  • #2があるなら $ \vert $ と引数のセットをつける
  • #2がないならなし

これだと $ \left. \frac{\mathrm{d}}{\mathrm{d}t} x^2 \right|_2 = 4 $ が生成される

解説

関数

\IfValueTF{}{}\IfValueT{}\IfValueF{}

変数がある時〜!がtrueでない時〜!がfalse
TF{}{}trueの処理とfalseの処理を分けて書ける
それ以外はtruefalseのどちらかの時だけを書ける

\IfNotValueTF{}{}\IfNotValueT{}\IfNotValueF{}

その逆を往く

\IfBooleanValueTF{}{}\IfBooleanValueT{}\IfBooleanValueF{}

\BooleanTrue\BooleanFalseに対応する(後述)

\NewDocumentCommand

コマンド新設置

\NewDocumentCommand\新しい関数の名前{引数のオプション}{処理の中身}

\RenewDocumentCommand

コマンド上書き

\NewDocumentCommand\新しい関数の名前{引数のオプション}{処理の中身}

引数

関数側

最低限は以下のルールを守る

  • 前から#1#2#3…と呼ぶ
  • 念のために{#1}のように前後は{}で囲っておいたほうがいい
  • 定義の中で既に定義された別の関数を用いることができる
    • デフォルトの値にも設定できる
  • 変数に段落(\par動作)も含めたいならオプションの前に+をつけよう
  • コマンドの省略制御は割りと難しいので,使用頻度の高い順に番号を振るのが吉
  • mオプション
    • 入力がなければコンパイルエラー吐いて止まる
    • 要するに普通の引数と同じ
  • oオプション
    • 入力がなければ-NoValue-すなわち変数なしを返す
      • この時に変数を無理矢理に出力すると"-NoValue-"という文字列になる
      • でも"-NoValue-"を入力に渡すと-NoValue-は返されない
    • 入力があれば処理は続行する
  • O{デフォルトの値}オプション
    • 入力がなければデフォルトの値を採用する
    • 入力があれば入力を採用する
  • +bオプション
    • 環境設定的なbegin{}を作るのに重宝する
    • 引数の最後にこれを持ってくることで,以降の文章が全て入力として扱われる
  • sオプション
    • コマンドの後に*を入れてモードを切り替えるのに便利
    • *あれば\BooleanTrue,なければ\BooleanFalse
      • 引数設定の先頭にsがあるなら,このどっちかが必ず変数#1に入る
      • 別に先頭である必要はないが,慣習的に先頭の方がよさそう

本文側

だいたいこんな感じか

  • mオプション
    • \コマンド{引数}の形を取る
    • {}は入力ありと判定される
  • oオプション
    • \コマンド[引数]の形を取る
    • []は入力ありと判定される
  • Oオプション
    • \コマンド[引数]の形を取る
    • []は入力ありと判定される
  • sオプション
    • *の有無に依存する
    • 必ず\BooleanTrue\BooleanFalseのどちらかを返す
  • 省略制御は難しい
    • 例えば関数側で{s m m O{xyz} o o}と指定した時
      • []\BooleanFalse,-NoValue-,-NoValue-,"",-NoValue-,-NoValue-になる
      • {}[][]\BooleanFalse,"",-NoValue-,"","",-NoValue-,になる
    • 要するに引数の型をチェックして前に詰めていく上に「入力なし」を入力できないらしい

これを使う利点

割と楽に2つ以上の引数の省略が可能になる,使い分けが増えることで関数名が節約できる
(デフォルトでは自明に1個までしか省略できない)

意見・要望

積分記号あるじゃないですか,あれって

\[
  \left\int f(x) \right.
\]

的な感じでサイズを調整してくれるとマジで嬉しいんですよね
実際には! Missing delimiter (. inserted).つまり\intは区切り記号(括弧類)じゃないってエラー吐かれるんですが
でもだってほら,微分に使う$\vert$はleftrightできるし,$\int$も対応して欲しいなって

\begin{align} x = a+b \end{align}

TeXShop + VSCode + git on Mac 設定 メモ

前提

  • pdfファイルが欲しい
  • VSCode上で完結させる
    • CLIはなるべく使いたくない
  • latexmkで以下を一括で起爆する
    • uplatex
    • upbibtex
    • biber
    • upmendex
    • dvipdfmx
    • 1回のコマンド内で済む
  • gitでバージョン管理したい
    • 致命的なミスを回避したいので
  • macOSでスマン

下準備

gitインスコ

$ brew install git
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

homebrew入れてない人は適宜に導入してくれたほうが良い
シェルのパスも通しておこうな(VSCodeから叩きたいので)

VSCodeインスコ

brew install --cask visual-studio-code

TeXShop on Macインスコ

ここから.pkgを落とす
適当に全部インスコする
こっちはなんとなくだがhomebrewはおすすめしない
TeXの管理にhomebrewを使うのは直感的ではなさそう

設定

GUIアプリケーション

TeXShop

実質的に不要(使わないので)

TeX Live Utility

適宜にライブラリをアプデしておこう
ちなみに年度バージョン切り替えはこれじゃないと面倒

git

実質的に不要(GitHub使わないなら)

VSCode

latex関係

  • 拡張機能の欄を開いてLaTeXで検索
  • 以下をインストール
    • LaTeX Workshop
    • LaTeX Utilities
  • LaTeX Workshopの「拡張機能の設定」を開く
    • 右上の「設定(json)を開く」を選択
  • jsonに以下をコピペ
{
"latex-workshop.latex.tools": [{
    "name": "latexmk",
    "command": "latexmk",
    "args": [
    "-e","$latex=q/uplatex %O -synctex=1 -interaction=nonstopmode -file-line-error %S/",
    "-e","$bibtex=q/upbibtex %O %B/",
    "-e","$biber=q/biber %O --bblencoding=utf8 -u -U --output_safechars %B/",
    "-e","$makeindex=q/upmendex %O -o %D %S/",
    "-e","$dvipdf=q/dvipdfmx %O -o %D %S -z 0/",
    "-norc",
    "-gg",
    "-pdfdvi",
    "%DOC%"
    ]
}],
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.chktex.enabled": true,
"latex-workshop.latex.autoBuild.run": "never",
}
  • 設定内容イメージ
    • ビルドにlatexmkを指定
      • オプションはuplatexとdvipdfmxの組み合わせを想定
      • 最終ビルドでは"$dvipdf=q/dvipdfmx %O -o %D %S -z 0/""$dvipdf=q/dvipdfmx %O -o %D %S -z 3/"にしておくとファイル容量が減る
    • セーブ時の自動ビルドを無効化
    • pdfビューワをtabで開く
    • chktex(エラー検出ソフト,デフォルトでTeXLiveに入ってる)をオンにする

git関係

  • 拡張機能の欄を開いて@popular gitで検索
  • 以下をインストール
    • Git History
    • GitLens
    • Git Graph
    • Project Manager
    • gitignore
    • Git Blame
  • とりあえずこれででいいと思います…

使い方

  • ルートフォルダを開き.texファイル,.styファイル,.clsファイルを用意する
  • .bibファイルも必要なら
  • 画像とかを管理するフォルダは別に作った方がよさそう
  • .texファイル,.styファイル,.clsファイルを開いて編集する
  • 様式を満たした上で右上の再生ボタンを押す
    • latexmkなので1回で完全にビルドされる
    • 「View LaTeX PDF File」するとpdfが開く
      • でも動作が重いので別のビューワを持ってきた方がいいよ
    • エラー吐いたらコンパイラのログを読もう
      • ggれば高確率でTeX Wikiのどこかにぶち当たる
  • ワークスペースを保存しておく
    • 次回以降にVSCodeを立ち上げると勝手にセッティングしてくれるので
  • gitが用意できているなら
    • 初回は拡張機能からgit init
      • 画像とかあると時間がかかる,気を付けてね
    • 更新したらステージング,気が済んだらコミット
      • ブランチ,マージ,スタッシュ…などはそれ専用の解説記事を見てくれた方がいいです
  • 日本語の名前を使ってるフォルダかファイルがあると新規ファイルの追加でエラー吐く(ステージングできなくなる)
    • どうやらVSCode拡張機能gitのステージングは絶対パスを使ってスクリプトを打ってるらしく,そのどこかに日本語が入っているとgitがエラーを吐く
    • ターミナル開いてgit add -Aするとできる場合がある
      • こっちは相対パスで動いてるくさい(../a/b/cみたいなヤツか?)
      • ルートフォルダ含むプロジェクト内で日本語を使わなければこれで解決しそう

このやり方の利点

gitが有能

  • 自分の進捗が時刻や変更箇所と共に記録されるので,単純に進度管理にも便利だと思います
  • 取り返しのつかないミスをした時のリカバリーにもなると思います
  • パターンを分けながら制作する時にも役に立つと思います

VSCodeが有能

  • 圧倒的補完機能
  • 圧倒的検索機能
  • 圧倒的拡張機能
  • 圧倒的GUI

TeXShop on Mac 設定 メモ

前提

  • pdfファイルが欲しい
  • pdfTeXやdvips+ps2pdfは使わない
    • uplatexとdvipdfmxを使う
  • luascriptであるptex2pdfを使ってtexから.pdfまで一気にコンパイルする(TeXShopでデフォルトでできる)

下準備

TeXShop on Macインスコ

ここから.pkgを落とす
適当に全部インスコする

環境設定

タイプセット

デフォルトのコマンド

LaTeX

デフォルトのスクリプト

TeX + DVI

タイプセット後の動作

編集を続ける

ファイル保存時に

関連ファイルも保存する

Sync 方式

SyncTeX

内部設定

パス設定

コンパイルを起爆する実行ファイルがどこにあるかを指定する

TeX

/Library/TeX/texbin

Distiller (Ghostscript)

/usr/local/bin

homebrewで最新版を入れてるなら

/usr/local/Cellar/ghostscript/x.y.z/bin

でも良さそう

TeX+dvipdfmx

コンパイル時のコマンドを編集する

LaTeX

luascriptであるptex2pdfをどうやって起爆するかの設定

ptex2pdf -u -l -ot "-synctex=1 -file-line-error" -od "-z 0"
-u

upLaTex召喚オプションその1

-u

upLaTex召喚オプションその2

-ot

upLaTexコンパイラオプション召喚オプション
以下の""に文字列を突っ込む

-synctex=1

synctex有効化

-file-line-error

エラー位置をログに出力

-od

dvipdfmxオプション召喚オプション
以下の""に文字列を突っ込む

-z 0

コンテンツ(写真等)情報量の圧縮手順を切る,爆速コンパイルになる
ところで動画とかwebフレームの埋め込みとかもできるんだろうか…?

何が言いたいか

ptex2pdfのオプションついては https://texwiki.texjp.org/?ptex2pdf dvipdfmxのオプション(-od ""で呼び出せる)については https://texwiki.texjp.org/?dvipdfmx uplatexのオプションについての記事はなかったので
uplatex --helpして読むしかない

詳細

Distiller

Apple DistillerにするとバグるのでNG

ドキュメント

TeXファイル

先頭

\documentclass[a4paper,12pt,uplatex,fleqn,dvipdfmx]{jsreport}

uplatexdvipdfmxを指定しておいて,それに対応しているclsを読み込めばいいんじゃないですかね…

ipv6専用ddnsがフレッツ網で試供されていた

きっかけ

無料のDNSで遊びたかった
ipv4DNSは申請の敷居が高いし,ぶっちゃけv6プラスだと実質固定ipで面白くないし,なのであんまり乗り気になれなかった

と思ったらipv6専用ddnsが試供されていた,なるほどなぁ…

リンク

概要
HTTP(S)なAPI
NTPやpingで動かす場合
採用事例

HTTP(S) API

フレッツ網内かipv6インターネットから呼び出すのが前提
それ以外はddnsapi-v6ddnsapi-v4に書き換える
http://https://でもOK

dnsを新規設定

http://ddnsapi-v6.open.ad.jp/api/new/?[HostName]
  • 返却されるCSVの中にKeyが含まれる
  • KeyとHostNameが対応するので大事に取っておく

同一HostNameのアドレスを更新

 http://ddnsapi-v6.open.ad.jp/api/renew/?[Key]
  • このAPIを叩いたマシンのipv6アドレスが反映される
  • Keyは必須,HostNameは不要

Host Nameのみ更新

http://ddnsapi-v6.open.ad.jp/api/changehostname/?[Key]=[NewHostName]
  • これもKeyは必須
  • ipv6アドレスは反映されない

dnsそのものを削除

http://ddnsapi-v6.open.ad.jp/api/delete/?[Key]
  • これもKeyは必須

状況確認

http://ddnsapi-v6.open.ad.jp/api/status/?[Key]
  • [Key]を[HostName]にすると返却される情報の一部(機密なやつ)がhiddenされる

Keyを紛失する時のための対策

新規設定時に

http://ddnsapi-v6.open.ad.jp/api/new/?[HostName],[MailAddress]

しておくと紛失時に

http://ddnsapi-v6.open.ad.jp/api/recovery/?[MailAddress]

することでメアドに結びつけられたdnsとKeyの一覧が届くらしい ここでKeyの再設定がされることはない

利用例

まだやったことないけどブラウザから手で打ったら本当に動作したので間違いではなさそう

追記・ipv6アドレスについての調べ物

こっちがほんへ
ipv6のアドレスといえば,一般的なネットワークなら

  • 上位,サブネットプレフィクス
    • 48bit,グローバルルーティングプレフィクス
    • 12bit,サブネット識別子
  • 下位,インタフェース識別子
    • 48bitのMACアドレスをModified EUI-64で64bitに変換して申告
    • もしくは上流のDHCPv6サーバがランダムに生成して配布

という取り決めがあるらしいが,実際に日本でNTTのNGN網とv6プラスと光電話を全て使うとなると

  • 上位,サブネットプレフィクス
    • 56bit,グローバルルーティングプレフィクス
      • NGN網にあるNTT所有のDHCPv6サーバのどこかが自動でやってくれているらしい(DHCPv6サーバのアドレスはwhoisで確認できる)
      • DHCPv6-PD(DHCPv6-Prefix Delegation,プレフィクス代表)が方式としては正式名称
        • ここより下の割り当てはONUに任せます的な意味らしい(ふわっと理解した感)
        • 逆にここまでだけがONUに与えられる情報だとも言える
      • 要するにNGNから勝手に降りてくるので変えられない,ipv4 over ipv6の実装の都合もあるだろうし固定されてそう
        • つまりNGN内で完結して実装されている,実装?何も知らん
        • しかしNTT側の配慮なのか,自分が利用するISPが委託しているVNEごとにipv6アドレスの先頭が違うことがわかっている(後述)
    • 4bit,HGW向け
      • 当然だがONUとHGWの間で通信する必要があるので,16セグメントのうち1セグメントをHGWが使っている
      • ONUがHGWに対して2回目のDHCPv6-PDをやっているとも言える
      • ユーザーがHGWもどきを15個つかって15セグメント作れるとか…
  • 下位,インターフェース識別子
    • 64bit割り当てられるのは一般的な考え方と同じ
    • HGWがやってくれる
    • 恐らくはランダムに配布されるものと思われる(確認したら明らかにMACアドレスとは無関係だった)
  • ん?上位60bitと下位64bit…?
    • おい待てい,上位の末尾4bitはどこいった
    • ぱーっと読んだけど情報がない,なぜだ…?
    • 多分セグメントの拡張用なんじゃないかなって思った
  • MAP-Eとの間で行われる読み替えの関係はまだ未履修(未読)
    • もしかしたらインターフェース識別子にも影響を与えるんじゃないかと…

結論から言うと自動で構成してもらった方が良いし多分その手段でしか正常に利用できない仕組みなんだと思った,特にHGWとONUの2つを抱えていると尚更に…
ちなみに光電話がないとDHCPv6サーバからONUにぶっつけ本番で/64が降ってくる
環境設定のネットワークのTCP/IPipv6の設定のルーター欄に恐らくfe80::で始まるアドレスがあるがそれは192.168.1.1と同じくHGWにアクセスできる
またDHCPv6サーバ払い出し状況の画面はONUからHGWと同じようにセグメントを預ったルーターに関するものなので,普通の人は何も表示されないのが正解とか

参考

ちなみにNURO光やその他の非NGNipv6対応の光回線はまた仕様が違うらしい

ipv6アドレスとVNEの関係

これでプレフィクスを取得できるらしいな?

$ curl -H 'Host:route-info.flets-east.jp:49881' -H 'Accept:*/*' -H 'Connection:close' --http1.1 http://route-info.flets-east.jp:49881/v6/route-info
0000,2020/09/17 09:23:31
1111,2404:01a8:7e00:0000:0000:0000:0000:0000/40 --NTT東日本
1211,2404:01a8:0000:0000:0000:0000:0000:0000/32 --NTT東日本
1212,2001:0c90:0000:0000:0000:0000:0000:0000/33 --NTT東日本
1311,2408:0210:0000:0000:0000:0000:0000:0000/30 --NTT東日本
1411,2400:2410:0000:0000:0000:0000:0000:0000/30 --BBIX-IPv6
1412,2409:0010:0000:0000:0000:0000:0000:0000/30 --MF-Transix-E-1
1413,240b:0010:0000:0000:0000:0000:0000:0000/30 --JPNE
1414,2404:7a80:0000:0000:0000:0000:0000:0000/30 --BIGLOBE
1415,2405:6580:0000:0000:0000:0000:0000:0000/30 --朝日ネット
1416,2400:4050:0000:0000:0000:0000:0000:0000/30 --OCN
1417,2401:4d40:0000:0000:0000:0000:0000:0000/30 --フリービット
1418,2001:0f70:0000:0000:0000:0000:0000:0000/30 --アルテリア・ネットワーク
1419,240b:c0c4:0000:0000:0000:0000:0000:0000/30 --楽天モバイル

4連続のNTT東日本を除けば現在は9社でVNEをやっているらしい,確認してみよう
https://www.ntt-east.co.jp/info-st/ipoe_menu/

参考

光回線(v6プラス前提)の性能に関するメモ

導入に関するメモは

ここにあるのね〜 soluna-eureka.hatenablog.com

基本的な考え方

通信経路の一部分だけが最高速度を出せても他の部分にボトルネックがある限りは無駄である,インターネット上のサービスは通信経路上の最低速度に合わせてデータをやり取りする(もちろんサービスを提供する側のサーバの性能が悪いのもダメだが)

手元の設備にフォーカス

パソコンやスマホのインターフェース

RAMやSSDの性能

だってデータをDLしても手元に上手く落とせなきゃまず意味がない,RAMやSSDへの書き込み速度はどれくらいかチェックだ

有線接続

Ethernetでどこまでの速度に対応している?最大で1Gbpsの光回線なら1Gbpsに対応しているLANポートが必要だ,PCクラスタとプライベートネットワークを作ってデータを転送したいなら10Gbpsに対応しているのもいいらしい
前者は1000 BASE-T(上下どちらか1Gまで)もしくは1000 BASE-TX(上下同時に1Gまで),後者は10G BASE-T(上下どちらか10Gまで)と呼ばれるらしい,俗に言うギガビットEthernetと10ギガビットEthernet,なお10G BASE-TXは有線でみたことがない

無線接続

IEEE 802.11のどこまで対応している?1Gbps出るならせめてacは欲しい
将来を見据えるか余力を持った性能が欲しいならそろそろaxに対応しても良さそう

いい場所に置いてる?

LANソケットやルータから無駄に離れたり他の電子機器がそばにあったりすると,エラー率が上がるので速度も出なくなるぞ

屋内の周辺機器

任意のコネクタや変換器

最低でも1000 BASE-Tは欲しい,屋内で1000 BASE-TXやそれ以上をやりたいならそれに対応するものを選ぼう

有線LANのケーブル

下で1Gbpsを出したいなら最低でもcat5eかcat6,混雑する経路や長い経路もしくは上下同時に1Gbpsを使う必要がある場合はcat6が良い,それ以上を目指すなら10Gbpsに対応するcat6a(たまにcat6eと書かれる場合がある)を選ぼう
cat7以上の規格のものは市販品では使えない,これ以上はもう完全に産業用の何からしい,コネクタがcat5系列やcat6系列とは厳密には異なるので性能が発揮できない(互換性はあるのでコネクタの見た目さえ合えば取り敢えずは動くらしいんだが)

家の中に既にLANケーブルが埋まって存在している場合,その規格は差込口に書いてある場合が多い,もし書かれてなかったら自分で実験して確かめてみるべき

ルータ

Wi-fiに対応するなら無線LANとして802.11acか802.11axが欲しい
なおかつ有線の接続で1000 BASE-Tや1000 BASE-TXもしくはそれ以上に対応しているもの選ぼう

分配器,ハブ,アクセスポイント等

ルータ機能がないものでも,概ね上と同じ考え方ができる
ただしルーター機能の有無が転送速度に影響する可能性はある,なるべくシンプルな構成にしよう

家庭向けONU+HGW

注意 ONUとHGWが別々だったり一体だったりするので気をつけよう

1Gbpsまでの回線

光ファイバ(LINE)側について

上下ともに1GbpsでONUに到達する
…とは言うが,一応は光ファイバーの性能と光ネットワークの規格にも依存するらしい,まぁ業者が施工するなら間違いはないだろうし,ぶっちゃけ規格として1Gbpsが出せないというのはまずありえない
つまり少なくとも光回線なら最低でも上下1Gbpsを出せる用意ができていると考えても良い

ONUとHGWの間(WAN)について

一体化しているのであれば別に気にしなくても良いが,別々の場合はそれを結ぶコードについて有線の規格に気をつけなければいけない,流石に公式から提供されるセットに入っているものなら不足はないと思いたいが…
一般にONUだけでは(自力でHGWを作らない限り)光回線を利用できない,インターネットの認証とかは大方HGWの役目でONUはそれを有線の通信に変換しているだけらしい

HGWよりも内(LAN)側

ポートが複数あるケースがほとんど,新しいものは各ポートごとに片道1Gbpsで通信する1000 BASE-T規格に対応している
非NTTだと1000 BASE-TXに対応しているものもあるっぽい,ちゃんと使えるかを事前にNTTに問い合わせた方が良さそう
対外的な通信は光回線の容量の限界があるため,全てのポートを合計して上下1Gbps(1ポートだけ使う場合は片道1Gbps)という制限がある
光回線の認証および接続に加えて家庭内で使えるルーターとしての機能も持っているが,そっちの性能がどの程度のものなのかは取説になかった,気になるなら実験してみよう
もしONUとHGWが一体化しているのであれば,これらを一体で担うことになる

NURO光 2G

※実際に使っている知人に取材した

光ファイバ(LINE)側について

上り1Gbps下り2Gbpsで到達する
上に示した1Gbps回線とは光ネットワークの規格が異なるため,下りで2Gbpsを達成している,そのために専用回線の導通工事が必要になる…が,既に光回線の用意があるならONUを変えるだけで済む場合がある(集合住宅とか)し,もしくは近隣の住民と一緒に新規契約するなら光回線の設置工事も安心して受けられるだろう(担当者がまともなら)

ONUとHGWの間(WAN)について

なんか一体化しているものしかないらしい,以上

HGWよりも内(LAN)側

ポートは複数ある場合がほとんどだが,各ポートごとにどれも片道1Gbpsで通信する1000BASE-T規格に対応している,一方で1000 BASE-TX対応の機種は公式サイトを眺めた限りでは見つからなかった
その上で端末をいくつか繋げて同時にダウンロードしても合計で2Gbpsまで許容されるので下りの速度に差が出る,そもそもNURO光ISPとセットの契約である上にISPとしても優秀なので素で早いと言えるでもお前こないだ障害起こしてたじゃん

それ以上の回線

受動光ネットワーク(PON)には経路上のシステムとして規格と対応できる帯域が定めらており,5ギガビットや10ギガビットには高い規格が要求されるほか,対応した専用のONUISPを利用しなければならず,まずサービス提供エリアも限られる上に料金も高くなる
その上で前述した通りに屋内の設備を整えないと宝の持ち腐れであり,同時に帯域を使い切らないと本当にもったいないので,ぶっちゃけ1Gbpsもあれば普通の人は大丈夫だと思う,NURO光 2Gはコスパが良いと聞くがどうだろうか
ただ有線テレビ放送に受動光ネットワークを介して行われる方向性が見られたり,基地局側の機器の性能も進化し続けている,いよいよ10Gbps時代が到来するかもしれない…

ONUとHGWについて

見た感じだと次世代の高速光回線ONUとHGWが別々になっている
HGWの方は取説が公開されているが,ONUの方は取説が公開されていない,情報求む

光ファイバについて

情報求む
10G回線に限らず1G回線でも実際のケーブルに関する情報が不足している,どれもシングルモードなのはNTTの資料からわかるんだけど,どの速度でもどの距離でも一緒なのかどうかが気になる… www.ntt-east.co.jp

それ以外

家庭向けじゃない…なら業者の方ですか?
帯域保証回線ってクソ高いんですねあれ…

奥手の設備にフォーカス

光ファイバなど

光ファイバそのもの

光ファイバそのものに通信速度の上限は存在しないとされている
ただし品質が低かったり(反射率が悪い,無駄に長い)劣化したり(虫に食われる,鼠に食われる,踏んで折れる)するとダメなので,通信速度を上げたり以上があったりする場合はにファイバが対応できているかをチェックする必要はある
一応は光ファイバの品物そのものにも推奨距離や対応規格はあるものの,実際に業者にチェックしてもらうのがベスト

中継機,増幅器,分岐器,等々

基地局設備

参考

cat規格(有線LAN)まとめ

※通信規格名はあくまでEthernet/IP全体に対するものであり,有線LANに限らず光ファイバにも使われる
※xxBASE-Tだと有線LAN,xxBASE-(S|L|Z)(+1文字)だと光ファイバ…になるらしい,距離と波長は共にS<L<Zになるっぽいね

規格名 通信規格名 最大帯域 動作可能周波数(最大帯域時) 動作可能距離(最大帯域時) 備考
cat1 なし ? 1MHz ? 正式な規格ではないらしい ,というか電話回線用だった
cat2 なし 4Mbps 4MHz ? 正式な規格ではないらしい ,が割と使われていた
cat3 10BASE-T, 100BASEVG, 100BASE-T4 10Mbps 16MHz わからん もう古い,ボロいLANケーブルはだいたいコレか?
cat4 10BASE-T, 100BASE-T4 10Mbps 20MHz わからん もう古い,直後にcat5が出てきてすぐに使われなくなった?
cat5 10BASE-T, 100BASE-TX (Fast Ethernet), 1000BASE-T (Gigabit Ethernet) 100Mbps 100MHz なし 一般的な最大帯域よりも上の帯域で動作させる仕様(通信規格)があるにはあるらしい,しかし市販品では見たことがない
cat5e 10BASE-T, 100BASE-TX (Fast Ethernet), 1000BASE-T (Gigabit Ethernet), 2.5GBASE-T, 5GBASE-T 1Gbps 100MHz 100m いまどきのカテゴリー5ケーブルはこれを意味する,市販品でも1Gbpsはほぼ確実に出る,ただし長さは100mまでなので注意
cat6 10BASE-T, 100BASE-TX (Fast Ethernet), 1000BASE-T (Gigabit Ethernet), 1000BASE-TX, 2.5GBASE-T, 5GBASE-T, 10GBASE-T 1Gbps 250MHz なし cat5eよりもノイズ耐性がある…一応10Gbps通信もできるが,1本だけなら55m・複数本を一緒に置くと37mまで?
cat6A (or cat6e) 10BASE-T, 100BASE-TX (Fast Ethernet), 1000BASE-T (Gigabit Ethernet), 1000BASE-TX, 2.5GBASE-T, 5GBASE-T, 10GBASE-T 10Gbps 500MHz 100m cat6よりもノイズ耐性があり,事実上の10Gbps通信の正式対応版,ちなみに1000BASE-TXは1000BASE-Tの上位互換で完全二重通信(上下1Gbps)がサポートされるので,上下で1Gbpsを同時に出したかったらcat6以上が必要
cat7 ?(下位互換はあるらしい) ? 600MHz ?(10Gbpsで100m以上は出るらしい) 資料が少ないし未認定らしいしわからん…
cat7a ?(下位互換はあるらしい)(40GBASE-Tや100GBASE-Tを目指していた計画がなくなったらしいな) ? 1000MHz ? 同上
cat8 ?(完全下位互換or7Aのみ互換で未定?) ? 2000MHz 30m~36m(想定されるユースケースは限定されているらしい) 同上

以上をまとめると,

  • cat5e以上は最低条件
  • cat6が望ましい
  • cat6Aは1Gbpsを超える回線で使いたい

wi-fi規格(無線LAN)まとめ

追記します

PON規格まとめ

Ethernetの通信規格から外れるものがある,伝送フレームが異なる
ITUIEEEで分かれている,EthernetIEEEでそれ以外はITU
※波長の予約が大変なのはわかったのだが,ここではその記載は省く

規格名 定義名 伝送フレーム名 最大帯域 最大動作距離 最大分岐数 採用例 備考
GE-PON IEEE 802.3ah Ethernet ↑1.25Gbps,↓1.25Gbps 20km 32 フレッツ 光ネクスト,Yahoo! BB光KDDI 光プラス ホーム,eo 光ネット,4G携帯基地局バック回線 日本というかアジアで標準として使っているらしい
G-PON ITU G.984 GEM・ATM/GTC ↑1.25Gbps,↓2.5Gbps 60km 254 NURO光 2G 欧州的はこっちが標準らしい
XG-PON ITU G.987 XGEM/XGTC ↑2.5Gbps↓10Gbps 60km 64 NURO光 10G
XGS-PON ITU G.9807.1 XGEM/XGTC ↑10Gbps↓10Gbps 20km 64 NURO光 6Gs,同10Gs
10G-EPON IEEE 802.3av Ethernet ↑10Gbps↓10Gbps 20km 64 フレッツ 光クロス(10Gbps対応),auひかり ホーム 10ギガ
NG-PON2 ITU G.989 XGEM/XGTC ↑40Gbps↓40Gbps 40km 256 4つの波長の光を合成して使うと10Gbps×4=40Gbps相当の帯域が得られる,ここまでは1つの波長で10Gbpsが限界
NG-PON2+ ITU G.989 XGEM/XGTC ↑25Gbps↓100Gbps 40km 256 5G携帯基地局バック回線 下りのみで25Gbps×4=100Gbpsを実現,上りは25Gbps×1=25Gbps…まぁスマホ相手だしONU基地局だしで足りそうな気もする
50G-EPON(旧:100G-EPON) IEEE 802.3ca Ethernet ↑50Gbps↓50Gbps 20km 32 光ファイバ1本で上下100Gbpsするより上下50Gbpsを2つ実装した方が良いという判断,それぞれ25Gbps×2=50Gbpsと2波長で合成

※NG-PON2下位規格と下位互換が設けられている

以上をまとめると,

  • 現在は最低でも光ファイバ1本に上下それぞれ1波長を割り当てることで共に1Gbpsは確保できている,これが大抵の光コラボレーション回線(GE-PON)
    • 各戸で1本ずつ使っている…と思われるが,実際はスプリッタとかで共有している場合がほとんど
      • 最悪の場合で4(局内)×8(局外)=32本に分岐できるので,酷いと32Mbpsしか出ない
      • つまり「概ね1Gbps」は知識がない限りは見抜けない詐欺紛いの誇大広告,ベストエフォート値を「概ね」と誤魔化つつ公称値にするなんて絶対にいけない(改革派),いやよく考えたら共有ユーザー数に関わらず(というかそれすら教えられず)(時間平均値も事前にわからず)全ユーザーで一律に契約して料金を取るのはかなり詐欺に近い
      • PPPoEの網終端装置の増設もしないし(これはIPoEを実装してだいぶマシになったからまだヨシとはできるけど)
    • これを大量に束ねて入口であるNTT局のOLTにぶち込んでNGNEthernet/IP網に流し込んでいる
  • NURO光光ファイバ1本で下り2Gbpsを達成している(G-PON)
    • こちらもスプリッタで共有して契約する場合がほとんどだが…
      • NURO光自身が光ファイバをまるごと所有してG-PON対応のOLTに突っ込んで動かしている
      • 加えてそこまでユーザーが密集していない,つまり32本に分岐することがまずあり得ない(ただし加入者が少ないすぎると料金も割高になるが)
    • OLTから先もNGN網とは異なる独自の回線を経由している
      • 当然ISPとしても優秀なのでその先でも混雑しない
  • その他にも独自の光ファイバと専用回線を所有する業者はある,みんな頑張れ!
  • 地域や場所にもよるが,最近(つってもNTT自身の商用化は去年から)はNTTが10G-EPONに手を付け出してたり,OLTの性能は確実に向上してきている
    • NGN網へ流せる光ファイバの本数が増えたため,局内スプリッタが減らされている可能性がある(ONUあたりの通信速度は4倍になる)
    • あと「最近になってできた『ケチってない』市街地やマンション」はマシかもしれない,最初から1Gbps回線を見込んで局外でそこまでスプリットしていない可能性がある
      • それでも光コラボ回線なら諸要因を含めて平均で300Mbpsくらいか?(みんそくを見ながら)
    • 実はNTTはここ最近までNGN網を建設するのに全力で投資したために労力も財布もすっからかんになって,回線速度の向上なんかできねぇという状況だったのでは…?
  • 将来的にはNG-PON2と10G-EPONで10Gbps回線が増えるとは思う,一般に普及はしないだろうけど(ぶっちゃけ過剰すぎ)

コンテンツブロッカーの自作ユーザールール(ユーザーフィルタ)の倉庫

Twitter

正規表現の単語による完全なミュート,絵文字にも別で対応(URLでtwimg.comごとブロック),ハングルは全てミュート(ユニコードで網羅),かつツイートクエリ及びサーチクエリの保護,バグ防止のためにTwitter Card2種類の文言削除,「記事を読んでみませんか?」を無視,「話題を検索」から「COVID-19」と「エンターテイメント」を削除

twitter.com##div:matches-attr("/aria-label|role|data-testid|class/"="/タイムライン:.*|listbox|listitem|presentation|userCell|article|option|link|tablist|tab|region|button/") > div > div:contains(/朝日新聞|週刊朝日|朝日ウイークリー|asahi\.com|BuzzFeed|リテラ|lite-ra\.com|ハフポスト|huffingtonpost\.jp|東京新聞|毎日新聞|琉球新報|文春|ミモレ|CREA|business\sinsider\sjapan|テレビ朝日|テレ朝|日本テレビ|日テレ|フジテレビ|フジ|TBS|報道ステーション|報ステ|時事ドットコム|時事通信|時事メディカル|共同通信|現代ビジネス|Number|news zero|FNN|ママデイズ|BLOGS|ORICON|フラウ|モデルプレス|新R25編集部|東洋経済|Tasty\sJapan|ゲキサカ|Plum|BLOGOS|bizble|Kstyle|FRIDAY|就職四季報|DIGIDAY|ライフハッカー|DELISH KITCHEN|COVID-19|COVID19|COVID_19|新型コロナ|コロナウイルス|反ワクチン|フェミニズム|フェミニスト|lgbt|lgbt|ジェンダー|マイノリティ|女性.*権利|権利.*女性|イエ制度|家制度|家長制|人権|男尊女卑|男女共同参画|男女平等|MeToo|KuToo|勝部元気|石川優実|伊是名|新垣結衣|ガッキー|インセル|K-POP|BTS|GOT7|EXO|韓国人|エンターテインメント · トレンド|エンターテイメント · トレンド|俳優 · トレンド|若者.*重症|重症.*若者|医師会|リベラリズム|リベラル|リベラリティ|学問.*自由|自由.*学問|文化.*芸術|芸術.*文化|学術会議|障害者|従軍慰安婦|南京大虐殺|ナチス|共産|菅直人|鳩山|民主党|りっけん|立憲|立民|生理|月経|妊娠|出産|退陣を求めます|辞職を求めます|ニュース|アベ政権|アベやめろ|スガ政権|スガやめろ|献金|過去最多|過去最大|過去最低|ぢゃな|([\uAC00-\uD7AF]|[\u1100-\u11FF]|[\u3130-\u318F]|[\uA960-\uA97F]|[\uD7B0-\uD7FF]|[\uFFA0-\uFFDF])+|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83C\uDF64/imsu)
twitter.com##div:matches-attr("/aria-label|role|data-testid|class/"="/タイムライン:.*|listbox|listitem|presentation|userCell|article|option|link|tablist|tab|region|button/") > div > div:has(img:matches-attr("/src/"="/.*1f3f3-fe0f-200d-1f308.*|.*1f364.*/"))
twitter.com##div[data-testid="card.layoutLarge.detail"]:remove()
twitter.com##div[data-testid="card.layoutSmall.detail"]:remove()
twitter.com##a:contains(/まず記事を読んでみませんか?/):remove()
twitter.com##div:matches-attr("/aria-label|role|data-testid|class/"="/presentation/"):contains(/COVID-19|エンターテイメント|スポーツ/):remove()
twitter.com#@#div:matches-attr("/aria-label|role|data-testid|class/"="/テキストをツイート|検索クエリ/")

結果としてはだいたいこんな感じになる

f:id:Soluna_Eureka:20210520021014p:plain
参考スクショ

pixiv

バグの可能性あり.自己責任で(とくにSafariでやると死にがち)

pixiv.net##section:contains(/pixivFANBOX/im)
pixiv.net##div > a:contains(/pixivプレミアム無料体験/im):remove()
pixiv.net##div > div > div > div > div:contains(/イラストリクエスト作品|漫画リクエスト作品|pixivisionの新着記事|コンテスト結果発表|募集中のコンテスト|pixivコミックの人気作品|マンガのレベルアップ講座/im)
pixiv.net##div > section:contains(/コメント/im)

nicovideo

バナー位置を選んで削除

nicovideo.jp##div:matches-attr("/class/"="/MatrixRankingBannerAd|RankingMatrixNicoadsRow|InView BottomContainer|CommentPanelBannerAd NicoSpotAdContainer/"):remove()
nicovideo.jp##html > head:contains(/banner/):remove()
nicovideo.jp##div > div > div[class="Ads"]:remove()

Google

画像検索や翻訳結果のサジェストを削除

google.com##div > c-wiz > scrolling-carousel:remove()
google.com##div > g-expandable-container:remove()

【広告ブロッカー】Twitterが無条件にステマしてくるゴミみたいなメディアや目障りなクソ情報をブラウザ上で無視するフィルタ

再配布不可能・私的利用可能

やり方

PCブラウザ版のTwitterに限る
まずは拡張機能でブラウザ用のadguardを入手する
次に以下をユーザールールにコピペする

twitter.com##div:matches-attr("/aria-label|role|data-testid|class/"="/タイムライン:.*|listbox|listitem|presentation|userCell|article|option|link|tablist|tab|region|button/") > div > div:contains(/朝日新聞|週刊朝日|朝日ウイークリー|asahi\.com|BuzzFeed|リテラ|lite-ra\.com|ハフポスト|huffingtonpost\.jp|東京新聞|毎日新聞|琉球新報|文春|ミモレ|CREA|business\sinsider\sjapan|テレビ朝日|テレ朝|日本テレビ|日テレ|フジテレビ|フジ|TBS|報道ステーション|報ステ|時事ドットコム|時事通信|時事メディカル|共同通信|現代ビジネス|Number|news zero|FNN|ママデイズ|BLOGS|ORICON|フラウ|モデルプレス|新R25編集部|東洋経済|Tasty\sJapan|ゲキサカ|Plum|BLOGOS|bizble|Kstyle|FRIDAY|就職四季報|DIGIDAY|ライフハッカー|DELISH KITCHEN|VOCE|マネー現代|Huawei|ファーウェイ|華為|COVID-19|COVID19|COVID_19|新型コロナ|コロナウイルス|反ワクチン|フェミニズム|フェミニスト|インセル|lgbt|lgbt|ジェンダー|マイノリティ|女性.*権利|権利.*女性|イエ制度|家制度|家長制|人権|男尊女卑|男女共同参画|男女平等|MeToo|KuToo|勝部元気|石川優実|伊是名|新垣結衣|ガッキー|大坂なおみ|K-POP|BTS|GOT7|EXO|TWICE|韓国人|エンターテインメント · トレンド|エンターテイメント · トレンド|俳優 · トレンド|このトピックは今後おすすめとして表示されません。|若者.*重症|重症.*若者|医師会|リベラリズム|リベラル|リベラリティ|学問.*自由|自由.*学問|文化.*芸術|芸術.*文化|学術会議|障害者|従軍慰安婦|南京大虐殺|ナチス|共産|菅直人|鳩山|民主党|りっけん|立憲|立民|生理|月経|妊娠|出産|退陣を求めます|辞職を求めます|ニュース|アベ政権|アベやめろ|スガ政権|スガやめろ|献金|過去最多|過去最大|過去最低|ぢゃな|([\uAC00-\uD7AF]|[\u1100-\u11FF]|[\u3130-\u318F]|[\uA960-\uA97F]|[\uD7B0-\uD7FF]|[\uFFA0-\uFFDF])+|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08/imsu)
twitter.com##div:matches-attr("/aria-label|role|data-testid|class/"="/タイムライン:.*|listbox|listitem|presentation|userCell|article|option|link|tablist|tab|region|button/") > div > div:has(img:matches-attr("/src/"="/https:\/\/abs-0\.twimg\.com\/emoji\/v2\/svg\/1f3f3-fe0f-200d-1f308\.svg|https:\/\/abs-0\.twimg\.com\/emoji\/v2\/svg\/1f364\.svg/"))
twitter.com##div[data-testid="card.layoutLarge.detail"]:remove()
twitter.com##div[data-testid="card.layoutSmall.detail"]:remove()
twitter.com##a:contains(/まず記事を読んでみませんか?/):remove()
twitter.com##div:matches-attr("/aria-label|role|data-testid|class/"="/presentation/"):contains(/COVID-19|エンターテイメント|スポーツ/):remove()
twitter.com#@#div:matches-attr("/aria-label|role|data-testid|class/"="/テキストをツイート|検索クエリ/")

大まかな解説

使い方

ミュートしたい言葉をdiv:contains(/AAA|BBB|CCC/)AAABBB`CCC正規表現として入れる
それを含むツイートやユーザーは全て非表示になる(ユーザーページではユーザーの情報だけは見えてしまうけど)
正規表現検索を利用しているので公式クライアントより正確に安全に条件を絞れるミュート機能としての使い方が出来る
正規表現を用いた検索にはフラグとして/imusを使っているが,コレ以外の設定だと思うように動作しないので変更しない方が良い

絵文字の絞り込みには絵文字用の.svgイメージのソースURLを用いている,単独でUnicodeポイントが与えられる絵文字(例:🍤)ならば前後に.*を加えて入れれば良い(例:.*1f364.*)し,複数の絵文字の合成によって表示される絵文字(例:🏳️‍🌈)は指示に沿った複数のUnicodeポイントを半角ハイフンで連結し前後に.*を加えて入れれば良い(例:.*1f3f3-fe0f-200d-1f308.*
ちなみに正規表現を利用した検索において用いるUnicodeポイントがhex4桁までしか認められていない,サロゲートペアを利用してhex5桁1つをhex4桁2つに変換する必要がある,さすがに人力ではダルいので専用ツールサイトの利用を推奨する(例:🍤=>\uD83C\uDF64)(例:🏳️‍🌈=>\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08

|([\uAC00-\uD7AF]|[\u1100-\u11FF]|[\u3130-\u318F]|[\uA960-\uA97F]|[\uD7B0-\uD7FF]|[\uFFA0-\uFFDF])+はなにかって?これだけでハングルを全ブロックできる韓流トレンドのゴリ押しが悪い

またツイートクエリおよびサーチクエリはバグ動作回避のために対象外に設定することで保護した
Twitter Cardの説明文はバグ回避のため削除した,ちなみにLargeとSmallの2種類が存在する
さらに「まず記事を読んでみませんか?」を削除,「話題を検索」から「COVID-19」と「エンターテイメント」「スポーツ」を削除,「おすすめ」「トレンド」からジャンルで削除するにはエンターテインメント · トレンド|エンターテイメント · トレンド(なぜか2種類ある)を最初の正規表現のミュートリストに正確に追加する

仕組み

:matched-attr()と特定のパラメータを用いて検査の対象のdivを決め打ちし,:contains()と各種のワードで検査して引っかかったdivを不可視化している
> div >はどうやらdivの階層構造の深さを表すらしい…が,今のところ1個だけの状態が最もパフォーマンスが良い
そしてワンライナーで複数のdivを選定しているのでリストも1つで済む,フィルタリングがより快適になった

本来なら:remove()して少しでもブラウザを軽くしたかったのだが,非常によくバグる(Something Wrong is ~...の表示)ので断念
他のブラウザ用フィルタの拡張機能では同じ関数が使えないので,ほぼAdGuard専用になっていると考えて良い

注意

"/タイムライン:.*|listbox|listitem|presentation|userCell|article|option|link|tablist|tab|region/")の部分に"tweet"を加えると入力欄がバグるのでやらないこと
正規表現を間違えると想定外の動作を起こすので注意して入力すること

詳細な補足

仕様について

本来のコンテンツブロックは,basec ruleとしてドメインごとに挙動を設定できることが出発点であり,その次にCSS上の設定値や擬似クラスを利用して要素を指定してhideやremoveが可能になるnon-basic ruleがあり,その次にようやくextended css selectorがAdGuardに用意されているほか,さらにHTMLやScriptに対してのフィルタリングが実装されています
今回はextended css selectorを主に利用しており,matches-attrcontainsはどちらもDOMの変更を監視し,変化が発生する都度に評価を行いそれに則って動作します,なのでタイムラインの更新にも対応しています

ネット上の他の記事だとdiv[xxx="yyy"]div:has-text(/xxx|yyy/)のような解説が多いですが,前者は拡張性と管理性が低い・後者は使用する関数が古い問題があります,AdGuardのユーザールールのリファレンス(最新版)に沿いつつ設計することをお勧めします
ただし:has()セレクタCSS 4.0で実装されると策定されただけなので,現状どのブラウザでも未実装です,使えないので注意しておきましょうなので,公式リファレンスにある通りAdGuard内で関数が先行して実装されているので,使っても大丈夫です
aa.jp##div:matches-attr("/bb/"="/cc/"):contains(/xyz/):remove()みたいに関数を連結することが可能です,特定要素を丸ごと消したかったらこうした方が手っ取り早いです(効果範囲には気をつけましょう)

ユーザーが細かに挙動を制御できることで有名なuBLock Originと比較しましたが.正規表現が使えるAdGuardの方が今回は便利だと判断しました,あくまで他のブラウザ拡張機能では今回の構文が使えません

「エンターテイメント」と「エンターテインメント」

Twitterにはなぜか表記揺れがあります,両方消しましょう.

divの中身について

"/aria-label|role|data-testid|class/"

divタグのパラメータで明確に区別がつくのはおそらくはこの4つだけです
ちなみにTwitterはreactで動いているらしいです(react-rootがある)

タイムライン:.*

ユーザー発のアクティビティに関するもの,正規表現で以下を1個にまとめました
いずれもaria-label=で与えられます

タイムライン: ホームタイムライン

ホームに流れるタイムライン

タイムライン: トレンド

今どうしてる?

タイムライン:

最近でてきた「おすすめトピック」 後で名前が変わりそうなので注視

タイムライン: 話題を検索

検索ページのトップ

タイムライン: Carousel

検索ページでの横並びのサジェスト

タイムライン: タイムラインを検索

検索した結果

タイムライン: 会話

各ツイートのスレッド

タイムライン: 通知

通知

タイムライン: メッセージ

DM

タイムライン: リツイートされました

通知をクリックした画面

タイムライン: いいねしました

通知をクリックした画面

タイムライン: リツイートしたユーザー

ツイートから見れるやつ

タイムライン: いいねしたユーザー

ツイートから見れるやつ

listboxlistitem

role=で与えられます
検索窓のサジェスト欄と履歴欄がコレです,トレンド名とアカウント名を両方とも潰すには2つとも必要です

tablisttab

role=で与えられます
上と同じようなものです

userCell

data-testidで与えられます
色んな所に並んで表示される時にユーザーを非表示にします

articleregion

role=で与えられます
全てのツイートはコレに入っているので,念の為に対象にします

option

role=で与えられます
サジェストとか設定ボタンの枠です

link

role=で与えられます
Twitterが用意してくるリンクは大抵はこの中にあります

regionbutton

role=で与えられます
でっかい組み分けの箱と要素はこれです

card.layoutLarge.detailcard.layoutSmall.detail

data-testidで与えられます
説明文がバグを起こすので削除しました

スマホ対応について

例えばiPhoneSafariだと現時点ではうまく動作していません
ちょっとよくわからん,ユーザールールの動作条件がPCとは違うらしいですコンテンツセキュリティポリシーという存在のせいでAdGuardの動作そのものが制限されている可能性がありますね…
解決したらまた追記したいです

最後に

この記事は改善していくので,告知があれば最新版のルールを使った方がいいです
あとTwitterは無●

【macOS】Automatorで「pdf => png」「png => pdf」のクイックアクションを作る

参考元

Automatorを使って、PDFをpngに変換してPDFファイルと同名のディレクトリに置く 夏目祐樹

これのパターンを元に手を加えた

やりたいこと

pdfへの直書きができなかったり,写真をそのまんまpdfでまとめたかったり,そういう時にGUIをいちいち立ち上げるのは面倒すぎた あとBig Surのプレビュー.appが72dpiでしかラスター出力できなくなってて詰んだ,それだと細かく書ききれないからマジで辛い…

縛り

  • Automator使用
    • 簡単に
    • 汎用に
    • 単一完結
  • クイックアクションとして呼び出す
    • それならファイルを右クリックして呼び出せる
    • アプリケーションとして?そんなん要らんやろ
  • Apple Scriptなし
    • Finderやプレビューの呼び出し説明書を読む気力が全くない
    • 本当ならScriptを書いて完結させるのがスマートだとは思う

PDF to PNG

1つのpdfから複数のpng

1.pdfファイルの受け入れ

1.png

ポイント

Automatorにはパス操作向けのテキスト処理の機能がないからbashのちからを借りるぜ! 入力は引数として入ってきた順番で$1$2みたいにになるぜ! 標準出力がそのままモジュールの出力になるぜ! basenameにこんな感じにフルパスと拡張子を渡せば元のファイルの名前が得られるぜ!

2.生成するpngファイルの命名

2.png

ポイント

デフォルトだと元のpdfの名前がつくようになってるぜ!

3.元のpdfファイルがあるフォルダのパスを取得

3.png

ポイント

bashのちからを借りるぜ! pngファイルをしまうフォルダを作るのに必要だぜ! dirnameにこんな感じにパスを渡せば1段だけ上のディレクトリのパスが得られるぜ!

4.収納するフォルダのパスを生成

4.png

ポイント

bashのちからを借りるぜ! pngファイルをしまうフォルダを作るのに必要だぜ! さっき作ったフォルダの下にさっきつけた名前でフォルダを作った時のパスが得られるぜ! ただし末尾に_PNGsをつけてわかりやすくしてやるんだぜ!

5.収納するフォルダを生成

5.png

ポイント

こっちも末尾に_PNGsをつけるんだぜ!

6.pngレンダリング

6+.png

ポイント

他の拡張子を選ぶといろんな設定が出てくるぜ! ちなみに350dpiは日本の印刷機には多い要件らしいんだぜ!

7.名前を編集してフォルダに収納

7.png

ポイント

作成日の昇順で並べてから1スタートの連番を通すとページ数になるぜ! (ところでフォルダに収納しなかったファイルはどこにいくんだろうな)

PNG to PDF

複数のpngから1つのpdf

1.pngファイルの受け入れ

1+.png

ポイント

さっきとほとんど同じだぜ! 複数選択の場合だとFinder表示上のトップファイルが変数の先頭になるっぽいぜ!

2.生成するpdfファイルの命名

2+.png

ポイント

さっきとほとんど同じだぜ!

3.元のpngファイルがあるフォルダのパスを取得

3+.png

ポイント

さっきとほとんど同じだぜ! 元の画像たちはなるべく1つのフォルダにまとめて置いとくことをおすすめするぜ!

4.収納するフォルダのパスを生成

4+.png

ポイント

さっきとほとんど同じだぜ! ただし末尾に_PDFをつけてわかりやすくしてやるんだぜ!

5.収納するフォルダを生成

5+.png

ポイント

こっちも末尾に_PDFをつけるんだぜ!

6.pdfをレンダリング

6++.png

ポイント

pngファイルの名前の順にページを編み込めるぜ! 並びを指定したい時は名前を変えればいいんだぜ!

7.名前を編集してフォルダに収納

7+.png

ポイント

さっきとほとんど同じだぜ! 基本名だけ変えた方が安全だぜ!

感想

確かに手間は省けるようになった. ただしpdfからの変換は全てのページがpngになるので,不要なものは手動で消さねばならない …おとなしくクリスタEXとpdf対応IOプラグインを買いたいなと思いました.CELSYS万歳!

TwitterのMedeia Studioについて

Twitterの仕様が変わった

今年の4/1から色々と変わった

  • Androidユーザー向けにもSpacesが実装される
  • Periscopeは廃止,代わりにTwitter Media Studioが実装

Spacesについて

スルーします,スマホからじゃないと参加できない媒体とか個人的にちょっと信用できないし手を出す気にはなれないので

Periscopeはどうなった?

現状で以下のように確認できた

  • 新規ユーザーの登録は全て不可能

  • 登録済ユーザーのログインについて

    • iOSアプリは不可能
      • 4/1以前にログイン済ならセーフ,ただし再ログインは不可能
      • ログイン済ならスマホからの放送も可能
      • 過去の自分の放送も閲覧可能,削除は可能
    • ブラウザは可能
      • OBSなどから接続して配信する事は不可能
      • 過去の自分の放送も閲覧可能,ただし削除は不可能(元からできないんだけど)
  • 過去の放送について

    • Periscopeで配信されたものはPeriscopeドメインTwitterドメインの双方で見れる
      • 過去の放送だけ「Periscopeで視聴」が可能になる
      • 逆にProducer(後述)から配信した放送は「Periscopeで視聴」を押しても読み込まれない
    • iOSアプリからログアウトした場合,現時点では「ブラウザからログインしてアカウントを消す」意外に過去の放送を消す手段は存在しない
      • Twitter Media Studio(後述)にも放送があったことは表示されるが一切の編集できない
      • その場合,放送ソースには「Periscope」と表示される,別のサーバーからリダイレクトされてるっぽい

Twitter Media Studioについて

  • 「もっと見る」=>「Media Studio」で別ページが新規タブで開く

    • 「ライブラリ」はツイートしたメディア +「Producer」はPeriscopeを含む全てのライブ放送
    • インサイト」はメディアに関連するアカウントアクティヴィティ
    • 「予約投稿ツイート」は全ての予約ツイート
    • 「アナリティクス」はアカウントの全てのアナリティクス(別ページが新規タブで開く)
  • ProducerがPeriscopeの代わりに該当する,これが本題

Producerのやりかた

  • 「ライブ放送を作成」
  • 放送名,カテゴリ,ソースを設定
    • ソースは配信ソフトから繋げる宛先
    • URLとストリームキーがある
  • 「ライブ放送を作成」

その他の設定

オーディエンス

公開範囲のこと

予約設定

放送の開始時間と終了時間を指定できる 要するに切り忘れ系の放送事故が起こりにくい

繰り返し

定期配信向け昨日.毎週か毎日かで設定可能

ポスター画像

サムネのこと

Periscopeの設定

チャットを全画面モードで表示… 現状ではProducerからの放送にはPeriscopeでの接続は不可能 よってチャットはできない,つまり完全な死に機能,乙

ストリームの暗号化

いらないと思う

リプレイの制限

切り抜き対策かな?

地域の制限

中○人●共◉国に喧嘩を売る時くらいにしか使わないのでは?

補足

Periscopeのアカウントのライブ履歴の場所にもProducerで配信中のライブは表示されないので,コメントやチャットは完全にできないと考えた方がいい Periscopeは現状ではただのアーカイブセットになっている

結論

コメント機能なくした運営には失望した,はい

MacのUSキーボードでGoogle日本語入力を使う際の不具合

MacのUSキーボードでGoogle日本語入力を使う際の不具合

きっかけ

  • 半角スペースをデフォで打ちたい
  • 変換候補の精度が高い方がいい

やりかた

brew install --cask google-japanese-ime

もんだい

  • なぜかドイツ語入力になる
  • そのせいでかっこ等の記号類が思うように打てない

たいさく

  • そもそもGoogle日本語入力を使わない事,鉤括弧も入力できないので完全に無理
  • キーの置き換えもやめた方がいい
  • 半角スペースは「⇧」「␣」で打てるのでまぁ…

macOS `Catalina`に`clang 12.0.0`を入れて`ruby 3.0.0`を入れるだけ

ある日,rbenvを見ていた

brew upgrade ebenvして,

$ rbenv install -list
2.5.8
2.6.6
2.7.2
3.0.0
jruby-9.2.14.0
mruby-2.1.2
rbx-5.0
truffleruby-20.3.0
truffleruby+graalvm-20.3.0

昨年中にruby 3.0.0が正式にリリースされ,rbenvも対応したらしい.入れてみよっかなぁ〜俺もなぁ〜…

そのruby 3.0.0を入れようとしてしくじった

当時の環境は以下の通りだった.

  • MBP 2016 15inch
  • macOS Catalina
    • clang Apple 11.0.0←だいたいこいつのせいだった

吐かれたエラー

...
linking miniruby
generating x86_64-darwin19-fake.rb
x86_64-darwin19-fake.rb updated
make: *** [exe/ruby] Segmentation fault: 11
make: *** Deleting file 'exe/ruby'

BUILD FAILED (Mac OS X 10.15.7 using ruby-build 20201225)

Inspect or clean up the working tree at /var/folders/rk/0hczm32x2znb6pr6h4858hpc0000gn/T/ruby-build.20210104003100.75691.mUe6Zo
Results logged to /var/folders/rk/0hczm32x2znb6pr6h4858hpc0000gn/T/ruby-build.20210104003100.75691.log

Last 10 log lines:
compiling enc/unicode.c
compiling enc/utf_8.c
compiling enc/trans/newline.c
./revision.h unchanged
compiling version.c
linking miniruby
generating x86_64-darwin19-fake.rb
x86_64-darwin19-fake.rb updated
make: *** [exe/ruby] Segmentation fault: 11
make: *** Deleting file 'exe/ruby'

どうやら最後のmakeのとこでしくじったらしい.

原因推定

Segmentation fault: 11,これはなんかコンパイラが悪い気がしたので,設定や経過を見たくなった.

rbenv install -v 3.0.0

-vしながらrbenv installすると諸々の経過が見える,その結果

Configuration summary for ruby version 3.0.0

   * Installation prefix: /Users/username/.rbenv/versions/3.0.0
   * exec prefix:         ${prefix}
   * arch:                x86_64-darwin19
   * site arch:           ${arch}
   * RUBY_BASE_NAME:      ruby
   * enable shared:       yes
   * ruby lib prefix:     ${libdir}/${RUBY_BASE_NAME}
   * site libraries path: ${rubylibprefix}/${sitearch}
   * vendor path:         ${rubylibprefix}/vendor_ruby
   * target OS:           darwin19
   * compiler:            clang -fdeclspec
   * with pthread:        yes
   * with coroutine:      amd64
   * enable shared libs:  yes
   * dynamic library ext: bundle
   * CFLAGS:              ${optflags} ${debugflags} ${warnflags}
   * LDFLAGS:             -L. \
                          -L/Users/username/.rbenv/versions/3.0.0/lib  \
                          -fstack-protector-strong -L/usr/local/lib
   * DLDFLAGS:            -L/Users/username/.rbenv/versions/3.0.0/lib  \
                          -Wl,-undefined,dynamic_lookup \
                          -Wl,-multiply_defined,suppress
   * optflags:            -O3
   * debugflags:          -ggdb3
   * warnflags:           -Wall -Wextra -Wdeprecated-declarations \
                          -Wdivision-by-zero \
                          -Wimplicit-function-declaration -Wimplicit-int \
                          -Wpointer-arith -Wshorten-64-to-32 \
                          -Wwrite-strings -Wmissing-noreturn \
                          -Wno-constant-logical-operand -Wno-long-long \
                          -Wno-missing-field-initializers \
                          -Wno-overlength-strings -Wno-parentheses-equality \
                          -Wno-self-assign -Wno-tautological-compare \
                          -Wno-unused-parameter -Wno-unused-value \
                          -Wunused-variable -Wextra-tokens
   * strip command:       strip -A -n
   * install doc:         rdoc
   * JIT support:         yes
   * man page type:       doc
   * BASERUBY -v:         ruby 2.7.2p137 (2020-10-01 revision 5445e04352) \
                          [x86_64-darwin19]

を吐きながら,同じように失敗した.

   * target OS:           darwin19
   * compiler:            clang -fdeclspec

を見るに,macOS備え付けのclangを使っていることは察せた(私はいまだにコンパイラに手を出した事がない).

$ clang -v
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

どうもビルドにはコイツを使ったらしい. 悩んでTwitterを彷徨っていたら,clang Apple 12.0.0ruby 3.0.0を入れたっぽい方を発見した. またこ↑こ↓によると,macOS Big SurでちゃんとXCodeを入れている人は

$ clang --version
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: x86_64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

となるらしい(私はXCodeを入れた後に消した,だってあれデカイし重いし…).

つまりclangのバージョンが古いせいでしくじったんじゃね?と考えた.

解決編

概要

CommandLineToolsを強制的に入れ直すとclang 12.0.0になるのでヨシ!ruby 3.0.0も入れられる!

手順

Catalinasoftowareupdateに任せてもそれ以上にCommandLineToolsは新しくならない(つまりclang 12.0.0はどう足掻いても手に入らない)ので,いっそ手動で入れ直す.

$ sudo rm -rf /Library/Developer/CommandLineTools
...
$ xcode-select --install

バージョン確認すると

$ clang -v
Apple clang version 12.0.0 (clang-1200.0.32.28)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

こうなるはず,やっぱりXCodeがなくても大丈夫だったじゃないか…

これで

$ rbenv install 3.0.0

すれば

Installed ruby-3.0.0 to /Users/username/.rbenv/versions/3.0.0

が出るはず,バージョンを変えるか変えないかはあなた次第だが

rbenv local 3.0.0

とかでできる.

終わり!閉廷!以上!みんな解散!君もう帰って良いよ

おまけ

clang 11.0.0(やそれ以前の任意のバージョンのclang)を使いたい時にどうするかを考えた.

概要

homebrewllvmを入れて,それ経由でclangのバージョンを任意に変えられるようにしようぜ?

llvmとは

llvmを開発している組織さんの公式ページはこ↑こ↓llvmまわりのダウンロードやドキュメント等はこ↑こ↓llvm自体はcc++コンパイラclangのバックで動いているような中間言語を生成するシステムで,というかclangcの仕様に対応しながらllvmと並行で開発・維持され続けているものになっている…らしいな? つまりある時からllvmのバージョンがclangのバージョンになっている,そしてbrewで手に入れられる最新版は今だとllvm 11.0.0で,それを入れるとclang 11.0.0がもれなくそれについてくる…という流れになる.

ただあくまで言語やアーキテクチャに依存せずより効率の良い中間言語を生成しようとするのがllvmで,それを利用してobjective-cなどをコンパイルするのがclang,そんでclangの開発の言い出しっぺはやっぱりAppleで…だからあっXCodeにちゃんと最新版のclang 12.0.0が入って提供されている,やっぱ林檎ってすげぇわマジで…

…なのでclanggccよりも性能と使い勝手が共に良い…らしい(私は開発者ではないので全くわからないが).

事前準備

homebrewを導入しておく.

最新版のllvmだけで良いなら

まずは入れてみる.

$ brew install llvm <versions>
...
$ brew info llvm
...

ちゃんと注意書きを読む(抜粋).

To use the bundled libc++ please add the following LDFLAGS:
  LDFLAGS="-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib"

llvm is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have llvm first in your PATH run:
  echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> /Users/SolunaEureka/.bash_profile

For compilers to find llvm you may need to set:
  export LDFLAGS="-L/usr/local/opt/llvm/lib"
  export CPPFLAGS="-I/usr/local/opt/llvm/include"

keg-only…つまりシンボリックリンクが生成されないタイプのパッケージだけど,中身はちゃんとあるからパスだけは通そうね!あとコンパイラに知らせたいフラッグにも対応しているから,使いたければパスだけは通そうね!(意訳)

…ということで,コマンドとしてのllvmはどうもなさそうなので,それを打ってllvm経由のclangが有効になるような感じにするために,.bash_profileをいじる(参考:学生たちの技術ブログ).まだbashでごめんなさい

function llvm (){ #関数を定義している
    export PATH="/usr/local/opt/llvm/bin:$PATH" #以下,先の注意書きの通りにパスを追加・変更する
    export LDFLAGS="-L/usr/local/opt/llvm/lib"
    export CPPFLAGS="-I/usr/local/opt/llvm/include"
    unset -f llvm #いったん呼び出されたら定義されたこの関数を破壊する
}

ここまで終わったらterminalを立ち上げ直して

$ llvm
$ clang -v
clang version 11.0.0
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin

になるはず. 新しいタブを開けば元に戻るので安心だね!

旧版のllvmを使いたいなら

homebrewは基本的に最新版以外は絶対に認めないマンな上に過去版のインストールに関しては仕様が変わるらしい,そんな中で個人的に現在の参考になったのはこ↑こ↓brew tap-newbrew extractを用いて,自家製のtapに公式のformulaをぶち込んで,そのtapから更にbrew installすれば良い,らしい.これを発案した人,本当に賢い…

ということで試しにllvm 10.0.0を入れてclang 10.0.0に切り替えようとしてみる(主要な出力を抜き出す).

$ brew tap-new llvm/1000
Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/llvm/homebrew-1000/.git/
[master (root-commit) d649d61] Create llvm/1000 tap
 3 files changed, 85 insertions(+)
 create mode 100644 .github/workflows/publish.yml
 create mode 100644 .github/workflows/tests.yml
 create mode 100644 README.md
==> Created llvm/1000
/usr/local/Homebrew/Library/Taps/llvm/homebrew-1000

$ brew extract llvm llvm/1000 --version 10.0.0
==> Searching repository history
==> Writing formula for llvm from revision 96544f6 to:
/usr/local/Homebrew/Library/Taps/llvm/homebrew-1000/Formula/llvm@10.0.0.rb

$ brew install llvm/1000/llvm@10.0.0
==> Installing llvm@10.0.0 from llvm/1000
llvm@10.0.0: A full installation of Xcode.app is required to compile
this software. Installing just the Command Line Tools is not sufficient.

Xcode can be installed from the App Store.
Error: An unsatisfied requirement failed this build.

XCodeがないとダメと言われた.なんだコレは,たまげたなぁ… もしちゃんと入れている人がいたら試してみて欲しい.

あとはどうにかしてバージョンを切り替えてみて欲しい…

感想

コンパイラって色々あって大変だな〜とづまりすとこ 絶対もっと良いやり方があるのでは?brewはバージョン管理に不向きだしllvmclangは公式サイトからDLして突っ込んで自分でちゃんと関数を組み上げた方がいいんじゃないか?問題は解決したからもう何も考えられないけど…

【小ネタ】ユーザー名を変えたら「dyld: Library not loaded」

ユーザー名を変えた

こ↑こ↓の通りに変えてみた 【変更前】soluna=>【変更後】SolunaEureka ちゃんと再起動もした

結果

$ ruby -v
dyld: Library not loaded: /Users/soluna/.rbenv/versions/2.7.2/lib/libruby.2.7.dylib
  Referenced from: /Users/soluna/.rbenv/versions/2.7.2/bin/ruby
  Reason: image not found
Abort trap: 6

ユーザー名が古い方で動作していた

影響を受けた奴ら

rubyrbenv),python3pyenv),nodenodenv) 載せているのは1個目のケース というか確認してないだけで相当数が影響を受けてるんじゃ…

解決

source ~/.bashrcをやり直す

$ ruby -v
dyld: Library not loaded: /Users/soluna/.rbenv/versions/2.7.2/lib/libruby.2.7.dylib
  Referenced from: /Users/SolunaEureka/.rbenv/versions/2.7.2/bin/ruby
  Reason: image not found
Abort trap: 6

シンボリックが参照してくるディレクトリの文字列が変わってねぇ

そもそも入れ直す

rbenv uninstall 2.7.2
rbenv install 2.7.2

解決した

$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]

他のも全て同じ方法で解決した

もっとややこしい問題だと思ったけどコレで済んでよかった

気づいたこと

...
Downloading openssl-1.1.1h.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/5c9ca8774bd7b03e5784f26ae9e9e6d749c9da2438545077e6b3d755a06595d9
Installing openssl-1.1.1h...
Installed openssl-1.1.1h to /Users/SolunaEureka/.rbenv/versions/2.7.2
...
ruby-build: using readline from homebrew
...

なぜかopensslが入れ直された あとruby-buildnode-buildpython-buildもみんなopensslreadlineを使っとる そしてpython-buildだけ/usr/local/Cellar/にない,なにゆえお前だけ/usr/local/bin/にある… (昔の記憶がもう残っていないから不明)(brewは取り扱っていないらしい)

MathJax v3.x メモ-1 MathJaxの導入

現在の最新版は8/25リリースのv3.1らしい

MathJax公式ドキュメント

何かあったらこ↑こ↓を読んでくれよな〜頼むよ〜

注意

ちょっと頑張って和訳したり実験したりしているだけです,あんまり本気でアテにするなよ…?

前提

(特には)ないです.

MathJaxの導入

最も基本の型

こ↑こ↓にある通りだと

<script type="text/javascript" id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
</script>

<head></head>にぶち込めばおk. ちなこのcdn.jsdelivrはこのままだと強制的に最新版を読み込ませてくるので,それが嫌なら

<script id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3.x.y/es5/tex-mml-chtml.js">
</script>

のように,指定したいバージョンを@3.x.yみたいにフル記述してやればおk. これでもうバージョン管理は…完璧やな!

概念として

「html本文を読み取った内容を読める数式として出力する」という性質上,html本文に記述する入力とページに表示される出力のそれぞれに,方式が2つずつ存在する. 入力ならば

  • TeX
    • みなさんお馴染みのまさしくアレ
  • MML
    • XMLとしてXHTMLにぶち込まれる

,出力ならば

  • chtml
    • どうやらこれはCSS+HTMLを意味するらしい,決してCompact HTMLではない
  • svg
    • どんだけ拡大しても品質が劣化しないヤツ,これを生成して直に埋め込むらしい

,これをどう設定するかによって最初の話からがらりと変わってくる…のだが,俺はTeXsvgが好きだからよ,折角だしTeX入力・svg出力を選ぶぜ!

用途ごとの使い分け

じゃあさっきの例だとtex-mml-chtml.jsを呼び出すということだ,そしてこれは「tex型の入力もmml型の入力も受け入れてchtmlで出力する」ということ,他のパターンならこ↑こ↓にある通り

なんか-fullって付いてあるのが強そうだな!じゃあ俺は

<script type="text/javascript" id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg-full.js">
</script>

<head></head>にぶち込んでやればいいんだな!

☝️-fullってなんだよ

こ↑こ↓によると,TeXの入力の処理に使うライブラリを事前に全てロードさせるオプションらしい.

更なるオプションについて

実は最初のロードの時点で使うライブラリやその動作の設定自由自在にできたりする,TeXのオプションだったりMathMLのオプションだったりAsciiMathのオプションがある,その上でTeXにはこれだけのライブラリを個別に使い分けられるだからこれほどまでにTeXを勧めているという節もある. じゃあ試しに書いてみるか,さっきのinput/tex-fullのとこには

This is the most complete TeX input component. It includes the main TeX/LaTeX input parser, along with all the TeX extensions, and is configured to enable all of them other than physics and colorv2. You can add these two to the packages array in the tex section of your MathJax configuration, though you should remove the color extension if you add the colorv2 extension, and should remove the braket extension if you enable the physics package. これは最も完全なTeX入力コンポーネントです。 これには、メインのTeX / LaTeX入力パーサーとすべてのTeX拡張機能が含まれており、物理学とcolorv2以外のすべてを有効にするように構成されています。 これら2つをMathJax構成のtexセクションのpackages配列に追加できますが、colorv2拡張機能を追加する場合はcolor拡張機能を削除し、physicsパッケージを有効にする場合はbracket拡張機能を削除する必要があります。

って書いてある,つまり-fullした上で更にcolorbracketを減らしてcolorv2physicsを入れることができる(そしたらコマンドの重複がなく安全に動作する)らしいな? こ↑こ↓の全体像とこ↑こ↓の説明

This array lists the names of the packages that should be initialized by the TeX input processor. The input/tex and input/tex-full components automatically add to this list the packages that they load. If you explicitly load addition tex extensions, you should add them to this list. For example: この配列は、TeX入力プロセッサによって初期化される必要があるパッケージの名前をリストします。 input / texおよびinput / tex-fullコンポーネントは、ロードするパッケージをこのリストに自動的に追加します。 追加のtex拡張機能を明示的にロードする場合は、それらをこのリストに追加する必要があります。

そしてこ↑こ↓の例文を見る限りだと,なんだか

MathJax = {
  loader: {load: ['[tex]/colorv2', '[tex]/physics']},
  tex: {
    packages: {
      '[+]': ['colorv2', 'physics'],
      '[-]': ['color', 'bracket']
    }
  }
};

というような形が推奨されているように思うなぁ…

urlとライブラリの対応関係

  • input/tex-base
    • baseのみ
      • requireautoloadも入ってないので,本文中のTeX記法からの拡張が不可能になる
  • input/tex
    • base
    • ams
    • newcommand
    • require
    • autoload
    • configmacros
    • noundefined
    • 管轄外のコマンドを呼び出すと,physicscolorv2以外なら勝手にrequireする
      • ちなみに自分でrequireで明示的に呼び出した方が整理しやすいらしいよ
  • input/tex-full
    • physicscolorv2以外の全て
      • その2つはbracketcolorと差し替えできる

以上からわかる通り,別にTeX専用のライブラリに限らずとも,そもそもInputのコンポーネントOutputのコンポーネントも同じくライブラリの扱いであり,単に指定しなければsrcの先のurlに-fullがあるか否かでロードする中身を勝手に決めているだけである.

requireautoload

requireの出来る仕事は本家TeX並みに強く,説明ページには

The require extension defines the non-standard \require macro that allows you to load extensions from within a math expression in a web page. require拡張機能は、Webページの数式内から拡張機能をロードできるようにする非標準の\ requireマクロを定義します。

とあり,つまりコイツさえ入れれば各ページでrequireすることで逐次にロードできる.

他方でautoloadTeXコマンドとロードするライブラリとの対応関係を事前に定義するものであり,そのTeXコマンドをWebページの本文に打っておくと最初にロードされる. 説明ページを見てもrequireとは準備や挙動が全く異なることがわかるが,TeX本家にはなさげな見慣れない機能なので,試しに動作する例を示すと

MathJax = {
  loader: {
    load: ['input/tex-base', 'output/svg', '[tex]/autoload']
  },
  tex: {
    packages: {
                    '[+]': ['base', 'autoload']
    },
    autoload: {
      boldsymbol: ['boldsymbol']
    }
  }
}

スクリーンショット 2020-11-30 0.13.31.png

後述するloader: {load: []}tex: {packages: {}}とは無関係にロードを行うことができる,という点はrequireと共通している

最小構成のやり方について

ん?先に挙げた最小構成オプションの選択肢に対応するようなURLがこ↑こ↓のリストに載ってないやん!と思う方も中にはいるかもしれない. だがしかし,そもそもこのMathJaxオブジェクトの中のloader: {}(の中のload: [])こそが,ページがロードする中身を事前に決め打ちできるレシピのような存在なのである.早い話が例えば

MathJax = {
  loader: {load: ['input/tex-base', 'output/svg']},
  tex: {
    packages: {
      '[+]': ['base']
    }
  }
};

とすれば,取り合えずは(使えるかどうかは置いといて)最小構成となる. 更にrequireautoloadを含めて柔軟性を高めた最小構成であれば

MathJax = {
  loader: {load: ['input/tex-base', 'output/svg', '[tex]/require', '[tex]/autoload']},
  tex: {
    packages: {
      '[+]': ['base', 'require', 'autoload']
    }
  }
};

と設定してやるのが妥当であろう.

しかしそう設定したところで,srcの先のurlを

<script type="text/javascript" id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>

やら

<script type="text/javascript" id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg-full.js">
</script>

やらとやってしまって良いのだろうか?いや,やっぱりそれはよくない(反語). 後述するstartup用いなければMathJaxの指定通りのロードは完璧にはできない. そしてドキュメントには仕様が載っていなかったので,自分でやって比較してみた…

fullを選ぶ

startupを選ぶ

下の方が指定通りのロードをしていそうなことがわかる. よって突き詰めるのであれば

<script type="text/javascript" id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/startup.js">
</script>

を選択することが正しいと考えられる.でもurlを打てば一括でロードできちゃうのは楽なんよ

まだまだあるよ!ライブラリ

別にライブラリがあるのはTeXに限った話ではないし,面白い機能もあったりする.

アクセシビリティ

さっきのload: []に入れると使えるらしい.

  • a11y/semantic-enrich
    • 数式に読み仮名を振る,読み上げ機能がある端末に対応できる
  • a11y/complexity
    • 複雑すぎる式を折り畳んでくれる,クリックすれば元に戻る
  • a11y/explorer
    • Tab(↹)とかを押してWebページの中で数式を移動できる
      • a11y/complexityと組み合わせられる
  • a11y/assistive-mml
    • MathMLを利用する読み上げ機能がある端末に対応できる
      • a11y/semantic-enrichが必要

ここまでを全部載せすると…?

<script type="text/javascript" id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg-full.js">
</script>
MathJax = {
  loader: {load: ['[tex]/colorv2', '[tex]/physics', 'a11y/semantic-enrich', 'a11y/complexity', 'a11y/explorer', 'a11y/assistive-mml']},
  tex: {
    packages: {
      '[+]': ['colorv2', 'physics'],
      '[-]': ['color', 'bracket']
    }
  }
};

tex: {packages: {}}が設定するのはTeXのタイプセット処理にどのライブラリを用いるかのみであり,アクセシビリティのライブラリはそれとは無関係なので,loader: {load: []}の中に記載するだけでおk.

その他

  • startup
    • 先にある通り,srcの先のurlの末尾をstartupにすると,loader: {load: []}で指定したライブラリを決め打ちでロードできる
    • 同時にライブラリとしても存在し,loaderを動かしてロードさせた後にタイプセットまでを行う
    • オプションでロードやタイプセットに関する挙動を制御できる
  • ui/safe
    • ユーザーがWebページ上に入力する際に,変なコードが紛れて走らないように防御できる
    • 基本的にhtmlコードに関してであり,オプションで制限する内容をカスタマイズできる
  • ui/menu
    • 数式を右クリックすると出現するメニューを追加する
    • 先のアクセシビリティの注意書きには「機能が被っているので別々に読み込まなくても良い」って書いてる
      • つまりアクセシビリティを突っ込んだからコレと同じものが勝手に読み込まれるらしい
      • ただしコレ単体でもソースコードを表示したり拡大縮小したりchtmlとsvgを切り替えたりはできる
    • あと「自動で折り畳まれる機能はv3.x.yにはまだない」って書いてある
    • オプションで表示や機能の設定をカスタマイズできる
  • adaptors/liteDOM
    • ブラウザのDOMに対して直接のアクセスができないもの(nodeのアプリとか)でMathJaxのタイプセット等を実行するために,ブラウザのDOMの代替品を実装させる
    • …というものらしいが使ったことがない
  • core
    • その他の機能の全てを含む,基本的には勝手に操作されるので弄らなくてもいい
  • loader
    • startupが自動で持ってくるライブラリで,追加のライブラリをロードする
    • オプションでロードするライブラリの中身やロードの設定をカスタマイズできる

loaderのオプション

オプション自体はこ↑こ↓が公式ドキュメント,機能の一覧を見ると割と使いそうなものも…?

MathJax = {
  loader: {
    paths: {mathjax: Loader.getRoot()},          // the path prefixes for use in specifying components
    source: {},                                  // the URLs for components, when defaults aren't right
    dependencies: {},                            // arrays of dependencies for each component
    provides: {},                                // components provided by each component
    load: [],                                    // array of components to load
    ready: Loader.defaultReady.bind(Loader),     // function to call when everything is loaded
    failed: function (error) {                   // function to call if a component fails to load
      console.log(`MathJax(${error.package || '?'}): ${error.message}`);
    },
    require: null                                // function to use for loading components
  }
};

loader: {load: []}

今まで何度も出たしもういいよね…

loader: {paths: {}}

[xxx]/yyyってなんだ?

loader: {paths: {}}が関係する,例えばxxxのソースのurlが

MathJax = {
  loader: {
    paths: {xxx: 'https://example.com/xxx'},
  }
};

と定義されれば,その下のyyy

MathJax = {
  loader: {
    load: ['[xxx]/yyy']
  }
};

でロードできる,更に数珠つなぎにしてしまえば

MathJax = {
  loader: {
    paths: {
      xxx: 'https://example.com/xxx',
      yyy: '[xxx]/yyy'
    },
    load: ['[yyy]/zzz']
  }
};

となる,すなわちTeX系のライブラリにおいては

MathJax = {
  loader: {
    paths: {
      tex: '何かしらのurl',
    },
    load: ['[tex]/何かしらのライブラリ']
  }
};

みたいな構造になっていると推測される.

ちなみにさっきの最小構成においてloader: {load: []}を以下のように改変すると…

MathJax = {
  loader: {load: ['input/tex-base', 'output/svg', 'tex']},
  tex: {
    packages: {
      '[+]': ['base']
    }
  }
};

スクリーンショット 2020-11-29 20.34.26.png

MathJax = {
  loader: {load: ['input/tex-base', 'output/svg', '[tex]']},
  tex: {
    packages: {
      '[+]': ['base']
    }
  }
};

スクリーンショット 2020-11-29 20.34.47.png

要するに最終的に末端で確実にファイルが手に入るようなurlにならないとCDNに突き返される,こんな横着みたいな一括ロードはできないそりゃそうじゃ

更に,

MathJax = {
  loader: {load: ['input/tex-base', 'output/svg', '[tex]/boldsymbol.js']},
  tex: {
    packages: {
      '[+]': ['base', 'boldsymbol']
    }
  }
};

スクリーンショット 2020-11-29 20.56.36.png

MathJax = {
  loader: {load: ['input/tex-base', 'output/svg', '[tex]/boldsymbol.js']},
  tex: {
    packages: {
      '[+]': ['base', 'boldsymbol.js']
    }
  }
};

スクリーンショット 2020-11-29 20.57.55.png

tex: {packages: {}}にはちゃんとライブラリの名前を表記しなきゃいけない割にはloader: {load: []}はurlの体を成してさえいればおkらしい…

loader: {source: {}}

xxx/yyyってなんだ?

絶対urlを設置できるloader: {source: {}}が関係する,例えば

MathJax = {
  loader: {
    source: {
      'xxx/yyy': 'https://example.com/xxx/yyy.js'
    },
    load: ['xxx/yyy']
  }
};

となる,すなわちアクセシビリティ系のライブラリにおいては

MathJax = {
  loader: {
    source: {
      '何かしらのライブラリ': '何かしらのurl',
    },
    load: ['何かしらのライブラリ']
  }
};

みたいな構造になっていると推測される. 見ての通りで1対1構造の決め打ち方式であり,loader: {paths: {}}のような拡張性はない.

dependencies: {}provides: {}

dependencies: {}はライブラリ間の依存関係を記憶するリストであり,startupload: []'の依頼に基づきdependencies: {}を使って必要な(ロードするべき)ライブラリを考えprovides: {}に列挙していく. すなわち最終的にロードされるライブラリの実態はprovides: {}に現れる,先に述べたurlとライブラリの対応関係はこれで実現されているとも言える,ドキュメントにも

loader: {
  provides: {
    'input/tex': [
      'input/tex-base',
      '[tex]/ams',
      '[tex]/newcommand',
      '[tex]/noundefined',
      '[tex]/require',
      '[tex]/autoload',
      '[tex]/configmacros'
    ]
  }
}

みたいな例が載っているし多分そう. また基本的なライブラリであればdependencies: {}は既に完全に整備されている.

そもそも普通にMathJaxを使うだけなら(コピー品や独自品を自前のサーバーから配信したいとか出ない限り),loaderにわざわざ手を加える場所は何もなさそうだけど…

その他のオプション

投げられる関数だったりエラーの処理だったり色々とあるけど,もういいよね…

startupのオプション

オプション自体はこ↑こ↓が公式ドキュメント,ロードとタイプセットの挙動を弄るのはもう完全に動的なサービスを作りたい人くらいだと思うので,パスさせていただきますね…

それにタイプセット自体のお話はまた後述…

男npm,direnv,node-casl2-comet2らによるアセンブラ体験

ちょっとだけCASLⅡとCOMETⅡ絡みのおべんきょがあった

流石に4日だけじゃ0からスタートして浮動小数点のIOと四則演算の実装なんてのは無理だったな

内容

ひみつ♡(もうちょい経ったら後悔するかも)

CASLⅡとCOMETⅡのシミュレーション環境といえば

IPA本家のライブラリ(Javaで動く)

こ↑こ↓ でもオラJava使ったことはねぇし,Java SE 8はライセンスがダメで無料じゃ使えねぇって聞いたぞ… 触ったことのねぇJDKってやつやOpenJDKってやつやAdoptOpenJDKってやつに立ち向かって環境構築して,そっから更にCASLⅡとCOMETⅡに触れるってのは,いくらなんでも素人には無理があっぞ!

いろんなWebサイト

でもオラ途中でぜってぇ嫌になっぞ!VSCodeとterminalでパチパチやりてぇんだ!

古の謎exeファイル

macOS Catalinaが実行を許すわけねぇだろ!?

救いの手

最強のCASL2/COMET2環境 by @maxfie1d ひゃ〜,こりゃどえれぇガチプロ様に出会った!オラとてもラッキーだ! npmなら昨年ちょこっと触ったことがあったからな!いける気がすっぞ!

方針

  • npmがあるといいよね
    • nodeはそんなに関係しないよ
  • direnvで環境を組み分けよう
  • node-casl2-comet2を利用させていただく
  • ついでにVScodeの機能拡張についてもだな…
  • すみません,まだbashを使っています…
    • そもそも開発者ではないので…nodeあたりのツッコミどころ満載ですよね.すんません

準備

homebrewを揃える

同じような情報はいっぱいあるだろう,それを踏まえながら公式サイトを見れば良いのではないか…?

node,nodenv,npmを揃える

$ brew install nodenv
ここで$PATHチェックだ
export PATH=$HOME/.nodenv/shims:usr/local/bin/nodenv:$PATH
$ source ~/.bashrc

人によっては違うかもしれねェが…ウチのnodenvnodenpmもコレで動き続けている…

$ nodenv install -list

今回はそこまで関係ないと思うが,取り敢えず新しいものを入れておこう…

$ nodenv install 15.3.0

すると勝手にnpmがついてくるはずだ…ということで

$ node -v
$ npm -v

を打ってちゃんとバージョンが表示されたら成功だ…

direnvを揃える

今回のサブ主役だ…

$ brew install direnv
ここで$PATHチェックだ

詳しい動作はあとでやるがここでおまじないだ,この文

eval "$(direnv hook bash)"

.bashrc付け加えてからもう一度

$ source ~/.bashrc

詳しい解説はいまさら direnv の解説 by @ngyuki にある,そちらを参照されたし… 更にこれが有名かどうかわからないので公式ドキュメントを貼っておく. bashhookしたのは見てわかるけど,なんでコレで動くのかがわからない…

node-casl2-comet2を揃える

アセンブラファイルを置いときたいディレクトリに行ったら

$ npm install @maxfield/node-comet2

なお,npm initをする必要はないもよう

えっグローバルインストールじゃないやん

たしかにIPAの試験に立ち向かうためならいっそ気合入れてグローバルインストールしても良いかもしれません. その場合は

$ npm -g install @maxfield/node-comet2
$ npm root -g

でちゃんとパスを確認して,通ってなかったら同じ要領でパスに追記してあげてください… そしたらdirenvの出る幕もないと思われます…

(私はただ-gに入れた後の管理をやりたくないからやめといただけです)

VSCodeのインストール

同じような情報はいっぱいあると思うけど,とりあえず公式サイトを読めばわかるんじゃないかな…?

ここで$PATHチェックだ

⌘+Pで出てきた場所に>Shellって打つとShell Command: Install 'code' command in PATHって出るのでやっておこう,/usr/local/bin/codeのシンボルが生成されるのでbash$PATHのレンジに入る

ここで$EDITORチェックだ

更にさっきの要領で

export EDITOR=code

を継ぎ足して

$ source ~/.bashrc

…これでデフォルトの$EDITORVSCodeになったよ!他のエディタ?知りませんね…

direnvの本領発揮

node-comet2のシンボルは./node_modules/.binにあるがそんなパスは用意していないし,かと言ってわざわざ.bashrcに書き込む気も起きない,だからディレクトリごとにそこら辺を弄れるdirenvを召喚した…! (だからこういう場所で何も考えずに連打してもcommand not foundしか出ない,nodeとは事情が違う)

.envrcを作る

$ direnv edit

ここで$EDITORが通ってなくてエラーを吐かれてしまった…あると一発でVSCodeが開く

.envrcを書く

export PATH=$PATH:./node_modules/.bin

保存OK?

direnvを起動させる

その場で

$ direnv allow

はい,これでこのディレクトリの変数が書き換わりましたっ…!

ちなみにそこから出ると

direnv: unloading

また入ると

direnv: loading ~/xxx/yyy/.envrc

実験

ここからがようやくいよいよアセンブラの世界だ…

ファイル生成

$ touch test.cas

アセンブリファイルの拡張子は.casで固定っす.

ファイル編集

超絶簡単なモノで良いっすか?

IO      START
        IN      INPUT,   INPUTL
        OUT     INPUT,   INPUTL
        RET
INPUT   DS      256
INPUTL  DS      1
        END

本当にただ吸って吐くだけなんですけど… (アセンブラそのものに関しては,ちゃんとすごい人の記事をみなさま読んでください,私も読もうとしています)

コンパイル

$ node-casl2 example.cas 

これでよし (オプションとかは製作者様のgithubを参照)

実行

$ node-comet2 example.com

実行ファイルの拡張子は.comで固定っす. するとこんな画面が現れます

PR  #0000 (     0) [IN     #0007, #0107        ] STEP 0
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
> argaethasjtsrjryjs
PR  #0003 (     3) [OUT    #0007, #0107        ] STEP 1
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
argaethasjtsrjryjs
PR  #0006 (     6) [RET                        ] STEP 2
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s

> sは実行オプションで

h    対話モードのヘルプを表示します。
q    プログラムの実行を終了します。
r    対話モードを終了してプログラムを実行します。
s    命令を1つ実行します(ステップ実行)。

のどれかを押してEnterすると進みます

そう,レジスタや関係する主記憶の動きを刻々と追跡できる!これはすげぇ…

経過が要らないなら

$ node-comet2 -r example.com

それでも入力が求められた時は流石に止まりますけど…

感想

ライブラリが整備されているCってとっても高級な言語なんだなぁと… 符号付き整数のIOの実装だけで苦しみました,浮動小数点のIOの実装なんて今の私には全く無理でした…ヒェッ…

おま○け

CASLⅡ・COMETⅡむけのVSCode拡張機能!…も,@maxfie1d様製だった… これがガチプロの世界か… (色々やれることが多すぎてまーったく使いこなせてないけど補完は助かる)

スクリーンショット 2020-12-01 18.15.58.png

NTT東日本管内での ONU(HGW)の取り扱いおよびv6プラスへの変更に関するメモ

ん?まーたテレワークの機運が高まっているな?

ぶっちゃけIPv6とIPoEに憧れていて,これを機に回線契約をv6プラスにした人も多そう

2021年6月ごろ

大幅に改定しました,自分で好きに使おうと思ったら調べ物をする必要があったので,その結果をなるべく正しい認識になるように反映させてもらいました
ちなみに光電話ありきで話しています
各種設定やメンテナンス等にも簡単に触れています

NTTの光回線のv6プラスの仕組みについて

大雑把に書く

概観

基本的にはJPNEのv6プラス紹介ページにある以下の図の通り
概観
参考・https://www.jpne.co.jp/service/v6plus/
とりあすはここを読めばあらかたを知れると思う

JPNEとは?

日本ネットワークイネーブラー株式会社の頭文字
IPoE接続を提供するVNE事業者(後述)の一員であり,黎明期から携わってきた

ユーザーが知っておくべきこと

ネットワーク構成が完全にIPv6 IPoEになる

PPPoEの構成は自力で追加しない限りは存在しないし,IPv4ネットワークにはv6プラスの機能があって初めて接続できる
なので従来の回線認証もIPv4アドレスもない,手間が省けるのと同時にユーザー視点ではブラックボックスな領域が増える

NGNONU,HGW,VNE,それぞれの役割

NGN

NTTがつくった次世代の回線網,光ファイバで繋がれまくっている爆速の回線
特にIPv6構成されているものをv6プラスは利用している,NGN網と呼ばれる

ONU

NGN網の末端の基地局から伸びてくる光ファイバを受け入れる機器

HGW

光電話,およびその他の宅内にある機器を,NGN網を接続する機器

VNE

事業者一覧・https://www.ntt-east.co.jp/info-st/ipoe_menu/ 従来まではISPの各社がそれぞれで自前の機器を使ってPPPoEセッションを扱っていたが,v6プラスではNGN網からVNE事業者の機器を通されてインターネット網に接続される,ISP事業者はVNE事業者に対して相乗りしていると言える
小規模なISP事業者が小規模なVNE装置に小規模に投資してもシステム全体を見ると効率が悪くなる,ゆえに相応の規模と機能を持つ以下の9社

が現在のVNE事業者の一員である(予定では最大16まで増えるらしいが)

ISP事業者を選ぶのも大事だが,かつてISP事業者にもやったようにVNE事業者の空き具合を見るのも大事になったかもしれない しかし少なくとも下手なPPPoEよりは確実に早くなるので気にしなくて良いと思う

ONUとHGWについて

一体化されているか,それとも別々か

両方ありえるが,最近は一体化されたONU兼HGWというものが多い,というよりも多分そっちになると思う
ただし10Gbps回線になると別々の機器として提供される,2Gbpsまでなら一体化されていると考えて良い

役割の違い

大前提としてHGWは光電話をIP電話として機能させるために存在する,これはONUだけで実現できない(電話線用の実装や処理が必要なので)とされる
そのついでに他の宅内にある機器をインターネットに接続させたり,プライベートなネットワークを構成したりのサポートもHGWがやっている

そしてONUの出口とHGWの出口では,インターネット上におけるレイヤ位置もプロトコルも違うので,ONUの出口にそこらの普通の機器を繋いでも使い物にはならない,専用のお高いスイッチ機器を使えばHGWの代わりに動作するらしいが…?
(HGWとONUが一体化されているならこんなこと気にしなくても良い)

IPv6アドレスの構成方法

128bitというのはあまりにも有名

NGNがくれるもの

前56bitまで,ONUに対して固定で投げてくる

ONUがくれるもの

前64bitまで(+4bit)←これ残り4bitはどうなってるんだろうか
4bit分をHGWに寄越すので,ONUの下には前述の専用の機器を(HGWを除いて)15個は置けるらしい

HGWがくれるもの

128bit全部(+64bit)
ユーザーの端末に与えられる

どうやってIPv6通信とIPv4通信を相互に交換するのか

参考・https://www.nic.ad.jp/ja/materials/iw/2016/proceedings/t04/t4-sahara-2.pdf
ちょっと長いスライドだけど

交換する方式の違い

  • トランスレーション
    • パケットを書き換える
    • 元のパケットは機械的に取り出せない
  • トンネリング
    • パケットを内包する
    • 元のパケットは機械的に取り出せる

※大まかに2つ

交換する場所の違い

NATとはアドレスの変換のことだが,グローバルでユニキャスト(インターネットに繋がっていればまず辿り着ける)がデフォのIPv6による通信(ローカルアドレスマルチキャストアドレスもあるが割愛)を,グローバルでユニキャストなIPv4による通信に変換することを指す
ところがIPv6IPv4よりもアドレスの総量がはるかに多いため,対応するIPv4アドレスの割り振りに難儀する,そのため32bitで表現されるIPv4アドレスに加えてポート数を用いることで,グローバルでユニキャストな1つのIPv4アドレスを複数のユーザーで共有するNAPTを利用する
従来のIPv4においても宅内のLANと外界のインターネットを繋げるためにNAPTは既に使われているが,ローカル・グローバル間の4to4のNAPTと呼ばれるのに対し,こちらはグローバル・グローバル間の6to4のNAPTと呼ばれる

要するに通信経路上でグローバルIPv4アドレスを与えられるのはどこという話である

  • ISP NAT
    • ISP事業者側の収容装置で行う
  • CPE NAT
    • ユーザー側の終端装置で行う

※大まかに2つ

MAP-Eとは

トンネリングかつCPE NATな方式であり,v6プラスにおいて採用されているものである
CPE NATに必要な情報はNGNからHGWに降ってくるので,HGWを設置して接続した瞬間に確定する(v6プラスの開通手続きをしていれば),ユーザー情報はNGN上のVNE側装置やその他のサーバに勝手に送られているのでPPPoEのような回線認証は不要になる(これがIPoEの強みである)し,HGWが勝手に状況を管理してくれる
その他の方式については割愛

自前でHGWを用意する場合

先に挙げたように専用のお高いスイッチ機器で自前でHGW機能を代替したい場合,ONUの直下に置くかMAP-Eが無効になっているHGWの直下に置く必要があるとされる
HGWがMAP-EをやっちゃうとそのHGWの配下からはMAP-Eに手出しできないのだ
(逆に言えばONUは単純に光ファイバと同軸線の変換とグローバルIPv6アドレスの管理しかやってないと言えそう)
参考・http://www.rtpro.yamaha.co.jp/RT/docs/v6plus/

IPv4アドレスの構成

後述する通り,ユーザーが使えるグローバルIPv4アドレスとそのポートは限られているが,逆に許されたグローバルIPv4アドレスとポートであればHGWからの開放も可能であり,当然だがポートの変換にも対応している
任意のローカルIPv4アドレスの任意のポートに転送する機能もある
が,一般的な利用においてはその結果がどうなっているのかを知る術は少ない

HGW(ONU)の設定の備忘録

設定上の注意

  • HGWに繋いだマシンからブラウザのGUIを介してできるようになっているぞ
  • 設定を変更した際に取り返しのつかないことが起きないように気をつけよう
    • 万が一そういう事が起きても大丈夫なように設定ファイルを保存しておこう
    • 流石にHGW設定画面にたどり着けなくなることはないとは思うけど…
  • HGWの種類によってはファームウェアの表示や機能に差があるかもしれない

メイン設定画面

スクリーンショット 2020-11-29 2.12.35.png

場所

  • http://192.168.1.1
    • 初期設定だとほぼ必ずこうなっているはず
    • わかんなくてもネットワークの画面にルーターの位置が書いてあるのでわかるはず
      • スクリーンショット 2020-11-28 18.49.25.png
      • これをブラウザで叩けばよい

中身

  • 基本設定
    • 接続先設定(IPv4 PPPoE)
      • v6プラスでの通信に成功していると,一切の編集ができなくなる
    • 接続先設定(IPv6 PPPoE)
      • v6プラスでの通信に成功していると,この項目そのものが消える
  • 電話設定
    • ひかり電話共通設定
      • 品質設定など
    • 内線設定
      • HGWに対するTELポート接続orネットワーク接続,そしてひかり電話対応機器で増設できる
      • 実際にやったことがないので詳細はわからないが,ブラウザから以外にも電話機からもできるらしい
    • 光回線ひかり電話に対応するルーターが扱えるTELポートと電話機は2つまでが標準
      • スクリーンショット 2020-11-28 22.16.04.png
    • つまりいくらTELポートがあったとしても,電話線で接続できる電話機は2つまでに限られる
  • 無線LAN設定
    • 無線カードや無線機能がない限りでは設定はできない
      • 市販のWifiハブの方が使い勝手はいいのでそっちでよくね
  • 詳細設定
    • DNS設定
      • ローカルでDNSサーバーを立てて振り向かせたい時に使う…らしい(使ったことない)
    • DHCPv4サーバ設定
      • HGWの直下の機器にローカルIPv4アドレスを配布する際の設定
      • HGW側のローカルIPv4アドレス(192.168.1.1),および配布時の開始ローカルIPv4アドレス・その割り当て数・リース(リフレッシュ)時間
      • MACアドレスで決め打ちしてローカルIPv4アドレスを固定して配布する機能もある(後述)
      • ハブ(Wi-Fi等)をブリッジモード(APモード)で使う場合はその配下の機器まで全てHGWのDHCPv4サーバの管理下になる
    • SPI設定
    • IPv4パケットフィルタ設定(PPPoE)
      • 通信のフィルタリングができる
      • 無効→無防備,標準→「フレッツ光ネクスト網内で折り返す通信(NTT東日本NTT西日本との契約により可能となるもの)は許容」(本文ママ),高度→外から自主的に来るものを全部NG
      • v6プラスでの通信に成功していると,この項目そのものが消える
    • IPv6パケットフィルタ設定(PPPoE)
      • 機能は上に同じ
      • v6プラスでの通信に成功していると,この項目そのものが消える
    • IPv6パケットフィルタ設定(IPoE)
      • 機能は上に同じ
      • v6プラスでの通信に成功していると,この項目が使用可能になる
      • IPv6アドレスはプレフィクスを用いて一括で指定できるのが特徴
    • LAN側静的ルーティング設定
      • 「HGWの直下にルータ機能を持つハブ(Wi-Fiとか)を置き,その直下に機器(プリンターとか)を置き,HGWに直接つないだPCからHGWとルータハブを通してその機器に接続したい」…みたいな時は,ルータ側とONU側で被らないようローカルIPv4アドレスを設定した上で,静的ルーティングの設定で「HGWとルータの接続経路」を明示しちゃんと通信を導いてあげないと,当然だがデフォルトでは通信が全て弾かれる
      • あくまでも一般人が快適に過ごす程度であれば,HGW下のハブは全てブリッジモード(APモード)で使うのが最も楽,HGWに全部任せてしまおう
    • 高度な設定
      • PPPoEブリッジをオンにすると,HGWの下で独立したPPPoEセッションを立てた時に,その通信を見極めて素通りさせてくれる(使ったことはない)
      • アップデートは自動でいい
      • 何か他にも色々あるのでONUファームウェアに備え付けのヘルプページを見て欲しい,大して役に立たない場合がほとんどなのでそれからググろう
  • メンテナンス
    • 機器設定用パスワードの変更
      • 要するにログインするユーザ名とパスワード,忘れないように
    • 設定値の保存&復元
      • 設定ファイルを生成してPCに保存したりそれを使って設定を復元したりできる
    • ファームウェア更新
      • アップデート用のファイルをPCから渡してやらせることもできる…が,普段なら勝手に更新を確認してアップデートしてくれる
    • 何か他にも色々あるのでONUファームウェアに備え付けのヘルプページを見て欲しい,大して役に立たない場合がほとんどなのでそれからググろう
  • 情報
    • 現在の状態
      • ONUとHGWの基本情報がわかる
    • 通話ログ
      • お電話の履歴が覗ける
    • DHCPクライアント取得情報
      • グローバルIPアドレスを配布するDHCPサーバー情報を表示してくれる
      • DHCPv4とDHCPv6およびIPoEとPPPoEで別々に存在し,v6プラスでの通信に成功していると,DHCPv6 IPoEとDHCPv4 IPoEの2つが表示される
      • ちなみにIPv6DNSサーバーはNTT東日本が建ててくれた2404:1A8:7F01:A::3および 2404:1A8:7F01:B::3が提供される,NTT西日本はわからん
    • DHCPv4サーバ払い出し状況
      • HGWが下の機器にどれだけローカルIPv4アドレスを配布したかを表示
    • DHCPv6サーバ払い出し状況
      • ONUが下の機器にどれだけグローバルIPv6アドレスのプレフィクス部分を配布したかを表示
      • ONUがHGWに1個すでに払い出しているので,残りは15個のみ(現状)
      • あくまでHGWが下の機器に払い出したグローバルIPv6アドレスのことを意味してはいない
    • セキュリティログ(IPv4)
      • 結構な量が弾かれていたりする
      • 代表するパケットフィルタ設定(v6プラスでの通信に成功していると,IPv6パケットフィルタ設定(IPoE)が相当する)が適用される
    • セキュリティログ(IPv6)
      • こちらも結構な量が弾かれていたりする
      • こちらも代表するパケットフィルタ設定が適用される
    • 何か他にも色々あるのでONUファームウェアに備え付けのヘルプページを見て欲しい,大して役に立たない場合がほとんどなのでそれからググろう+

ちなみにここQ&Aによると…

NTT 東日本が設置しているデフォルトの DNS サーバー (「2404:1A8:7F01:A::3」 および 「2404:1A8:7F01:B::3」) に対して、本サービスの DDNS ホスト名の解決クエリを送信するだけで、本サービスの DDNS ホスト名に関連付けられた IPv6 アドレスの応答を受けることができます。

IPv4設定

スクリーンショット 2020-11-29 2.14.38.png
さっきのメイン設定画面とは別の場所にコイツがいたりする
IPv6のネットワーク網を用いるサービスに切り替えるとIPv4に関連する設定がONUのメイン設定画面ではできなくなるので,その代わりにコイツを使う

場所

配信済事業者ソフトウェア一覧

スクリーンショット 2020-11-29 2.14.54.png

  • http://192.168.1.1:8888/t
    • 実はIPv4設定とはこのソフトウェアの一種だったのだ!
    • IPv6での通信に成功していると,IPv4設定が1つ目に表示される,なので別にv6プラスを適用してIPoEの通信をしなくても表示される
      • 稀にバグでコレが消えてしまう場合があるらしいが,その場合はメイン設定画面でPCから設定ファイルを渡して読み込ませることで復活させられる
      • …でも配信済ソフトウェアがこれ1個だけってもったいなくない?他にもあるのかなぁ…

中身

  • Topページ
    • ここにはあなたが利用できる(IPv4のネットワーク網からあなたを見た時の)IPv4アドレスとそのポートが表示される,つまりは超絶クソ個人情報に相当する,取扱注意
      • スクショを撮ってネットの海に流そうものなら…
    • 前述の通り,IPv6ネットワークからIPv4ネットワーク網に乗り換えると,必然的に1つのIPv4アドレスを複数人で使うことになり,固定でIPv4アドレスを1つ占有しない限りは65535個のポートの分譲が発生する,好きなポートが使えないという制約がつく
      • 具体的には「連続する16ポートをバラバラに15区分,計240ポート」が割り当てられるらしい
      • IPv4アドレスも使用可能ポートも変わることはなさそう(今のところはそう)
  • IPv4パケットフィルタ設定
    • IPv4の書き方で,通信のフィルタリングができる
  • 静的NAPT設定
    • IPv4の書き方で,ポートの公開と通信の変換ができる
      • 固定でIPv4アドレスを占有しない限りだと前述の通り使用できるポートが限られる,外部に公開するのはTopページにあるグローバルIPv4アドレスとポート,それを変換して内部に通すのはHGWから見た自前の端末のローカルIPv4アドレスとポートになる
      • 固定でIPv4アドレスを占有すれば外部には好きなポートで公開できる,一般的なWebページとかのサーバーを立てるならば占有すべし
      • もしくはIPv6でサーバを立てる,実際IPv6のDDNSがあるので,これなら(パケットフィルタの解除をすれば)自由にポートが使える
  • 高度な設定
    • タイムアウトまでの時間を設定できる
    • 固定でIPv4アドレスを占有している場合は固定アドレスも設定できる
  • ユーザ名/パスワードの変更
    • やったことないしやめたほうがいい

v6プラスへの移行

v6プラスへの移行の流れ

旧来回線から移行するためのステップを示す

IPv6へ移行する

契約内容を変更

回線事業者とプロバイダの双方に確認を取る 料金も変わるかもしれないのでプランの見直しの良い機会かもしれない

ONUとHGWを新調

この時点で必ずv6プラスに対応できるONU・HGWを選定しておく

回線を新調

場合によってはそうなるかもしれない,色々と工事が必要ななケースもある

IPv6へ切り替わるのを待つ

混んでいたら数週間くらいかかるかも,それまではIPv4 PPPoEが適用されている

ONUの設定を確認する

ようこそIPv6の世界へ,ただしこの時点ではまだIPv6 PPPoEが適用されている

v6プラスへ移行する

v6プラスへの移行の手続きをする

プロバイダに申告,大抵の場合はv6プラスは無料のオプションなのでご安心を移行のための料金やその後の利用のが無料じゃない場合があるらしい,それも含めて予算を見た方が良いかも

v6プラスへ切り替わるのを待つ

割とすぐ切り替わった

ONUとHGWの設定を確認する

まずは各種の設定画面の表示がv6プラスにおいてあるべき状態かどうかを確認する
そしてこ↑こ↓のv6プラス接続の確認サイトで全てのチェックをパスするかを確認する
それが終われば…

ようこそ,v6プラスの世界へ!

ルーターの再起動および初期化

どういう時にやるべきか?

  • 動作が重い
  • 通信が切れがち
  • 設定が反映されない
  • パスワードぜんぶ忘れた

みたいな時はまず再起動すると解決するかも
それでもダメなら初期化すると解決するかも(特にパスワード関係)

事前準備

本体設定を再利用できるように,「メンテナンス」→「設定値の保存&復元」から.configファイルを落としておく(暗号化されている)
このファイルを落とした時点で設定されているHGWのログイン用のパスワードが,.configファイルを解凍してHGWに読ませるためのパスワードになる
それすらも忘れたなら初期化して最初から設定しやがれ

ちなみに…http://192.168.1.1:8888/enabler.ipv4/mainの設定内容は保存されないので,スクショかなんかでメモっておくとよし

再起動

方法

「メンテナンス」→「機器再起動」→「再起動」で実行
もしくは本体の再起動ボタンを押す
所要時間は1分

何が起きるの?

普通に再起動するだけ
特に気にする必要はない

何をするべきなの?

特に必要ない

初期化

方法

「メンテナンス」→「設定値の初期化」→「工場出荷時設定に戻す」で実行
もしくは本体の初期化ボタンを押す
所要時間は2分
その後にちょっと設定を要求される

何が起きるの?

順を追って話そう

工場出荷時に戻る

完全にまっさらになる

どっかからISP情報が降りてくる

回線(物理的な意味で)と契約者(住所的な意味で)は一対一の関係をしているので,契約ISPの情報がまず降りてくるっぽい

勝手にIPv4 PPPoEで接続を始める

その契約ISPを相手に通信を始める,ユーザーによる認証は不要
この時だけPPPoE通信の設定画面が見られるようになる
まだこの時点ではhttp://192.168.1.1:8888/enabler.ipv4/mainには接続できない(ソフトウェアがない)

ここでPPPoEを強制的に切ったらどうなるんやろなぁ

勝手にIPv6 IPoEで接続を始める

2分ほどで設定が完了しPPPoE通信の設定画面がグレーアウトする

勝手にv6プラス設定の適用を始める

例のIPv4 over IPv6用のソフトが自動的に落ちてくるっぽい

何をするべきなの?

管理ユーザの登録

ユーザー名とパスワードを設定しよう
hhttp://192.168.1.http://192.168.1.1:8888/enabler.ipv4/mainでは別々の設定が必要になる

設定ファイルの復元

メンテナンス→設定値の保存&復元に行ってファイルを選択,初期化前に落とした.configファイルを引っ張ってくる
当時のパスワードを入力して復元実行する
1分ほどで終わる

IPv4 over IPv6用の設定

http://192.168.1.1:8888/enabler.ipv4/mainの設定をやり直す

v6プラスそのものについてのメモ

そもそも何が利点なんだっけ

  • IPv6が使用可能になる
    • グローバルアドレスがより身近な存在になる
    • ぶっちゃけIPv4同士のNATに魅力がない
  • PPPoEセッションが不要である
    • 小分けされたISP事業者の設備に殺到しない
    • そもそもPPPoEセッションは立ち上がるまでにに効率が悪い
    • なので輻輳が起きづらい(起きないとは言っていない)
  • 結果的には速度が落ちづらい(落ちないとは言っていない)

現実的には

ISP事業者の中にはちょっと前まで「v6プラスならトラフィックが無制限」などと言う組織もあった気がするが,実際は

  • 地元の基地局光回線収容設備の能力
  • それらを結ぶNGN網の通信能力
  • インターネットへと接続するVNE事業者のネットワーク収容設備の能力

といった制約があり,いちユーザーには速度の向上にはもはや限界がある
まずは宅内の機器のネットワーク装置やLANケーブルを見直した方がいい,そこが抜けているといくらいい回線でも端末の通信速度は上がらない

参考文献

以下を読もう

ドンっ!!(10分講座)
ドンっ!!(ガチな仕様解説書)
ドンっ!!!(更にガチな仕様解説書)

IPoEを用いつつIPv6ネットワークからIPv4ネットワークへの通信の接続に用いられる技術である,JPNEのv6プラスやBIGLOBEIPv6オプションが該当するMAP-E方式においては,IPv4ネットワーク行きの通信は HGWでカプセル化されIPv6ネットワーク(NGN網)に流される,そして運ばれた先(NGN網の末端にあるVNE事業者設備)で元の通信に戻され,IPv4ネットワーク上の目的のサーバーに到達する,という流れを経る
このために必要なグローバルIPv4アドレスの操作はHGWが管理する

もう1つの技術であるtransix(DS-Liteも同様にHGWから先の通信経路ではIPv6アドレスが用いられるため,IPv6 IPoEで通信するためにはやはり対応する製品とサービスに変更する必要がある(こちらの方が実装の時期が早かった)
ただし,実際にグローバルIPv4アドレスを与えるのはHGWではなく事業者側の装置ゆえ,ポート開放の設定などがユーザーには簡易に行えないのが欠点である

この仕様の違いによって,対応するONU・HGWの種類が異なっていたが,つい最近になってNTTが双方に対応できるような製品を用意していた

もし自宅の自前の機器を選んでグローバルIPv4アドレスを用いてポート解放するのであれば,HGWでNATが行えるMAP-Eを選ばざるを得ないという現状ではある

その他

はてなブログの記事のヘッダフッタ編集が面白いのでQiitaでもやってほしいけど無法地帯になりそう