www.ntv.co.jp
)tver.jp
)今回は1回目~2回目のような漫画家仲間などからの感想や、ニュースメディアでの紹介は見当たらず。また2回目と3回目であった新聞 TV 欄での言及もありませんでした。
一方で TVer のサムネイル画像(statics.tver.jp
)には全出演者の顔写真が過去の受賞回数とともに表示されています。TVer での配信は期間限定のものであり、配信期間が終わるとサムネイル画像を含めてアーカイブは残らないのでいまのうちに URL ともども保存しておく必要がありますね。
「これって私が間違ってますか?」のテーマで、久米田先生からは完結していない人気作品の評価についてトークがありました。
ご自身が短めの作品を多く完結させてきたことに触れ、打ち切りの回数を評価してほしいと主張。これに対してさんまからは「なに言うてんのあいつ」と厳しい突っ込みがあり、他の出演者も最初は理解ができていない反応をしていたのですが、久米田先生の手前に座っていた伊集院光は「不人気で打ち切りならそれきりだが、次の連載が続くのは周囲の期待があるから」旨の賛同をされていたのは良いフォローでしたね。
ところでこの話は『かくしごと』第17話(単行本4巻に収録)における
未完の漫画に名作など無い
や終わらせる事が出来ていない作品は評価に値しない
といった名セリフが思い出されます。
続くトークでの連載は始めるときより終わらせる方が難しい
の発言はギャグ漫画ながら最終回に定評のある久米田先生だからこそ重みのあるものになっていますし、長い作品ほど広げた風呂敷を畳まないといけない
は僚友・藤田和日郎先生の『からくりサーカス』などを念頭に置いたものではないかと感じた次第です。
ところでなえなののトーク中に「顔を差す」を「俺はカオサス」とボケたさんまに対してツボっている久米田先生のお姿がおもしろかったです。喜怒哀楽をほとんど出されない中にあって、顔を埋めるほど笑っておられる姿を見たのは初めてで衝撃を受けました。湯前のトークショーでカメラを向けた藤田先生にピースサインで応えたとき以来の衝撃です。いやあ、いいもの見せていただきました。久米田先生知っていますか、先生の作品を読んでいるときの私はいつもこんな感じなのですよ。
<a href>
によるリンクは UA スタイルシートによって下線が引かれますが、そのデフォルトの見た目がアクセシブルでないという話。 uxdesign.cc
)yuheiy.com
)UX Collective の元記事に書かれているように、下線の付いたテキスト内リンクはコンテンツの読みやすさに悪影響を及ぼし、注意散漫になり得ることは確かに考慮すべきでしょう。そのうえで text-underline-offset
や text-decoration-thickness
、text-decoration-color
プロパティを使って下線の圧を弱める手法が両記事で紹介されていますが、これの導入は慎重になるべきです。
というのも本件は下線リンクが存在するサイト(≒すべての Web サイト)で等しく問題になるものであり、制作者スタイルシートでサイト個別に工夫することが正しい解決方法とは思えないからです。元記事ではdyslexia-friendly
(識字障害フレンドリー)との表現がされていますが、当事者がユーザースタイルシートを設定すれば済む話ではないでしょうか。もっともユーザースタイルシートの設定には CSS の知識が必要になるわけでして、ブラウザに「リンクの下線の圧を弱める」オプションを導入することを求めるほうが現実的でしょうか。
もう一つの可能性としては text-decoration-skip-ink
で前例があるように、後方互換性を犠牲にしてでもブラウザのデフォルトの動作が変更されることも考えられます。もしそうなった場合、制作者スタイルシートで工夫をしていたサイトよりも、むしろなにもしていない(圧倒的大多数の)サイトの方が良い感じになる逆転現象が起こりえます。
いずれにせよ、本件に限らず CSS を書く際はそれが制作者スタイルシートで設定すべきものなのかどうかを考える必要があるでしょう。本ブログではそのような考えのもと、以前からリンクの下線は text-decoration-thickness: from-font
のみ設定するようにしており、それ以上のカスタマイズはあえて行っていません。text-underline-offset
プロパティにキーワードでなく具体的な数値を設定するのもなんか嫌ですし【謎】
support.apple.com
) で、キーボードは Smart Keyboard(web.archive.org
) を常時取り付けていました。 薄型軽量で折り畳むと本体の保護にもなる優れもので、6年間持ち歩いたため外側はさすがに多少見栄えが悪くなってきたものの肝心のキーボード機能に損傷はまったくなく耐久性ともども満足していたものでした。Smart Connector 接続なのでマグネットでくっつけるだけで認識し、ペアリング操作や電池の心配をする必要もありません。
ところが現行世代の機種は Smart Keyboard および後継の Smart Keyboard Folio とも対応しておらず、トラックパッド付きの Magic Keyboard 系に統一されていることを知りました。これらは11インチ用でも重量が 600g 近くと、Smart Keyboard の2倍以上となっており、展開したときの奥行きも広さが求められるものとなっています。
テーブルに置いて使う時は良いのでしょうが、私の場合主たる使用箇所は公共交通機関での移動中(通勤電車内における膝の上)であるからして、省スペースと軽量であることは必須の要件なのです。困ったことに他社が販売しているケース付きキーボードもほとんどがトラックパット付きとなっていて、省スペースなものは Logicool が販売している SLIM FOLIO(www.logicool.co.jp
) くらいしか見当たりません。これも背面にプラスティック製の板状保護があるためか重量は iPad (A16) 用で 449g と決して軽くはなく、残念ながら私の用途にベストマッチはしていません。
Smart Keyboard のようにトラックパッドなしの小型タイプで、重量も 200g 台の軽量なキーボードは世間に求められていないのでしょうか。まあ確かに通勤電車のロングシートでタブレット機器を操作している人はそれほど多くは見かけないですけど。というか同じ11インチなのだから旧製品との互換性を確保して欲しいですよ Apple さん……。
仕方がないので Smart Connector 接続のケース付きキーボードは諦め、Bluetooth 接続タイプを購入することにしました。Apple 純正だと Magic Keyboard (USB-C)(www.apple.com
) があるのですが、同じくらいの大きさ、重量の製品が各社から販売されており、その中でも Anker ウルトラスリム Bluetooth ワイヤレスキーボード(www.ankerjapan.com
) のデザインが気に入りました。価格も類似品の中ではおそらく最安値で、税込みわずか2,000円です。
唯一の難点は電源スイッチが裏面にあることで、これはエレコムの類似品(TK-FBP102)(www.elecom.co.jp
)のように表側にある方が好みなのですが、致命的とまでは言えず許容範囲です。あと裏面は一部分のみ(電池収納まわり)が盛り上がっていて、持ち運びを考えるとこの厚みはデメリットとも言えるのですが、他社の類似品も同形状なので、これが許容できない方は Apple 純正品にするしかないでしょうね。
またいくら小型キーボードとは言えさすがに通勤電車で使うのは難しいと思うので、移動中は閲覧メインの使い方にして、文字入力はカフェなどテーブルのある場所に限定せざるを得なくなってしまいました。例えばイベントの参加レポート記事や映画館で見た新作映画の長文感想を帰宅の移動中に書き上げるといったことは無理になってしまいそうです。
ところでこれまでの Smart Keyboard はキーボード機能のみならずスタンド機能と本体保護を兼ねていたわけでして、それらの代替としてケースの購入にも迫られました。こういう小物はエレコムが強くて、スタンド機能のあるものは iPad(A16) 用(www.elecom.co.jp
)で20種類近くも用意されているのですが、実売価格は最安のものでも2,000円台後半なのですね。キーボードよりケースの方が高いとは……。いや Anker のキーボードが安すぎるだけなのかもしれませんが。
headingoffset
と headingreset
属性を追加する議論が進んでいます。これが実現すれば見出し要素だけでなく、その祖先要素でも見出しレベルを調整できることになります。 一方、そうなると現状のように <hn>
= 見出しレベル N とは限らなくなり、「見出しレベル N の要素を選択する」ことが困難になるため、CSS 側でも :heading
および :heading()
疑似クラスの導入が画策されています。
headingreset
の属性名は混乱を引き起こす懸念も出ており、名称が変わるかもしれません。現行の HTML では <h1>
~<h6>
要素を使って見出しレベルが決定されます。
<body> <h1>見出しレベル 1</h1> <h2>見出しレベル 2</h2> <h3>見出しレベル 3</h3> <h2>見出しレベル 2</h2> </body>
しかしテンプレートエンジンやコンポーネント指向設計を採用したケースでは見出し要素の出力に条件分岐が必要になるなど、実装が複雑になってしまうことがあります。
<body> <h1>見出しレベル 1</h1> <%- include('component/XXX.html', { headingLevelStart: 2 } ) -%> <section> <h2>見出しレベル 2</h2> <%- include('component/XXX.html', { headingLevelStart: 3 } ) -%> </section> </body>
<!-- component/XXX.html --> <section> <!-- 見出しが出現するごとに条件分岐が必要 --> <%_ if (headingLevelStart === 2) { _%> <h2>コンポーネントの最上位見出し</h2> <%_ } else if (headingLevel === 3) { _%> <h3>コンポーネントの最上位見出し</h3> <%_ } _%> <p>...</p> </section>
このような状況に対して、HTML5 の当初の仕様ではアウトラインアルゴリズムによってセクショニングコンテンツと <h1>
要素だけを使ってアウトラインを作ることができるとされていたのですが、ブラウザや支援技術のサポートが行われていなかったため、長い議論の末2022年7月にアウトラインアルゴリズムが削除されることで一応の決着が付いた次第です。
一方で前述のとおり、HTML4 時代のように <h1>
~<h6>
の要素名によってのみ見出しレベルが決定される現状は不便であり、アウトラインアルゴリズムとは別の手法で解決を図る議論が以前から行われています。
headingoffset
と headingreset
属性の提案今回の Pull Request の元になった Issue が立てられた当初の時点(2019年)では見出しレベルの絶対値を指定する
headinglevelstart
属性が提案されていました。特徴的なのはネストによる継承をしない方針とされていたことで[1]、これは <ol start>
と同じ挙動と言えます。
<body> <h1>見出しレベル 1</h1> <div headinglevelstart="2"> <h1>見出しレベル 2</h1> <h2>見出しレベル 3</h2> <div headinglevelstart="1"> <!-- ネストされていても継承しない --> <h1>見出しレベル 1</h1> <h2>見出しレベル 2</h2> </div> </div> </body>
しかし議論が進む中で絶対値指定でなく相対値指定にすることとなり、属性名も headingoffset
へ変更されました。また同時に見出しレベルをリセットする headingreset
属性(真偽属性)も追加されています。
<body> <h1>見出しレベル 1</h1> <h1 headingoffset="1">見出しレベル 2(要素名の 1 + headingoffset 属性値 1 = 2)</h1> <div headingoffset="1"> <h1>見出しレベル 2(要素名の 1 + headingoffset 属性値 1 = 2)</h1> <h2>見出しレベル 3(要素名の 2 + headingoffset 属性値 1 = 3)</h2> <div headinglevelstart="2"> <h1>見出しレベル 4(要素名の 1 + headingoffset 属性値の小計 3 = 4)</h1> <h2>見出しレベル 5(要素名の 2 + headingoffset 属性値の小計 3 = 4)</h2> </div> <div headingreset> <h1>見出しレベル 1</h1> </div> </div> </body>
以下、特殊な例を提示します。
<body> <div headingoffset="10"> <h1>見出しレベル 9(レベルは 9 より大きくはならない)</h1> </div> <div headingoffset="-1"> <h1>見出しレベル 1(headingoffset に指定できるのは正の整数のみ、負の値やその他無効な値が指定された場合は 0 の扱いになる)</h1> </div> <div headingoffset="2"> <h1 aria-level="3">見出しレベル 3(見出し要素の数字や headingoffset 属性値に関わらず aria-level が優先される)</h1> </div> <div headingoffset="2"> <dialog id="modal-dialog"> <h1>見出しレベル 1(showModal() されたダイアログは offset しない)</h1> </dialog> <script> document.querySelector('#modal-dialog').showModal(); </script> </div> </body>
冒頭の注釈にも記したとおり、まだ議論は進行中であり今後内容や属性名が変更される可能性は充分に考えられるのですが、すでに Chromium には実装されており、Chrome canary 136.0.7067.2 で挙動を確認できます。
body > div[headingoffset=1] > h2
な見出し要素を選択した様子。アクセシビリティパネルの計算済みプロパティにはレベル: 3と表示されている。
例えば以下のように 5MB を超えるデータを setItem()
しようとすると QuotaExceededError
が発生します。
try { const storageKey = 'foo'; sessionStorage.clear(); sessionStorage.setItem(storageKey, 'x'.repeat(5242880 - storageKey.length + 1)); // 5MB を超えるデータをセット } catch (e) { if (e instanceof DOMException) { console.warn(e.name); // `QuotaExceededError`(ただし Cookie がブロックされている場合は `SecurityError`) } }
ブラウザの設定で Cookie をブロックしている場合はプロパティやメソッドを呼び出さずとも常に SecurityError
が発生します。
try { sessionStorage; } catch (e) { if (e instanceof DOMException) { console.warn(e.name); // `SecurityError` } }
これらのことは Web storage API の仕様書に書かれているのはもちろん、MDN の解説でも触れられているのですが、どういうわけか世の中には
sessionStorage
や localStorage
を try
...catch
で囲っていない、怖いもの知らずなコードがそれなりに存在するのです。
const foo = sessionStorage.getItem('foo'); doSomething(); // ブラウザの設定で Cookie をブロックしている場合、この関数は実行されない
実際のサイトで散見され始めたのは2018年頃で、当時 Web Storage API を使う際は Cookie 無効環境も考慮しようという記事を書いたのですが、その後は某著名フレームワークの普及もあってレイアウトが崩れる(CSS が部分的にしか適用されない)どころか情報がまったく閲覧できないサイトが増加してしまいました。
そのような流れに対して、いずれ ESLint などに検証ルールが追加されるだろうと静観していたのですが、一向にその気配がありません。似た思想を持つプラグインとして eslint-plugin-try-catch-failsafe
があるのですが、これは
JSON.parse()
と new URL()
のみが対象であり、Storage のルールは存在しません。
canParse()
メソッド(developer.mozilla.org
)が実用可能になってきているので、try
...catch
で囲わなければならないケースは今後減るでしょう。ということで今さらではあるのですが、さくっとプラグインを作ってみました。
本ブログでも自分用の ESLint 設定ファイルに本日から導入しています。
河津桜まつり(www.kawazuzakura.net
)が開催される期間を中心に1往復が運転される全車自由席の臨時快速列車は、2017年以降は「河津さくら号」として運転されていましたが、今年は「河津桜号」と微妙に列車名が変わっています。
www.izukyu.co.jp
)昨年(2019年)(
camel3.com
)は8000系の「河津さくら号」とは別に、JRの251系を使用した「河津桜号」が伊豆急下田15:35→伊東16:47、その折り返しとして「河津夜桜号」が伊東17:12→伊豆急下田18:12 のダイヤで運転され、それ以前にもJR直通の特急列車で「河津桜号」が運転された年もあったようですが、今年の臨時快速はそれらの列車名を引き継いだことになります。使用車種は発表されていませんが、伊豆高原発着でホーム長の短い今井浜海岸駅にも停車することから、(251系ではなく)例年どおり8000系が使われるものと思われます。
さて、この臨時快速に初めて8000系が充当されたのは2007年で、当時の運転区間は伊東→伊豆急下田と河津→伊豆高原の1往復、途中停車駅は伊豆高原、伊豆熱川、伊豆稲取、今井浜海岸、河津、蓮台寺で、このほかに運転停車もありました。列車名は「快速さくらリレー号」で、列車名自体に「快速」が含まれていたのが特徴でした[1]。
2008年、2009年は運転日とダイヤが若干変わったのみでしたが、2010年からは毎年のように注目すべき変化が起こっています。
より詳細な運転データを下表にまとめます。
2023年2月10日追記2023年の運転情報が発表(
camel3.com
)されたので表に追記しました。
2024年2月7日追記2024年の運転情報が発表(
camel3.com
)されたので表に追記しました。
2025年2月20日追記2025年の運転情報が発表(
camel3.com
)されていたので表に追記しました。
年 | 河津桜まつり期間 | 運転日 | 列車名 | 旅客扱い区間 | 途中停車駅(運転停車を除く) |
---|---|---|---|---|---|
2007年 | 2月10日〜3月10日 | 2月10日〜28日 | さくらリレー号 | 伊東→伊豆急下田、河津→伊豆高原 | 伊豆高原、伊豆熱川、伊豆稲取、今井浜海岸、河津、蓮台寺 |
2008年 | 2月9日〜3月10日 | 2月9〜29日(〜3月10日?) | さくらリレー号 | 〃 | 〃 |
2009年 | 2月7日〜3月10日 | 2月7日〜3月10日 | さくらリレー号 | 〃 | 〃 |
2010年 | 2月6日〜3月10日 | 2月6〜28日(3月の実績不明) | さくらリレー号 | 〃 | 伊豆高原、伊豆熱川、伊豆稲取、今井浜海岸、河津 |
2011年 | 2月5日〜3月10日 | 2月11〜13日、19〜28日 | さくらリレー号 | 伊東→河津、河津→伊豆高原 | 伊豆高原、伊豆熱川、伊豆稲取、今井浜海岸 |
2012年 | 2月5日〜3月10日 | 2月11〜12日、18〜29日、3月10〜11日 | さくらリレー号 | 〃 | 〃 |
2013年 | 2月5日〜3月10日 | 運転なし(?) | |||
2014年 | 2月5日〜3月10日 | 2月15〜28日(3月の実績不明) | さくらリレー号 | 伊豆高原→河津、河津→伊豆高原 | 伊豆熱川、伊豆稲取 |
2015年 | 2月10日〜3月10日 | 運転なし(?) | |||
2016年 | 2月10日〜3月10日 | 不明 | さくらリレー号 | 伊豆高原→河津、河津(?)→伊豆高原 | 不明 |
2017年 | 2月10日〜3月10日 | 2月11日〜3月10日 | 河津さくら号 | 伊豆高原→伊豆急下田、河津→伊豆高原 | 伊豆熱川、伊豆稲取、今井浜海岸、河津 |
2018年 | 2月10日〜3月10日 | 2月10日〜3月10日 | 河津さくら号 | 〃 | 伊豆熱川、伊豆稲取、今井浜海岸、河津、蓮台寺 |
2019年 | 2月10日〜3月10日 | 2月16日〜3月3日 | 河津さくら号 | 伊豆高原→伊豆急下田、伊豆急下田→伊豆高原 | 〃 |
2020年 | 2月10日〜3月10日 | 2月15日〜3月6日 | 河津さくら号(河津桜号?) | 〃 | 〃 |
2021年 | 新型コロナのため中止 | 運転なし | |||
2022年 | 2月1日〜2月28日 | 運転なし(?) | |||
2023年 | 2月1日〜3月5日 | 2月11日〜2月28日 | 河津桜号 | 伊豆高原→伊豆急下田、河津→伊豆高原 | 伊豆熱川、伊豆稲取、今井浜海岸、河津、蓮台寺 |
2024年 | 2月1日〜2月29日 | 2月10日〜2月29日 | 河津桜号 | 伊豆高原→河津、河津→伊豆高原 | 伊豆熱川、伊豆稲取、今井浜海岸 |
2025年 | 2月1日〜3月9日 | 2月8日〜3月9日 | 河津桜号 | 〃 | 〃 |
www.izukyu.co.jp
)、および「JR時刻表」「JTB時刻表」の各年2〜3月号を参照しました(2020年の運転日のみ「鉄道ダイヤ情報」より)。www.kawazu-onsen.com
)に掲載されたデータを情報源としています。ただし、2010年のみは同サイトのアーカイブでは確認できなかったため、旅行会社のブログなど複数の2次情報を元にしました。2012年の運転のうち、3月10日〜11日は当時のニュースリリースによると下りのみの運転だったようです。この年は開花時期が遅れた影響で本来の「河津桜まつり」に続いて3月11日〜18日に「河津桜“春うらら”まつり」が行われることになったためイレギュラーな形になったのでしょう。上りは回送で運転されたものと思われますが、未確認です。
2013年と2015年は運転がなかったものと思われますが、疑問符を付けています。この臨時快速は伊豆急行のニュースリリースで運転が告知される年もありますが、リリースなしで運転されることもあります。また、まれに「JR時刻表」や「JTB時刻表」への掲載がされないこともあります(一例として2016年の運転はなぜか両時刻表への掲載がありませんでした)。そのため、「運転がなかった」ことを証明するのは困難なのです。
そして、2016年は上記のとおり全国時刻表への掲載がなく、目撃情報を頼りに情報をまとめたため、詳細な運転データが不明な状況です。
その他の年でも、2010年と2014年は2月28日までの運転としていますが、実際は3月以降も運転された可能性があります。例年、3月はJRグループのダイヤ改正が行われるため、「JR時刻表」、「JTB時刻表」の3月号では改正後のダイヤが掲載されることがあり、この場合、2月号に3月上旬(ダイヤ改正前)の運転の掲載がないと「3月上旬の運転がなかった」のか「2月号の時点では3月の運転計画が未定だったに過ぎない」のかの判断ができないためです。
また、一部200系や185系で運転されたケースもあるようですが、このあたりも詳細は把握していません。
いつかの段階で「快速さくらリレー号」が「さくらリレー号」に改称されています。「JR時刻表」と「JTB時刻表」の表記を見ると、2007年は両者とも「快速さくらリレー号」ですが、2008年〜2011年は「JR時刻表」では「快速さくらリレー号」、「JTB時刻表」では「さくらリレー号」と異なっており、2012年には両者とも「さくらリレー号」になっています。このため、改称時期は2008年〜2012年のいずれかと思われますが、はっきりしたことは分かっていません。本記事では2007年運転分も含めて「さくらリレー号」で表記しています。 ↩ 戻る
colgroup
要素、 col
要素で列がまたがる数を指定する span
属性、および表のセルを結合するための colspan
属性、 rowspan
属性には上限値、下限値があります。 まずは仕様を確認してみます。
colgroup
要素、 col
要素の span
属性はa valid non-negative integer greater than zero and less than or equal to 1000
とされています。「0より大きく1000以下の有効な非負整数」、要するに 1 〜 1000 の整数ですね。
td
要素、 th
要素の colspan
属性は span
属性と同じ一方、 rowspan
属性はa valid non-negative integer less than or equal to 65534
と、他とは少し違う定義です。上限値が大きいだけでなく 0 が許容されており、その際は「行グループの残りすべての行にまたがる」とされています。すなわち、
<tbody> <tr> <th rowspan="0">見出しセル</th><td>セル1</td> </tr> <tr> <td>セル2</td> </tr> </tbody> <tbody> <tr> <td>セル3</td> </tr> </tbody>
のような表の場合、見出しセルは2列にまたがる(rowspan="2"
を指定したのと同じ)ことが期待されます。これは HTML4 時代から規定されていることなのですが、残念ながら Firefox しか対応していません。
ちなみに HTML4 では同様に colspan="0"
も認められており、以前の Firefox は対応していましたが、現在では仕様、実装ともに消え去りました。
span
属性はlimited to only non-negative numbers greater than zero
、 colspan
属性はa valid non-negative integer greater than zero
と書き方が少々異なりますが、意味的にはどちらも「0より大きい有効な非負整数」で、上限値の記述はありません。
rowspan
属性もa valid non-negative integer
で、上限値がないこと以外は Living Standard と同様です。
いくつかのパターンをテストしてみました。
span
属性、colspan
属性、rowspan
属性の上限値、下限値テスト(codepen.io
)ブラウザ | <col(group)? span=1001> | <td colspan=1001> | <td rowspan=0> |
---|---|---|---|
Chrome 59 | ✘ 1001列を認識 | ✘ 1001列を認識 | ✘ rowspan="1" と同じ |
Safari 10 | ✘ 1001列を認識 | ✘ 1001列を認識 | ✘ rowspan="1" と同じ |
Firefox 54 | ✔ span="1000" と同じ | ✘ colspan="1" と同じ | ✔ 仕様どおり |
Firefox 55(β) | ✔ span="1000" と同じ | ✔ colspan="1000" と同じ | ✔ 仕様どおり |
Edge 40 | ✘ span="1" と同じ | ✘ colspan="1" と同じ | ✘ rowspan="1" と同じ |
IE 11 | ✘ span="1" と同じ | ✘ colspan="1" と同じ | ✘ rowspan="1" と同じ |
2019年11月12日追記いつの間にか Chrome は rowspan=0
に対応していました(バージョン78で確認)。 Safari 13, Edge 44 は相変わらず未対応です。
2021年3月18日追記現在の最新状況を下表に記します。 Safari 14 は未だ rowspan="0"
未対応です。
ブラウザ | <col(group)? span=1001> | <td colspan=1001> | <td rowspan=0> |
---|---|---|---|
Chrome 89 | ✔ span="1000" と同じ | ✔ colspan="1000" と同じ | ✔ 仕様どおり |
Safari 14 | ✔ span="1000" と同じ | ✔ colspan="1000" と同じ | ✘ rowspan="1" と同じ |
Firefox 86 | ✔ span="1000" と同じ | ✔ colspan="1000" と同じ | ✔ 仕様どおり |
2025年2月13日追記Release Notes for Safari Technology Preview 213(webkit.org
)によると、Safari もようやく rowspan=0
に対応するようです。この日が来るまで長かった……。
report-uri.com
) のサービスを長年使ってきたのですが、Report URI の作成者のブログ記事 Report URI: Simplifying pricing and changes to free accounts(scotthelme.co.uk
) にあるように2025年2月1日をもって無料プランが終了することになりました。 無料プラン終了そのものに対しては記事にあるようにやむを得ないことであり、現行の無料ユーザー向けに格安プランが用意されるといった対応もなされているためその運営判断に不満はないのですが、いかんせん私自身がこの個人サイトの CSP レポートを普段はほとんど活用していないため、月額 9.99 ドルといえども負担は厳しいと思った次第です。そもそもユーザー情報の保管とか一切していない当サイトに CSP を設定しているのはセキュリティ施策というよりは単なる技術的興味からのことであり、これを機に CSP ヘッダーを設定するだけでなくレポート収集のエンドポイントも自作しようと考えた次第です。
ところで CSP のレポートに使われるディレクティブや Reporting API に関係する HTTP ヘッダーはこれまで何回か仕様が大きく変わっており、送信される JSON 形式も変化しています。またブラウザによってどの時点の仕様を実装しているかに差異があったり、ブラウザの設定(アドオン)によってはサイト制作側の意図しないエラーがレポートされたりするなど状況は複雑なため、最新仕様を見るだけではなく実際に送られてくるエラーを見ながらの調整が必要でした。
Report-To
ヘッダー(今となっては考慮する必要がないため) 今回作成したエンドポイントのソースコードは report.w0s.jp
で公開しており、主要な処理は
/node/src/controller/csp.ts
に書かれています。
CSP レポートを送るためには Content-Security-Policy
ないし Content-Security-Policy-Report-Only
ヘッダーに専用のディレクティブを指定する必要があります。これはもともと CSP 専用の report-uri
ディレクティブ(developer.mozilla.org
)であったものが、CSP 以外を含めた様々なレポートに対応した Reporting API を利用するように変更され、今は report-to
ディレクティブ(developer.mozilla.org
) と Reporting-Endpoints
ヘッダー(developer.mozilla.org
)を組み合わせる方式となっています。
Chrome と Safari は現行仕様に対応しているのですが、Firefox は最新の 136 Nightly においても古い report-uri
ディレクティブしかサポートしていないため、実際は両方を指定する必要があります。
Content-Security-Policy: default-src 'self'; report-uri https://example.com/endpoint; report-to csp Reporting-Endpoints: csp="https://example.com/endpoint"
なお Reporting API に対応したブラウザであっても report-uri
ディレクティブのサポートを取り止めたわけではないため、たとえ report-to
ディレクティブを書かなくてもレポートの送信自体は行われます。ただし report-uri
ディレクティブではレポートが即時配信されるのに対し、Reporting API ではレポートのリストがいったんキューに入れられ、ブラウザが送信タイミングを制御することとされている違いがあります[1]。すなわち、とくに複数のレポートが送信される際におけるパフォーマンス向上のメリットがあるので、多少レスポンスヘッダーが長くなるにせよ最新仕様へ準拠したほうがよいでしょう。
CSP ヘッダーは前述のとおり新旧2種類に対応した記述を行ったのですが、実際にブラウザが送信する JSON 形式は Firefox, Safari, Chrome でそれぞれ異なるため、エンドポイント側では3種類のフォーマットに対応する必要があります。
report-uri
ディレクティブ)Firefox は report-to
ディレクティブに対応していないため、report-uri
ディレクティブで指定したエンドポイントに JSON が POST されます。
Content-Type
は application/csp-report
であり、CSP Level 3 仕様の 5.3. Obtain the deprecated serialization of violation で JSON 形式が規定されています。便宜的に TypeScript フォーマットで表現するとこうなります。
{ 'csp-report': { 'document-uri': string; referrer?: string; 'blocked-uri'?: string; 'effective-directive': string; 'violated-directive': string; // `effective-directive` の旧名称(同じ値) 'original-policy': string; disposition?: 'enforce' | 'report'; 'status-code': number; 'script-sample'?: string; 'source-file'?: string; 'line-number'?: number; 'column-number'?: number; }; }
なお、仕様では source-file
, line-number
,
column-number
の3つのプロパティのみが省略されうるとあるのですが、実際に Firefox から送信されてくるデータを見ると他のプロパティも存在しないケースがあるため、上記は現実の状況を踏まえたものとしています。
report-to
ディレクティブ + Reporting-Endpoints
ヘッダー)Safari は Reporting API に対応しているのですが、送られる JSON 形式はやや古い仕様のものとなっています。詳しくは追っていないのですが、2018年9月25日版の 5.1. Interface ReportingObserver にある
Report
インターフェースと同様に見えます(実際に Safari がその時期の仕様を元に実装したのかどうかは未確認です)。
同様に TypeScript フォーマットで表現するとこうなります。
{ type: `csp-violation`; url: string; body: { documentURL: string; referrer: string; blockedURL: string; effectiveDirective: string; originalPolicy: string; sourceFile: string; sample: string; disposition: "enforce" | "report"; statusCode: number; lineNumber: number; columnNumber: number; } }
また Reporting API では Content-Type
は application/reports+json
と定められているのですが、Safari は Firefox と同じく
application/csp-report
で送ってくることに注意する必要があります。
report-to
ディレクティブ + Reporting-Endpoints
ヘッダー)Chrome は Reporting API の最新仕様に準拠しています。
Content-Type
は application/reports+json
であり、Reporting API 仕様の 2.4. Serialize Reports および CSP Level 3 仕様の 5. Reporting
で規定されているとおりの JSON が送られます。TypeScript フォーマットで表現するとこうなります。
[ { age: number; type: string; url: string; user_agent: string; body: { documentURL: string; referrer?: string; blockedURL?: string; effectiveDirective: string; originalPolicy: string; sourceFile?: string; sample?: string; disposition: 'enforce' | 'report'; statusCode: number; lineNumber?: number; columnNumber?: number; }; } ]
Safari と似ているものの、配列形式となっているのが特徴です。実際には以下のように CSP 以外のレポートも含まれるケースがあるので、必要に応じてフィルタリング処理を掛けましょう。
[ { "age": 0, "type": "csp-violation", "url": "http://example.com/", "user_agent": "Mozilla/5.0 ...", "body": { ... } }, { "age": 999, "type": "another-type", "url": "http://example.com/", "user_agent": "Mozilla/5.0 ...", "body": { ... } } ]
このように Web サイト側では CSP ヘッダーのディレクティブを2種類記述し、エンドポイント側では JSON 形式を3種類受け入れるように対応し、あとは送られてきたデータをデータベース等に保存する処理を作れば最低限の機能としては完成します。
しかしそれだけでは意図しないエラーレポートが大量に蓄積されてしまうため、実際に送られてきたデータを見ながらの調整が必要となります。以下に当サイトにおいて対応したものを記載します。あくまで当サイトで頻出したエラーレポートであり、他のサイトでは状況が異なる可能性はあるので参考程度に……。
blockedURL: 'data', effectiveDirective: 'media-src'
noscript.net
)を入れていると発生することを確認したmedia-src
に data:
を追加して対応したblockedURL: 'inline', effectiveDirective: 'script-src-elem', sourceFile: 'moz-extension'
developer.mozilla.org
) は使用していないため、これもユーザー環境に起因して発生するエラーと言えるviolentmonkey.github.io
)を入れていると発生することを確認したscript-src-elem
に 'unsafe-inline'
を追加して対応した'unsafe-inline'
の指定は避けるべきとされているが、一方で当サイトのようにそこまでセンシティブでないサイトではユーザースタイルシートやユーザースクリプトの活用を妨げたくはないため、リスクを踏まえたうえで許容するblockedURL: 'trusted-types-policy', effectiveDirective: 'trusted-types', sourceFile: 'chrome-extension', sample: 'dompurify'
sample
の値からしてセキュリティ関係のアドオンだろうが詳細は把握していないtrusted-types
に dompurify
を追加して対応した対応するほどの頻度ではないものの、ちょっと変わったエラーレポートをいくつか紹介します。
*-src-elem
未対応環境 script-src-elem
, style-src-elem
を記述しているが、これらは CSP Level 3 で登場した後発のディレクティブであり、古いブラウザは対応していないscript-src
, style-src
も指定すれば解消するかもしれないが、ただでさえ長大になりがちなヘッダー値をこれ以上長くしたくない(本当に解消するのか検証もしていない)effectiveDirective: 'fenced-frame-src'
<fencedframe>
要素(wicg.github.io
)に関連するディレクティブだが、当サイトではその要素は使っていないblockedURL
や sample
が付いていないので詳細はよく分からないeffectiveDirective: 'trusted-types', sample: 'default2'
Chrome は最大1分の遅延で送信される(developer.chrome.com
)とされています。 ↩ 戻る
昨年(2024年)、私は玉川電気鉄道(のちの東急玉川線)の開通当初の車両に関する資料調査を行い、その成果を公文書と統計資料でたどる玉川電気鉄道狭軌時代の車両として発表しました。その際に車両譲渡先である駿遠電気と上田温泉電軌(現:上田電鉄)の調査も行ったのですが、あくまで玉川電気鉄道の本であるため取り入れなかった部分もあります。そこで本記事では改めて駿遠電気側の視点で玉電譲渡車の動きを中心にまとめてみることにしました。なおそのような経緯があるため、本記事の内容は拙著の「第6章 改軌に伴う譲渡、改造」と重複する部分が多いのですが、一方で本記事単独でお読みいただけるように構成しております。
駿遠電気の改軌に伴う車両認可の書類そのものは発見されていないのすが、その前段階である工事施行認可申請書(1920(大正9)年3月4日付)(www.digital.archives.go.jp
)は国立公文書館に保管されており、改軌半年前の時点で下表の車両が計画されていたことが分かります。
車種 | 両数 | 記号番号 | 自重 | 定員/積載容積 | 電動機 | 備考 |
---|---|---|---|---|---|---|
電動客車 | 10両 | 1~10 | 6t | 40人 | 37.5㏋×2 | 玉川電気鉄道より譲受 |
付随客車 | 3両 | 1~3 | 4t | 40人 | 玉川電気鉄道より譲受 | |
電動貨車(無蓋車) | 2両 | デカ1~2 | 5t | 4t | 37.5㏋×2 | 台車は玉川電気鉄道より譲受 |
付随貨車(無蓋車) | 10両 | ムカ1~10 | 3.5t | 5t |
このように旅客車は玉川電気鉄道からの譲受車が予定されていたのですが、これは同時期に玉電が 1,067mm → 1,372mm へ改軌するのに伴い不要となる狭軌車両を譲り受けるつもりであったものとなります。また電動貨車は台車のみ譲受品を使用とあるのですが、玉川電気鉄道では予備の電機品2台分を保有しており、これも改軌で不要になるのでそれを活用するつもりだったものと思われます。具体的には改軌前の1918(大正7)年頃に車両増備のため台車と主電動機、ブレーキ装置をアメリカより輸入したものの[1]、1919(大正8)年に到着した際には改軌が迫っていたためか活用されることなく予備品とされたもの[2]となります。
しかしながら駿遠電気の改軌は1920(大正9)年8月2日に実施されたのに対し、玉川電気鉄道は同年8月21日に暫定単線化ののち、9月3日に改軌が行われています。このため玉川電気鉄道にとっては改軌の1か月以上前に当時の在籍車22両のうち13両もの車両を放出するのは無理があったであろうことは容易に想像が付きます。そこで駿遠電気では美濃電気軌道(のちの名古屋鉄道美濃町線など)からも旅客車両を譲り受けることで、玉川電気鉄道からの譲受タイミングと車両数を調整することになりました。駿遠電気の取締役会で美濃電気軌道からの購入が承認されたのが改軌の2週間前にあたる7月18日とのことですから[3]、ギリギリのスケジュールだったのでしょう。
このような経緯を経て、旅客車は美濃電気軌道と玉川電気鉄道からの譲受、貨車は新造(電動貨車の台車のみ玉川電気鉄道から譲受の可能性)にて改軌&電化を迎えることとなります。
駿遠電気の開通式典を取材した地元紙の取材記事では、開通式に株主用として10, 11, 12号、一般客用に14号が運転されたことが記されています。これは静岡民友新聞(現:静岡新聞)の1920(大正9)年8月4日の3面に掲載された「電車開通と清水驛」の記事で、式典の様子はもちろんのこと在籍車両数、それも貨車の情報まで報告されており、年度ごとの統計データでは分からない「開業初日の車両数」を記録した貴重なものとなっています。
尙ほ同電車は現在電動客車四臺と附随客車二臺及び豫備として電動客車二臺を運轉せるが豫定は五臺を運轉し静岡發朝四時十六分よりとし二十六分毎に發車する筈なるも當分は都合により時間を延ばすやも計られず
(中略)
客車は近々更らに二三臺到着する由にて貨車は無蓋十臺、有蓋五臺電動貨車二臺なりと
このうち改軌の同年に撮影されたとする10号車の写真が『写真で綴る静岡鉄道70年の歩み』(静岡鉄道 1989年)や『懐かしのアルバム 静岡県鉄道写真集』(山本義彦 1993年)に掲載されており、Brill 21E 型と見られる台車、10枚の側面窓、そしてなによりバッファーを装備している特徴からこれは玉川電気鉄道からの譲受車と思われます。一方、近年になって12号車が写り込んだ絵はがきが発見され、台車の形態などからこちらは美濃電気軌道の譲受車と推察されています[4]。(ともに短期間での改番が行われなかった前提)
これらの情報をまとめると、開通式の日にはすでに玉川電気鉄道からの譲受車が一部到着しており、しかしながら所定数は揃っておらず当面の間は運行間隔を調整(減便)する可能性があったことが分かります。そして電動客車の内訳ですが、美濃電気軌道からは D13~D17 の5両を譲り受けたというのが定説であることから[5]、開通式当日の玉電譲受車は10号車の1両と付随車2両の計3両だったのではないかと思われます。
すなわち以下のように考えられます。
車種 | 譲受元 | 開通式当日の両数 | 年度末の両数 | 駿遠電気での車号(推定) |
---|---|---|---|---|
電動客車 | 玉川電気鉄道 | 1両 | 6両 | 5~10 |
電動客車 | 美濃電気軌道 | 5両 | 5両 | 11~15 |
付随客車 | 玉川電気鉄道 | 2両 | 3両 | 不明 |
dl.ndl.go.jp
)には客車総数が14両とあるため、付随車と美濃電気軌道譲受車の両数を差し引いた6両と考える。定説では駿遠電気の電動客車のうち2両はほどなく上田温泉電軌(現:上田電鉄)へ譲渡されたとされています。この説の発端はおそらく鉄道ピクトリアル誌に掲載された「私鉄車両めぐり」の記事で、1921(大正10)年6月の路線開通に際して同年中に電動客車9両を玉川電気鉄道より譲受、2両を駿遠電気から譲受、さらに付随客車4両を玉川電気鉄道より譲受したとされています[6]。
その記事における開通当初の電動車一覧表から重要なデータのみを抜粋します。
上田車号 | 製造時期 | 譲受時期 | 譲受元 | 旧車号 |
---|---|---|---|---|
1 | 1907(明治40)年6月 | 1921(大正10)年6月 | 玉川電気鉄道 | 不明 |
2 | 〃 | 〃 | 〃 | 不明 |
3 | 1912(明治45)年6月 | 〃 | 〃 | 不明 |
4 | 〃 | 〃 | 〃 | 不明 |
5 | 1914(大正3)年9月 | 〃 | 〃 | 不明 |
6 | 1912(明治45)年6月 | 〃 | 〃 | 不明 |
7 | 〃 | 〃 | 〃 | 玉川15 |
8 | 1919(大正8)年10月 | 1921(大正10)年9月 | 〃 | 不明 |
9 | 1907(明治40)年6月 | 1921(大正10)年10月 | 〃 | 不明 |
10 | 〃 | 1921(大正10)年12月 | 駿遠電気 | 不明 |
11 | 〃 | 1921(大正10)年10月 | 〃 | 不明 |
しかしこのデータにはいくつか不自然な点が見られます。
ところで駿遠電気の旅客車両数の変遷を「鉄道省鉄道統計資料」の「車輛現在表」でみると、大正9年度(dl.ndl.go.jp
)は14両、定員計560人だったのが、大正10年度(dl.ndl.go.jp
)には13両、定員計570人へと変化しています。その内訳は明記されていないものの、65人乗りボギー車2両が導入された一方で40人乗り四輪車3両が消えたとしか考えられません。また駿遠電気の営業報告書では1922(大正11)年10月時点の四輪電動客車の両数が8両となっていることから[7]、抜けた3両は付随客車ではなく電動客車であったことが分かります。よって駿遠電気から上田温泉電軌へ譲渡された車両は定説の2両ではなく3両と考えます。
これらの考察を元に、以下の仮説を立ててみます。
このように仮定すると、開通と同時に導入された7両は玉川電気鉄道における製造年月順に上田の番号を付与されたことになり、あとは譲渡時期の順に 8, 9……と素直な付番が行われたと考えることができます。10号車の譲渡時期のみ不自然さが残りますが、何かしらのトラブルで遅延が発生したか、単なる書類上の記録ミスがあったか、といったところでしょうか。
一方でこの仮説だと玉川電気鉄道の電動客車15両のうち、駿遠電気に6両、上田温泉電軌に7両(予備台車活用の8号車分を除いた両数)が譲渡されたものの、残る2両分の行方が分からないことになってしまいます。もともと駿遠電気では10両を譲り受ける予定が土壇場で変更になったため、玉川電気鉄道にとっては譲渡先が見つからず廃車となった可能性も充分に考えられますし、あるいは駿遠電気の電動貨車に活用されたとする考察もあります[8]。上田温泉電軌では予備台車に新製車体を組み合わせた可能性がある一方で、既存の完成車の車体を破棄をしたことになるため、そのような回りくどいことをするのかという疑問が残る一方、木造車体の時代なので状態の悪い車体を破棄する事例は存在し、玉川電気鉄道にとっては新製から最長13年しか経っていないとはいえあり得ないことではないとも思います。この点については自分の中でも納得のゆく結論が出ていないので、さらなる考察を見てみたいものです。
玉川電気鉄道の「第30期 事業報告書」(1917(大正6)年12月~翌年5月)より ↩ 戻る
玉川電気鉄道の「第32期 事業報告書」(1918(大正7)年12月~翌年5月)より ↩ 戻る
RAILFAN 2002年9月号 No.599「駿遠電気の車両の謎」(築地成一郎)p.12 より ↩ 戻る
鉄道史料 2016年7月号 No.149「駿遠電気の創業期の車両の解明にむけて 訂正」(阿部一紀)pp.57–58 より ↩ 戻る
『RM LIBRARY 129 名鉄岐阜線の電車—美濃電の終焉—(上)』(清水武 2010年)p.14 より ↩ 戻る
鉄道ピクトリアル 1964年11月号 No.164「私鉄車両めぐり〔59〕上田丸子電鉄(終)」(小林宇一郎)pp.60–61 より ↩ 戻る
駿遠電気の「第7回 営業及決算報告書」(1922(大正11)年5月~10月)より ↩ 戻る
www.setagayaartmuseum.or.jp
)の企画展が開催されていますが、その一環で昨日1月11日(土)に東急電鉄OBである荻原俊夫氏の講演「東急の車両設計に携わって」(www.setagayaartmuseum.or.jp
)があったので聴講してきました。 講演タイトルからしてご自身が担当した車両の話が中心になるかと思いきや、東急電車の歴史をデハ1形から振り返る内容で、著書「東急電鉄 車輌と技術の系譜」をなぞるような性質のものでした。とはいえ直接関わった8000系5次車~2000系についてはその経験から興味深い話を聞くこともできました。
個人的に興味を惹かれたのは1000系の運転台に関する話で、曰く営団地下鉄(当時)の意向次第ではツーハンドルマスコンにすることも覚悟していたと。8500系の新製に際して半蔵門線乗り入れの関係からワンハンドルマスコンを営団に認めさせたことは有名な話ですが、それから10年以上が経ってなお、営団が半蔵門線以外でワンハンドルマスコンを導入していなかったとはいえ東急側がそのような心配をしなければならなかったとは……。
ほかちょっとおもしろかった小ネタをひとつ。8000系から車体長が大型 20m になったことについて東急で初めてという言い方は(本当は)おかしい……
と念押しをされたのでチキ3095 のことを意識されているのかと思いきや、第二次世界大戦後に東急小田原線と厚木線に投入されたデハ1800形、クハ1850形(運輸省モハ63形、クハ86形割り当て)が「東京急行電鉄初の 20m 車」であると。まあ確かにそれはそうですね(笑)。著書でも大東急時代の京浜線や小田原線投入車も律儀に東急電車の一員とされていたことを思い出た次第です。