2019-09-17

CADDi C++勉強会5回目

CADDi C++勉強会の5回目が9月25日に開催されます。

C++勉強会 #5 - connpass

今回はオーバーロード解決とテンプレートの実引数推定について解説する。

2019-09-11

CADDi C++勉強会、11日に延期

CADDiのC++勉強会が、台風の影響による電車の劣悪な運行状況から、11日に延期された。

https://caddi.connpass.com/event/146851/

当日はみんなの疑問に答える形で規格上の用語を解説していく。

2019-09-03

CADDi C++勉強会4回目

C++勉強会 #3 - connpass

今回は式と文の違いといった、C++の用語の解説をする。

今回の勉強会の動機は、CADDi社員がうっかり未評価式の文脈でラムダ式を使ってしまったところ、つまり

using type = decltype([]{}) ;

のようなコードを-std=c++17でコンパイルしたところ、「未評価の文脈でラムダ式は使えない」というそのままのコンパイルエラーメッセージが出力されたが、はて、未評価とは?という疑問でこのエラーメッセージの意味するところを理解するのに相当苦労した経験をしたことが元となっている。なぜC++コンパイラーがこのようなエラーメッセージを出すかというと、未評価という言葉は規格上の用語なのだ。ちなみに、Clangのほうがエラーメッセージは親切で、「未評価オペランドの中のラムダ式」としている。これは規格そのままの表現だ。GCCの表現は規格どおりの表現ではないが、規格に沿った表現であることに変わりはない。C++コンパイラー開発者は当然C++規格を参照しているのでC++規格に沿った表現を使う。そのために、コンパイラーのエラーメッセージを解釈するには、規格の用語の知識が必要になる。今回はそのような知っていると役に立つかも知れない規格の用語を解説していこうと思う。

2019-08-27

CaddiのC++勉強会3回目

Caddiによる3回目のC++勉強会が8月30日に開催される。

C++勉強会 #3 - connpass

今回はメタプログラミング。Boost.Hanaを解説する。

最近、私自身はメタプログラミングをしていない。というのも、C++のメタプログラミングは本来計算に使うはずではなかった言語機能を無理やり計算に使っているので、いろいろと無理がある。メタプログラミング機能はコア言語に入るべきだ。C++20ではrequires式がはいる。後は静的リフレクションがはいればBoost.Hanaなど用済みになる。静的リフレクションはC++23かC++26には入るはずなので、あと5年ぐらい待てばいいと思うのだが、そこを待てないのが悩みどころだ。D&Eにも書いてある通り、今使える技術が重要なのであって、来年使える技術には価値がない。

勉強会の内容としては、Boost.Hanaのユーザーマニュアルがよくかけているので、これに沿って解説していくことになる。

2019-08-16

江添ボドゲ会8月25日

以下の要領で自宅ボドゲ会を開催します。

江添ボドゲ会@8月25日 - connpass

2019-08-13

P++: 静的型付けをめざすPHP

PHP: pplusplus:faq

PHP 8から、PHPは「PHP」と「P++」という2つの言語を提供するようになる。P++はPHPとの下位互換性を削りながら除々にPHPを静的型付け言語にする試みだ。

PHP開発者の中には2つの流派がある。PHPの源流であり現在の形である動的型付け言語としてのPHPを良しとする流派と、PHPをより強い静的型付け言語へと発展させたい流派だ。良い悪いの問題ではない。どちらの流派も正当な理由がある。しかし、ゆるふわな動的型付け言語とガチガチの静的片付け言語は同じ一つの言語として同居できない。

そこで、コードネームP++として、PHPを静的型付け言語に発展させる新しい言語の開発が提案された。P++はforkではなく、PHPと同じコードベースを共有する。PHP 8のバイナリはPHPとP++を同時に実装する。言語の切り替えは何らかの宣言によって指定する。

P++はPHPの厳格な下位互換性を諦め、少しずつ下位互換性を切り捨てつつ、PHPを静的片付け言語にしていく。

これはPerl 5/6やPython 2/3という過去の失敗に学んだのだろう。

PHPとP++は同じコードベースであり、ほとんどのコードは共有するので、PHPの開発リソースが2倍必要になることはない。

PHP 7.4をLTSにしてPHP 8から介護感性を切り捨てるのは良いアイディアではない。言語を分断させてしまう。Python 2/3がすでに犯した失敗だ。

PHP 8はPHPとP++を含むので、PHP 8をインストールするとP++もついてくる。同じコードベースでPHPとP++を共存させることもできる。

PHPの開発が止まるわけではない。ただし静的型付け機能はPHPには入らずP++に入る。PHPは下位互換性を重視する。

Hackとはどう違うのか。Hackは一企業による開発であり、コミュニティの意見によって設計されなかった。またHackは流通や知名度の問題で難がある。P++はPHPと共存するので、PHP 8をインストールしたならばもれなくP++もついてくる。

PHPに静的型付けは必要か? 現在、PHPを仕事で使っているプログラマーの中には、本来ならば静的型付け言語を好むが、仕事なのでPHPを使っている人もいる。PHPが静的型付けを提供する意義はある。

2019-08-07

キャディC++勉強会8月21日、テンプレート基礎

C++勉強会 #2 - connpass

8月21日に株式会社キャディでC++勉強会が行われる。今回はテンプレート基礎だ。参加登録は上記connpassから行える。

前回はポインターと、時間が余ったので即興でリファレンスについて学んだ。今回は初歩的なテンプレートの使い方を学んでいく。

テンプレートといえば、昔はクラスと関数だけだったのだが、今では変数、エイリアス宣言もテンプレートにできる上に、C++20ではコンセプトも追加される。今回の勉強会では初歩的なテンプレートの使い方を一通り学んだ上で、時間があれば未来か過去の話をしようと思う。未来の話はコンセプトやメタクラス。過去の話はテンプレートの歴史だ。初歩を学ぶという点では過去の話をしたほうが良いと思う。

2019-07-19

キャディ株式会社のテクニカルアドバイザーになった

C++勉強会 #1 - connpass

Ta-da:ドワンゴは辞めていない。キャディでテクニカルアドバイザーとしてC++教育もすることになった。7月30日に最初の勉強会をする。

周りで転職が頻発しているので、私もにわかに転職熱をだし、自分の転職市場における価値を確かめるためにも、いくつか企業に話を聞いてみた。その結果としては、私を給料据え置きで雇いC++の仕事をさせたいという企業はあった。しかし、教育一辺倒というわけでもないし年収も現状維持、そしてドワンゴでまだやりたい仕事も残っているときている。転職も興味ぶかい人生の選択ではあるが、しばらくはドワンゴにとどまろうという判断を今回はした。

その話を聞いた企業の一つがキャディ株式会社だ。奇しくもちょうど1年前、もうC++17を現場で使っている企業があるというので話を聞きに行ってブログに書いたことがある。

C++17をすでに現場で使っているというキャディ株式会社に話を聞いてきた

キャディは板金加工の受注生産をしている会社だ。板金加工というのは一枚の金属板を切断したり曲げたり削ったりと様々な加工をして、顧客の望む形状の金属製品を作り上げる仕事だ。従来、板金加工の依頼をするとなると、板金加工業者と話をして、望む形状を伝え、熟練の職人が長年の経験と勘で必要な加工を決定していた。これは時間のかかる作業であり、価格の見積もりだけでも長時間かかるものであった。

キャディは見積もりを自動化することを目指している。顧客がキャディのWebサイトに生産したい形状の3Dモデルデータをアップロードすると、それをソフトウェアで処理し、あたかも折り紙を展開するように、1枚の板から目的の形状を作り出すための加工を決定する。必要な板金加工が自動的に決定できるのであれば、価格の見積もりもできる。従来の板金加工業者が、何日や何週間もかけてようやく見積もりを出していた作業が、自動化をすることによって一瞬で見積価格を顧客に提示することができる。これがキャディの目標だそうだ。

板金加工の見積もりを自動化する。こう書いてしまうととても簡単に読める。しかし似たような計算である折り紙の展開というのは数学的に難しい問題である。自動化の実現には、数学力とアルゴリズム力とコーディング力が必要だ。キャディは自動化の要となる処理の実装について、最新のC++を選択した。古いC++で生産性を下げている余裕はない。問題は、最新のC++を知っているプログラマーは労働者市場では希少だということだ。

しかも、単にC++を知っているだけではダメで、数学力とアルゴリズム力も問われる。しかし、これについては朗報がある。AtCoderのような競技プログラミングコンテストを定期的に開催しているWebサイトの興隆で、今や競技プログラミングは盛んに行われている。高レートを維持している優秀な競技プログラマーは本物の数学力とアルゴリズム力を持っているので、数学力とアルゴリズム力を持ったプログラマーは労働者市場に多数供給されている。

AtCoder:競技プログラミングコンテストを開催する国内最大のサイト

好都合なことに、競技プログラミングではC++が使われることが多い。問題は、単に競技プログラミングで好成績を出すためだけであれば、C++を理解する必要はないということだ。一部の突出した競技プログラマーは、プログラマーというよりはもはや数学者に近く、彼らにとってC++というのはプログラミング言語ではなく、都合のいい計算機でしかない。そのため、必要な数学力とアルゴリズム力とC++力を兼ね備えた人材は労働者市場に極めて稀にしか存在しない。労働者市場に即戦力がいないのであれば教育するしかないが、最新のC++がわかるプログラマーに数学を教えるのと、競技プログラマーに最新のC++を教えるのはどちらがマシかというと、確実に後者だ。そもそも、労働者の人口としてもC++プログラマーより競技プログラマーの方が多い。

キャディは最新のC++を現場で使う興味深い企業であるので、強い興味を持ちながらも、ドワンゴの環境も捨てがたく、結局転職はしなかったのだが、つい先日、技術顧問として月2回ぐらいキャディの社員向けにC++教育をしてくれないかという話がきた。キャディ社内には私と同等以上にC++に詳しい人間がいる。ただし彼には数学力もあるので教育よりは現場の開発に労力を費やしてほしい。単発の勉強会で30分ぐらい話してくれというのであればともかく、定期的に月2回も社員向け教育をしてくれというのは流石に無償では引き受けられない。では報酬も支払うという話になった。

ところで、今私が雇用されているドワンゴでは兼業申請が通れば兼業をしてもよいということになっている。兼業申請が認められるための条件はいくつかあるが、特に重要な条件に、ドワンゴと競合関係にないという条件がある。ドワンゴが板金加工事業をしているという話は聞いたことがないし、その他の条件も問題はないだろうと考え、兼業申請を出してみたところ承認された。

そしてこのたび、キャディ株式会社のテクニカルアドバイザーとなった。

当面の予定としては、月2回、勉強会を開くことになっている。勉強会でキャディの社内情報がかかわらない内容については、聞きたい人がいれば社外から少し人が聞きに来てもいいだろうということで、connpassで勉強会の告知を行うことになった。

C++勉強会 #1 - connpass

勉強会の内容としては、さしあたって、テンプレート、メタプログラミング、ムーブセマンティクスを理解できるようにする目的だが、記念すべき第一回目では、ポインターについて話すことになった。

なぜポインターなのか。私はちょうどC++入門書を書いている。この入門書ではC++知識のブートストラップを試みた。参考書ではすでに教えた知識だけを使って、次の知識を教えるようにした。このような入門書を書くのは初めてなので手探りで牡蠣進めていった結果、ポインターを教えるまではなんともいいがたい教えにくいという違和感があったのだが、ポインターを説明してからは、ポインターの知識を前提にできるので圧倒的に教えやすくなった。そのため、もしポインターが理解できていないのであれば、まずポインターを理解するべきであると考えた。そのため、今回はポインターだ。

https://github.com/EzoeRyou/cpp-intro

ポインターの難しさは複合的な要因がある。アドレスや関節参照という概念の難しさ。C++の型システムの難しさ。C++の文法の難しさがある。この3つを意識しながら7月30日は2時間、ポインターについて話をする。

江添自宅ボドゲ回@7月28日

7月28日に自宅ボドゲ回を下記の要領で開催します。

江添ボドゲ回@7月28日 - connpass

2019-07-15

標準C++規格が3年おきに制定される理由

現在、C++の標準規格は3年おきに制定されている。このスケジュールはC++14から厳しく守られていて、C++20は2020年に制定される予定だ。

なぜなのかを議長のHerb Sutterが解説している。

Draft FAQ: Why does the C++ standard ship every three years? – Sutter’s Mill

まず現状認識として、C++の標準規格は3年おきに制定される。ドラフトにバグがあるので遅らせるべきではないのか。ダメだ。そのために2年間の機能追加と1年間の機能フリーズとバグ修正の期間が儲けられている。

しかし、ある「機能」はあと数回の会議を経たならば完全に合意できて入れられる状態になっている。この「機能」のためにC++20を少しだけ遅らせられないのか? ダメだ。期限までにC++20に入れられない「機能」はC++23に回される。

このスケジュールは厳しすぎる。なぜ3年という固定の期間で物事が進むようになったのか。なぜならば、プロジェクト管理をする方法は2つしかない。長年の経験により、この方法が別の方法よりマシだとわかったからだ。

プロジェクト管理をする2つの方法とはなにか? 完成品をリリースするタイミングを決定する方法で、2つある。一つは機能に合わせること。もう一つは期間に合わせること。どちらか一つしか選ぶことはできず、一報を選んだならば他方を選ぶことはできない。

リリースを機能に合わせる場合、機能が完成しなければリリースできない。そのため、リリース期間を決めることはできない。結果としてリリース期間が際限なく遅延する。

リリースを期間に合わせる場合、期間に間に合わなかった機能は今回のリリースには含まれない。

リリースを機能に合わせる場合というのは、C++98とC++11だった。C++98規格は本来1994年までに制定されるはずだった。Bjarne Stroustrupは1994年までに制定できなければ失敗だとまで言った。結果、1998年になった。C++11は200x年までに制定されるはずだった。結果として2009年にすら2年間に合わなかった。

ある機能が、あと数ヶ月で完成するという時、それは数ヶ月で完成しないし1年でも完成しない。にもかかわらず、あと数ヶ月で完成するからという言い訳でリリースを延々と引き伸ばすと、当初の予定より大幅にリリースが遅れてしまう。

C++の規格制定が遅れると、C++コンパイラーの実装も遅れる。C++コンパイラーベンダーとしては、せっかく実装した機能が、規格の変更によって変わってしまうということを考えると、まだ変更されているうちはわざわざ労力を費やして積極的に実装する理由がない。規格を制定することでようやく実装にかかることができる。

C++98とC++11でこのような失敗をしたのは、我々は経験不足だったからだ。経験を得た我々は、プロジェクト管理に厳格な期間を定めることによって、スケジュール通りに規格を制定するようになった。3年の期間に間に合わなかった機能は次回以降の規格に回す。

2019-07-14

AMDのZen 2でRDRANDが-1を返すので最近のGNU/Linuxがブートできない問題

AMDのZen 2アーキテクチャの新製品が発売されて沸き立っているが悲しいお知らせがある。最近のGNU/Linuxディストロはブートしない。例えばUbuntu 19.04はブートしない。

理由は、ハードウェア乱数を返す命令、RDRANDに不具合があり、常に-1を返すのだという。このため、rdrandを直接使っているsystemdが失敗し、結果としてブートできなくなる。

AMDによればこの問題はBIOSアップデートで修正可能であるという。しかしこれはとても怪しい陰謀論を考えたくなる。なぜRDRANDが常に-1を返すような不具合が未然に発覚せずに製品リリースまでこぎつけてしまったのか。なぜファームウェアのアップデートで修正可能なのか。まさかバックドアなのではないか。

陰謀論はともかくとして、もう一つの問題は、なぜsystemdはRDRANDを直接使っているのかということだ。Linuxカーネルの提供する/dev/urandomではなぜだめなのか。

その理由は他ならぬsystemdのソースコードにコメントとして記載されている。

https://github.com/systemd/systemd/blob/f90bcf8679e8708788290519dc09371e60c6fc82/src/basic/random-util.c#L34

Linuxカーネルのブートの直後では、十分なエントロピープールが溜まっておらず、/dev/urandomへのアクセスすらかなり長い時間ストールする可能性がある。特に組み込みやVMといった環境では問題になる。このため、systemdはブート直後かつ、UUIDとハッシュテーブルのシードの生成のみにrdrandの値を直接使っている。

UUIDはユニーク性さえあればよく、セキュアなRNGは必要がない。

ハッシュテーブルは攻撃者が恣意的な値を多数登録することで、オーダーをO(1)ではなくすることができてしまう。そのためにハッシュ計算のシードに乱数値をつかている。

当初はsystemdはRDRANDを直接使うなんて馬鹿げたことをするものだと思っていたが、どうもこの状況を考えるに使いたくなる気持ちもわかる。systemdはRDRANDがない環境もサポートしているため、フォールバック実装はあるのだが、rdrandがあるが壊れている環境ではどうしようもない。

現在、systemdにworkaroundがコミットされているほか、ファームウェアアップデートが予定されているそうだが、問題はマザーボードベンダーがアップデートを提供するには時間がかかるため、しばらくはこの問題に悩まされそうだ。

結論としてはAMDが悪い。

2019-07-12

GPLv3でライセンスされた自由な技術書の電子書籍を買う理由

江添亮の詳説C++17の電子書籍の売上に対する印税の通知書がアスキードワンゴから送られてきた。額としては微々たるもので、9ヶ月かけて執筆した労働力に対する収入としては圧倒的に少ない。私がドワンゴに雇用されていて安定した給与所得があるのでなければ割に合わない。回らない寿司が何度か食べられる程度の額だ。

アマゾンで江添亮の詳説C++17を購入:https://www.amazon.co.jp/dp/4048930605

ところで、この本はGPLv3でライセンスされた自由な本だ。当然ソースコードが公開されている。

https://github.com/EzoeRyou/cpp17book

にもかかわらず電子書籍に金を払う理由はなぜだろう。しかも、その電子書籍の中にはAmazonのKindleのような不自由な本も含まれているのだ。

AmazonのKindleで多くの本を読んでいるので、不自由ではあるが同じデバイスで本を読みたいという人はいるだろう。

販売している電子書籍はプロの編集者によって組版されている。ここに価値を見出しているのかもしれない。

あるいは単に筆者に対するお布施かもしれない。

気になったのでTwitterで聞いてみた。

どうやらお布施目的が多いようだ。

技術書の出版が商業的に成立するにはお布施目的だけでは成り立たない。難しいものだ。

それはそうと、私の書いたC++入門書の出版作業をいましている。近いうちにアスキードワンゴから出版できる見込みだ。

https://github.com/EzoeRyou/cpp-intro

今回は、古くからの友人のプロのカメラマンである三浦大に依頼して、著者近影を撮影した。

http://www.masarumiura.jp/

著者近影の写真の著作権は撮影したカメラマンのものだが、それ以外の本はGPLv3だ。

また、C++と並列処理について書かれたAnthony WilliamsのC++ Concurrency in Actionの翻訳もアスキードワンゴから出版される予定だ。こちらは私が査読をする。

2019-07-09

C++20 Deprecate implicit lambda capture of this

C++20 deprecated the implicit lambda capture of this. What does it mean and how can we keep up with the change?

As of now, you probably don't need to do anything. Because it's just the deprecation, not the removal. But in the future, it will eventually be removed so be prepared.

So what is "implicit lambda capture of this" anyway? The following code relies on that behavior.

struct S
{
    int x ;
    void f()
    {
        // C++17: Well-formed
        // C++20: Deprecated.
        [=]{ std::cout << x ; }
    }
} ;

So above code use the variable x. this name x is a data member of class S. So "x" in this context means "this->x". Above code works because lambda capture implicitly capture this pointer. That's why we can use "x" inside the lambda expression.

You may not realize it but this "x" is not captured by copy. In fact, "x" is not captured at all. What lambda capture instead is this pointer. So we can use "x" via the this pointer. So "x" is effectively captured by reference. We can change the value of x.


void f()
[
    auto change_x = [=]( auto value ) { x = value ; } ;
    change_x(123) ;
}

This behavior breaks novice's assumption that lambda capture clause "[=]" means capture by value. People may write code like this:

struct S
{
    int x ;
    auto get_closure()
    {
        return [=]{ return x ; } ;
    }
} ;

int main()
{
    std::function<int()> f ;
    {
        S s{123} ;
        f = s.get_closure() ;
        // s's lifetime ends here
    }
    int result = f() ;
}

Assuming that it's safe because of captured by value and get caught by Undefined Behavior.

C++17 partially fixed this by introducing the explicit capture of this.


struct S
{
    int x ;
    void f()
    {
        // capture this pointer by value, x is reference
        [this]{ x ; } ;
        // catpure *this by value, x means x is value
        [*this] { x ; } ;
    }
} ;

"[*this]" copy the this pointer which means x is accessed through this pointer. "[*this}" copy the *this, that is the value of class object S. Since it copy the class object, x is copied too.

C++17 retained the implicit capture of this.

In C++20, it is decided that the standard deprecate the implicit capture of this via [=].


struct S
{
    int x ;
    void f()
    {
        // C++17: well-formed, it means [=, this]
        // C++20: deprecated, it still means [=, this]
        // C++??: if removed, ill-formed.
        [=] { x ; } ;
    }
} ;

The behavior of "[&]" doesn't change. It still implicitly capture this pointer by value. So the data members are effectively captured by reference. There should be no confusion on this.

2019-06-18

江添ボドゲ会6月30日

以下の要領で6月30日に自宅ボドゲ会を開催します。

江添ボドゲ会@6月30日 - connpass

2019-05-26

ダンスを学び始めて一ヶ月がたった

超会議でダンスを見て、にわかにダンスを学びたいと思ったものの、体が一切動かないので、ダンススクールに通い始めて早一ヶ月、未だに踊れるようにはなっていない。

向上を実感したことはある。まず拍子が認識できるようになった。裏拍もおぼろげながら認識できるようになった。

レッスン中のルーチンの振り付けを覚えられるようになった。始めた当初は、眼の前でインストラクターが実演する8拍や16拍程度の動きが全然覚えられなかった。今はある程度覚えられるようになっている。

ただ、拍子が認識でき、振り付けを覚えられるようになったからといって、体が動くわけではない。手足で表裏を交互に取るような動きは未だに難しい。ヒザで表を取りクラップで裏を取る動作だけは練習して少し体を慣らしたが、汎用的ではない。また、表と裏を交互に切り替えていくような動きも苦手だ。

手と足を同時に動かすことができない。足を正しく動かそうとすると手が動かなくなり、手を正しく動かそうとすると足が動かなくなる。そして、手と足が連動して動いてしまう。例えば歩くように右足と左手、左足と右手を交互にあげていく動きは、右足と右手が同時にあがるナンバ歩きのような動きになってしまう。

BPMが早いと拍子に体がついていかない。全力で無理やり体を動かしてもまだ拍子が速すぎるように感じ、それでも無理やり体を動かそうとすると、途中の動きを1拍飛ばしてしまい、拍子を追い越してしまう。

すでに練習した動作が出てきた場合は、少しはマシに動くことができるので、結局どこでもでてくるような有名な動作は一通り練習して慣れるしかないのだろう。

柔軟は一向によくならない。昔からあぐらをかけないほど股関節が硬かったが、毎日柔軟しても全く変らない。また肩の関節も硬いので、背中で手を組むことができない。しかし、よくわからないことに前屈はできる。なぜここまで体が硬いのに前屈だけはできるのかがよくわからない。

ここ数年は習慣的に運動していたことも幸いして、連日でダンススクールに行けるほどの体力はある。ただし、一週間ほど連日でレッスンを受けると、関節が痛むので、休まなければならない。連日レッスンを受けると、筋肉は問題ないが、関節が限界になるようだ。関節は一度痛めてしまうと回復に時間がかかる。ボルダリングも週に何度もしたいのだが、関節に負荷がかかるために、今は週1にとどめている。

自分の体について考える時、常に体質について意識させられる。どうも自分の体は筋肥大しやすい体であるようだ。単関節の単純な筋トレは自分でも驚くほど短期的に向上するし、見た目にわかるほど筋肥大する。問題は、運動神経が伴っていないということだ。昔から多関節を使う複雑な運動が苦手だった。

筋肉とは名前の付けられた筋肉であっても、すべての筋繊維が一斉に動くわけではない。筋繊維が数十本、数百本と集まった運動単位で動く。筋力を出した質の高い運動をするには、単に筋肥大をするだけではなく、多くの運動単位を一斉に動かす必要がある。そして多関節の運動では、適切な運動単位の一連の動きが必要になる。どうも自分は俗に運動神経と呼ばれている筋肉の動かし方が下手なのではないかと思う。

ダンスのジャンルだが、ダンスを学びはじめる前は、非人間的な動きがしたいのでPOPに興味があった。今通っているダンススクールでもPOPのレッスンはあるのだが、まだあまりにも踊れないので特定のジャンルを銘打たないリズムトレーニングのレッスンしか受けていない。リズムトレーニングのルーチンの動きはだいたいとても簡単で基礎的なものばかりなのだが、一人だけ毎回LOCKでルーチンをするインストラクターがいる。結果的に今は特定のジャンルで言うとLOCKだけを少し練習した状態になっている。

ダンスを学ぶ前に各ジャンルのダンスの動画をひと通り見たのだが、LOCKは地味で良さがわからないという印象を持った。ところが、LOCKをわずかにかじった今、同じ動画を見返してみると、以前は地味に見えたはずのダンサーはとてつもない技量を持っていることがわかり、しかもかっこいいと感じるようになった。

どうもこれは私だけではないらしく、動画サイトで素晴らしいLOCKダンスにも、ダンス未経験者から「地味」とか「同じ動きを繰り返していて単調」みたいなコメントが付けられている。

というわけでダンスを学び始めて一ヶ月だったが、まだ踊れるレベルには達していない。向上が実感できる部分もあるが、まだ時間がかかりそうだ

さしあたってはダンスの経過観察のための動画撮影用にカメラを買いたいが、今の所他の運動でも使い回すことができるので、GoProを買おうと思っている。ただ、今年の秋頃に出るはずの次の製品を待つつもりだ。

2019-05-20

江添自宅ボドゲ会@5月26日

5月26日に下記の要領で自宅ボドゲ会をします。

江添ボドゲ会@5月26日 - connpass

2019-05-18

Epicストア、根回しなしにセールをしてゲーム取り下げが発生しカオスな状況

ゲーム流通プラットフォームであるEpic Storeは、Epic Mega Saleと称して、とても大規模な一時的な値下げを行った。これはほとんどのゲームタイトルを一律10ドル値下げするというもので、値下げ分はEpicがゲームパブリッシャーに補填する。

しかし、一律10ドル値下げというのが問題に鳴っている。50ドルのゲームが40ドルになるならいいとしても、15ドルのゲームは5ドルに、11ドルのゲームは1ドルになってしまう。値下げ分は補填されるとは言え、これは長期的にはとても問題になる。

何故か。ゲームはリリース直後が最も価格が高く、時間が立つに連れて昔のゲームとなるので安くなっていく。これは当然の話で、リリースされたばかりのゲームは最新のスペックで動く最新の技術を使った旬なゲームなので、当然値段を高くして開発費用を回収して利益を出す。しかし、10年前のゲームは10年前のスペック向けの10年前の技術を使った、今となっては見劣りするゲームだ。したがってその価値は低く、値段を安くしないと売れない。

またゲームは、一時的な値下げをして短期的な売上を上げる戦略が行われている。期間限定で値下がりをしているなら、値段が下がっているうちに買おうという心理が働くためだ。

しかし、そのような慣習と戦略が続いた結果、購入者の方でもゲームを購入する戦略ができている。ゲームは待てば必ず値段が下がる。ということは数年前の安くなったゲームを、さらに一時的な期間限定の値下げを狙って変えば、とても安く購入できる。そして、購入するならば市場最安値と同等以下の値段で買いたい。

あまりに需要があるためか、世の中には様々なゲームの値下げをトラッキングしているWebサイトまで存在する。

Deals - IsThereAnyDeal

そのような状況で、Epicの値下げは問題になる。よほど興味のあるゲーム以外は、底値でしか買おうとしない雰囲気が燻蒸されている業界で、一時的にせよ数ドル程度に値下げされたという歴史を持ってしまうと、今後そのゲームは数ドルでしか売れなくなってしまう。その歴史が着くことを嫌ったゲームパブリッシャーが、Epic Storeから次々にゲームを一時的に販売取り下げに走っている。中にはEpic独占販売のゲームや、Epic独占かつプリオーダー状態のゲームですら取り下げられている。これらのゲームはセールが始まってから取り下げられたことを考えると、Epicは事前の根回しなしに急に今回のEpic Mega Saleを始めたことが伺える。

そんな中興味深いのがUbisoftだ。Ubisofthは都合がいいことに、Epic Mega Saleの始まる1週間前から、「Uplayの不具合」という理由で、Epic Storeから全ゲームを一時的に販売取り下げしている。ゲームの販売を一時的に中止しなければならないほどの不具合にもかかわらず、またセール期間中というとても重要な時期にもかかわらず、未だにUbisoftは「Uplayの不具合」を都合のいいことに「修正」できていない。これではまるで、Ubisoftは根回しか内通かスパイなど何らかの方法で事前にEpic側の動向を知っていたのではないかと疑ってしまうほどの都合のよさだ。もちろん、Ubisoftの表向きの理由は未だに「不具合」だ。

なぜEpicがこんな暴挙に出たかと言うと、競合相手のValveのSteamのセールが近づいているので、対抗したかったのだろう。それにしても無計画でカオスだ。長らくSteam一強だったゲーム流通プラットフォームシェアは、果たして揺らぐだろうか。しかし、顧客からするとゲームが急に販売取り下げられたりするのは利便性を上げたりしない。

2019-05-16

ダンスを学び始めたが裏拍が取れない

超会議で見たダンスに感銘を受けてより、ダンスを学ぶことを決意した。さっそくその時見たダンスの振り付け動画を見て体を動かそうとするも、全く動かない。そこでダンススクールに通うことにしたのだが、やはり絶望的に何もできない。それでも頑張って2週間通い続けたところ、音楽を聞くと拍を認識できるようになっていた。今まで私にとって音楽とは、拍も音程もなく、よくわからない雑音に混じって歌詞が流れていくるものという認識でしかなかったのだが、規則正しい拍に合わせているということが認識できるようになった。ダンスの動きも拍に合わせる。なので拍を認識できるようになったというのはいいことだ。

と満足していたところ、ダンススクールのレッスンで、裏拍に合わせて手拍子をするという訓練が行われた。しかし、これができなかった。さらには、ヒザで表拍を取りながら手で裏拍を取れという訓練になり、致命的にできなかった。

裏拍がなんであるかについては理解しているつもりだ。拍には速度というか周期があり、例えばアナログ時計の秒針であれば60BPM(Beats Per Minutes)だ。秒針の音が表拍だ。裏拍とは表拍と次の表拍の中間、秒針の場合、表泊が鳴ってから0.5秒後に存在する拍だ。つまり裏拍は、表拍と表拍の中間とか、あるいは倍のBPMにして、表拍ではない拍などと考えればいいはずだ。

理解はともかく、裏拍が手拍子で取れない。気がつくと表拍に合わせてしまっている。さらに、ヒザで表泊を取りながら手で裏拍を取るのは、ヒザに釣られて手も表になってしまう。拍が認識できない問題と、体が動かない問題の両方があるのだろう。

困った。体を鍛えて動くようになればダンスはできると思っていたが、拍が認識できないのではいくら体がうごいてもダンスができない。

ちなみに、いまだに体も動かない。ダンスレッスンでは100を超えるようなBPMでルーチン振り付けを訓練するのだが、そんな速さで体を動かすことができない。また、手と足を同時に動かすことができず、足を動かそうとすると手が動かず、手を動かそうとすると足は止まる。また、両手でアシンメトリーな動きをすることもできない。つま先と足首で16ビートを取りながらヒザで8ビートを取りステップしろという訓練もできなかった。

ところで、裏拍について調べると、どうも日本語と英語の対応がが混乱してくる。表拍がdownbeatで、裏拍がupbeatのようだ。また、on-beatとoff-beatという言い方もするらしい。あるいはback-beatなる言葉もあり、これは裏拍にあたるらしい。また日本語でも強拍/弱拍があり、これは表拍を強く、裏拍を弱くするといい感じのリズムになるので表拍が強拍、裏拍が弱拍の代わりに使われている文脈もあるらしく、一層混乱する。

また、Twitterに「裏拍が取れない」と愚痴を書き込んだところ、面識のないアカウントからも大量に「そもそも裏拍とはなにか」という解説から始まり、「僕の考えた最強の裏拍のとり方」という指南まで多数のリプライが飛んできた。これは一体どういうことだろう。今のTwitterでは、昔と違い、面識のない人間へのリプライはなかなか行われないのだが、珍しく大量の面識のないアカウントからのリプライがやってくる。世の中には裏拍がわからない人間には裏拍を解説しなければならないという強い思いがあるのだろうか。あるいは、裏拍を認識できない人間というのは、呼吸の仕方がわからないと主張する人間と同じように常識外れであるから、自転車小屋議論になったのだろうか。

どうも世間的には裏拍を認識できない人間のほうが少数派のようで、周りの身近な人間に裏拍が取れないと愚痴をこぼしても、皆、裏拍が認識できないという自体が理解できない様子で、共感してくれる人はまれであった。

唯一得られた共感は、「あー、難しいですよね、ドラムで(両手両足で4つの別のリズムを取るときの一本の)足のスネアを裏拍で取らないといけないのが、なかなかできないんですよー」というものだったが、これは明らかに違う。

2019-05-12

ダンススクールに通って2週間がたった

ダンスを始めたくなったが、全く体が動かないのでダンススクールに連日のように通い始めて2週間たった。

劇的な変化として、音楽から拍子を認識できるようになった。いままで、私は音楽の拍子も音程もほとんど認識できず、したがって全ての音楽は無秩序な雑音にしか聞こえなかったのだが、どういうわけか急に拍子が認識できていることに気がついた。そして認識した表紙に合わせて体を揺らすことができるようになった。

その場で見た振り付けを覚える能力が上がった。ダンススクールではインストラクターが振り付けを数回実演し、その後はその振り付けを繰り返すことになるのだが、これが最初、まったく覚えられなかった。2週間たった今、この振り付けを短時間で覚える能力が上がった。まだ十分ではないが、少なくともだいぶ向上した。

レッスンでは必ず柔軟が行われるが、股関節の硬さについてはまだなんの向上もない。現状では、私はあぐらが書けないほど股関節が硬いのだ。周りの受講者と比較しても、ここまで股関節が硬い人間はそういない。

レッスンでは腹筋やプランクのような筋トレも行われるが、これについては日常的にボルダリングをしているためか、問題なくこなすことができる。基礎的な筋力がすでについているというのは恵まれている。私にとってプランク姿勢を3分間維持するのはそれほどのことでもないのだが、どうも平均的には3分間維持できない人のほうが多いようだ。

アイソレーションについては、首の左右が難しい。また個別の動きはできるものの、つなげて円を描くように動かす動作を速くすると、動きが雑になってしまう。

肝心の振り付けはいまだに体がまったく動かない。振り付けを覚える能力が向上したために、なおさら目標の振り付けと自分の実際の体の動きの乖離を強く認識するようになった。ゆっくりと確実に動かしていくならばできるのだが、音楽の拍子に合わせて動かすと、あまりにも動きが早すぎるために、体がついていかない。

日頃から運動しているおかげか、ダンススクールのレッスン単体では筋肉痛にならないのだが、この2週間、ほぼ連日でレッスンを受けたために、徐々に疲労が蓄積している感じがする。軽い筋肉の張りを感じるので、もったいないがここは数日ほど休んで体の回復を待つべきだろう。

2019-05-07

マイクロソフト、無駄な抵抗を辞めてWSLに本物のLinuxカーネルを同梱する

Announcing WSL 2 | Windows Command Line Tools For Developers

「自分らはLinuxカーネルだ。防衛を解除して投降せよ。自分らの技術上の差異は自分らのものとする。自分らの文化は自分らの益とする。抵抗は無意味だ。」

マイクロソフトはWSL 2で本物のLinuxカーネルを同梱して利用すると発表した。

最初のWSLは、マイクロソフトによるLinuxカーネルのシステムコールの互換実装であった。これは様々な互換性とパフォーマンスの問題を抱えていた。互換性は果てしなく低く、パフォーマンスは主にファイルシステム周りがとてつもなく遅かった。

新しい実装であるWSL 2では、本物のLinuxカーネルを使い、完全なシステムコール互換性を実現する。このLinuxカーネルはマイクロソフトによってビルドされている。最初のバージョンはLinux 4.19となる。WSL 2用に変更を加えていて、これは「オープンソース」となる(RMSがまなじりをことごとく割き、怒髪冠を貫く勢いで激怒しそうな誤用でここは自由ソフトウェアというべきである)

本物のLinuxカーネルを使うことにより、WSL 2では圧倒的なLinuxシステムコール互換とパフォーマンスの向上が行われる。

パフォーマンスでいうと、初期テストではtarballの展開が20倍、git clone, npm install, cmakeなどの操作が2-5倍、パフォーマンスが向上する。

互換性という点では、Linux版のDockerが実行できるようになる。また、LinuxカーネルのFUSEを使えるようになる。

FUSEのサポートは興味深い。

2019年の6月末にWindows Insider Programで配布開始されるそうだ。

2019-05-05

CloudflareのDNSからArchive.isが解決できない問題について

Tell HN: Archive.is inaccessible via Cloudflare DNS (1.1.1.1) | Hacker News

あの有名な1.1.1.1であるCloudflareのDNSから、Archive.isが解決できない。なぜかCloudflareはローカルホストを返す。というHacker News上での質問について、Cloudflareの創業者の一人であるMatthew Princeが回答している。

We don’t block archive.is or *any other domain* via 1.1.1.1. Doing so, we believ... | Hacker News

1.1.1.1ではarchive.isも含むすべてのドメインを検閲していない。検閲は我々がサービスを立ち上げたときにユーザーに約束したDNSの正当性とプライバシーとセキュリティを損なう。

archive.isの権威DNSサーバーは我々のクエリーに対し、1.1.1.1に対して間違った結果を返す。私はClouldflare側での修正を担当部署に提案したが、そのような変更も、我々がサービス立ち上げ時にユーザーに約束したDNSの正当性とプライバシーとセキュリティを損なうものであると、正しく、指摘された。

archive.isのオーナーの説明では、間違った結果を返すのは、我々がEDNSサブネット情報を渡さないからであるという。この情報は名前解決を要求するユーザーのIP情報をリークし、それによって、ユーザーのプライバシーが犠牲になる。我々がより一層のDNSトラフィックの暗号化を推し進めるにあたってこれは問題になる。というのも、リソルバーから権威DNSへの通信はたいてい平分だからだ。国家の諜報機関がEDNSサブネット情報を監視して個人を特定している状況が現実に起こっている。この現状が1.1.1.1のプライバシーとセキュリティポリシーの理由にもなっている。

EDNS IPサブセットはDNSベースのロードバランスをするサービスに、地理情報に応じたレスポンスを返すのに使われている。しかし、1.1.1.1はCloudflareの現在180都市に展開している全ネットワークで提供している。Cloudflareは、Cloudlfareがクエリーする場所の地理情報を渡している。これにより、Cloudflareよりも密度の低いネットワークであれば、適切なDNS結果を返すことができるだろう。archive.isのような小規模な運営であれば、EDNS IPサブネットの代わりにCloudflare PoPを使っても、地理ロードバランスが妨げられることはない

Cloudflareよりも密度を持つネットワークやISPであるごく一部(例えば、Netflix, Facebook, Google/YouTube)については、EDNS IPサブネットに変わる、プライバシーとセキュリティーを損なうことなく地理情報に応じた対応ができる機能を協力して策定中である。これらの議論はまだ進行中だ。archive.isがこの枠組みで提案があるのであれば、我々は考慮する。

なるほど。ユーザーの地理に応じてDNSロードバランスで最適なIPアドレスを返す場合、EDNSサブネット情報を使うが、これは、ユーザーの位置情報(EDNSサブネット情報)が、ユーザーの利用するDNSサーバー(この場合Cloudflare)から権威サーバー(archive.is)に渡ってしまう。Cloudflareは大規模に世界各地にDNSサーバーを設置し、ユーザーのEDNSサブネット情報は渡さず、CloudflareのDNSサーバーの位置情報を渡す。これによってユーザーの具体的な位置ではなく、CloudflareのDNSのサーバー単位の位置情報になるので、ユーザーのプライバシーがやや保たれる。

興味深い。

2019-05-02

奇妙な乗り物、SBykeを購入した

SBykeという奇妙な乗り物がある。言葉で説明するより、動画を見たほうが早いだろう。

SBykeに最も近い形状の乗り物はキックスクーターだ。ペダルもハンドクランクもない軽車両で、地面を蹴って人力で進むという点ではキックスクーターに近い。ただし、キックスクーターとはだいぶ異なる乗り心地になる。

SBykeは前輪にBMXの大きなエアタイヤがついている。前輪はボードに固定されていて曲がらない。取っ手はステアリングではなく単なる取っ手だ。ターンは後輪で行う。スケートボードのように、リーンすると後輪が曲がるようにできている。前輪には自転車によくあるブレーキもついている。

SBykeは2012年にリリースされた割と新しい製品だ。ホイール径の大きなエアタイヤのキックスクーターを探していて発見した。そのあまりにも奇抜すぎる仕組みが気になって即座に購入してしまった。

無事に自宅に届いたが、まず組み立てなければならない。組み立ては付属の六角レンチだけでできるのだが、いろいろと不親切だった。まずトップデッキの上からネジを貫通させるのだが、トップデッキには穴が空いていなかった。そして、ネジが一本、どうやっても回りきらず浮いてしまう。浮いてはいるものの、このネジ一本だけでも固定されているので、固定はされているものと考えて残りのネジも締めた。そして、タイヤの空気が入っていないことに気がついた。SBykeはアメリカの会社の製品なので、タイヤチューブのバルブは米式であった。しかたなく英米仏3方式に対応した空気圧ゲージもついている空気入れを注文して、数日を無駄に過ごした。

空気入れは届いたが、あいにくとその日は雨が降っていて乗ることができない。今日、ようやく初めて乗ることができた。

SBykeはとても乗りづらい乗り物であった。そもそもリーンしないと曲がれない上に、リーンしすぎると曲がりすぎてしまう。しかし、浅くリーンした状態を維持することは難しい。果たしてこの乗り物に問題なく乗れる日は来るのだろうか。

2019-05-01

ダンスを学びたかったのでダンススクールに行ってみたが教育ではなかった

超会議2019でとても切れのあるダンスに感銘を受けたので、にわかにダンスを学びたくなった。ちょうどスノーボードもシーズンが終わり、新しい有酸素運動を欲していたところだ。ダンスは丁度いい運動になるのではないか。しかし、ダンスはどうやって学べばいいのだろう。私はボルダリングとスノーボードとキックスクーターをしている。したがって私は日頃からある程度運動をしている状態にある。しかし、体の動かし方がわからない。スノーボードではインストラクターがとても役に立ったので、ダンスでもインストラクターから学べばいいのではないかと思い立った。幸い、ダンススクールは都内にたくさんある。ゴールデンウィークを幸いに、インターネット上で検索して自宅からも職場からも近い、通いやすいダンススクールに行ってみた。しかし、期待していた教育ではなかった。

天才は教育で作ることができる。天才を科学的に研究している研究者の著書、Peak: Secrets from the New Science of Expertiseによれば、様々な人間の才能は教育で作ることができる。例えばランダムな数字桁の暗記、絶対音感、バイオリンの演奏といった技能は、教育することができる。これらは先人がすでに効率的で効果的な教育方法を確立させているからだ。

私は、ダンススクールに教育を期待していた。ダンスを構成する動きを1挙動ずつ区切り、そのときの荷重や跋重、重心の位置、遠心力などを力学的に解説し、適切な体の動かし方を学ぶ教育を期待していた。スノーボードではそのような教育が確立しているらしく、プロのインストラクターにかかれば未経験者が2時間でトゥエッジのサイドスリップができるようになり、4時間でターンができるようになり、6時間で連続ターンができるようになる。

私が行ったダンススクールにおける「レッスン」は以下の通りであった。

鏡張りのフロアで爆音で音楽を流し、音楽に合わせてインストラクターが演技をするので、各自その動きをマネる。まず体操をし、続いて筋トレをし、短い振り付けを反復練習し、時間が来たので終わるという形であった。インストラクターの動きはすばらしかったが、インストラクターはほとんど助言をしなかった。ただ手本となる演技をするだけだ。

これは教育だろうか。私には、学ぶための環境と見本を用意しただけにしか見えない。教育はしていない。環境はよい。仕切りのない広い部屋で、床は硬いながらもやや衝撃を吸収するようにできており、壁は鏡張りだ。建物は防音されているので、激しく踊っても近所迷惑にはならない。見本もよい。インストラクターの動きは私をしてダンスを学びたいと感銘を受けたあの名前も知らぬ踊り手同様によい。しかし、ほとんど指導はなく見て模倣して覚えるしかない。

設備も気になる。なぜあんなに耳が痛くなるほど爆音で音楽を流さなければならないのか。部屋は防音されていて中から外に音が漏れることはないし、外の音は聞こえない。しかもレッスン中の受講者は私語せず黙々とインストラクターの動きを真似るだけ。音量が過剰だとしか思えない。あまりに耳が痛く不快なので音に合わせることができない。爆音のなる中でインストラクターはごく稀に指導らしきことをつぶやいているのだが、爆音にかき消されて全然聞こえない。なぜマイクが用意されていないのか。そもそも爆音である必要はない。そして、インストラクターは音楽を操作する必要があるごとに装置の前まで移動する。なぜ遠隔操作できるようになっていないのか。

立地はよいし、月謝はそれほど高くなかったので、とりあえず一ヶ月行き放題の契約をしてみたが、これでダンスが学べる人間は、別にスクールに頼らなくても学べる気がする。

ところで、私がダンスを学ぶ上で障害がひとつある。私は騒音が苦手なのだ。そして、私にとって大抵の音は騒音として認識される。

理由はよくわからない。医師ではない他人からは聴覚過敏の可能性を指摘されているのだが、正式に診断を受けたことがないのでわからない。それに、自分でも不快だと感じる音が一貫していない。例えば、今この文章を書いている間に外から車の音と雨の音がしているが、これはさほど不快ではない。また、私はこの文章を書くのにCherryMXの青軸を使っていて打鍵のたびにカチカチというクリック音がなるのだが、これも不快ではない。むしろしっかりと打鍵したことが認識できるので快適ですらある。私の妻は家で常に謳っていたり踊っていたりしているのだが、これもさほど不快ではない。あるいはスピーカーから出る音が苦手なのだろうかと考えたこともある。妻がスピーカーから音楽を鳴らしているのは極めて不快だ。しかし私がビデオゲームをしている時は操作に応じて効果音がフィードバックとして流れてほしい。ゲームの効果音は不快ではないし、ゲームが面白い場合、その音楽もたいてい不快ではない。駅のホームのスピーカーで流れているアナウンスもさほど不快ではない。

そもそも音楽を聞くことは好きではない。たまに無性に音楽を聞くこともあるのだが、純粋に音楽を聞くのではなく、その音楽に付随する文脈が面白いから聞いているのだ。例えば気に入ったアニメやゲームの音楽であるとかだ。

興味深いので一度医師の意見を聞きに行ってみたいとはつねづね思っているものの、健康診断の聴力テストで問題になったことはないし、人の声が聞き取りづらいと感じたこともないし、集中して作業する時はそもそも静かな環境を好むのは他人と変わらず、したがって日常生活でさほど不便を感じていないので、なかなか病院に行って医師の意見を求めるほど切実な問題にはなっていない。ストレスや疲労によって音の不快度が変わったりはしないので精神的なものでもないだろうし、特に何か治療できるものだとも思われない。しかし、今回は困った。ただ、単純に音量が大きすぎるだけではあると思うのだが。

ただ、今回レッスンを受けた限りでは、インストラクターはほとんど指導らしい指導を発声しないので、workaroundとして爆音の音楽をリズムが取れる程度の音量にまで軽減するために、耳栓をしても変わりはない気がする。

ところで、肝心の手本であるが、体操は体が硬いために一部の動きができず、筋トレは変則的な体側を起こす片手腕立て伏せ書く10回、各種腹筋合計2桁回、プランク数十秒程度のものであったので問題なくこなすことができ、振り付けは圧倒的なリズム感のなさと耳をつんざくほどの不快な爆音音楽のせいでタイミングがあわず、まるでできなかった。そもそも手本を見ながら数回ゆっくり流しただけであとは反復練習しろというのはダンス未経験者にはつらすぎる。

以上のようなことを知り合いの踊り手に相談したところ、大抵のダンススクールとはそういうところだ。そもそも体ができてなくて動かない人間にいくら力学的なことを教えても意味がない。ダンスなんて自分で学べ。本当に基礎からやりたいならひたすら柔軟とか、1時間クソつまらないな動きを繰り返すことになる。それがやりたいならバレエの基礎をやるべきだ。ただしすでに言ったようにクソつまらないので根気がなければ続かない。ダンスをなめるな。とボロクソに言われた。

結局、Peak: Secrets from the New Science of Expertiseに書いてあったように、先人が効率的な教育方法を確立させている歴史のあるものを学んだほうがよいということか。

2019-04-18

CoinHive裁判の控訴審費用の寄付をした

Coinhive事件裁判費用の寄付のお願い - 一般社団法人日本ハッカー協会

私はCoinHiveは実行しても安全なプログラムであり不正指令電磁的記録にあたるとは考えていないので少額ながら控訴費用の寄付をした。

プログラムは魔法ではない。

2019-04-10

IIJに対してマルウェア対策のDNSブロッキングについての質問の回答

私の使っているISPであるIIJmioひかりはマルウェア対策のDNS検閲を開始すると宣言した。

IIJのセキュリティに関する取り組み | インターネットイニシアティブ(IIJ)

IIJの説明を読むと、IIJの提供するDNSサーバーは、マルウェアが指令や通信をするのに使うことが知られているC&Cサーバーのドメイン名の解決を行わないのだという。彼らはこれをDNSフィルタリングと読んでいるが、私はDNS検閲と呼ぶことにする。あるいは少し前に話題になったDNSブロッキングと呼ぶのもよい。

IIJによると、DNS検閲はデフォルトで有効であり、オプトアウトするためには、IIJが用意したDNS検閲を行わないDNSサーバーを使う必要があるという。

しかし、このDNS検閲の実装方法や、マルウェアの定義が疑問なので、IIJに対して質問することにした。

質問「DNSフィルタリングを行うDNSサーバーは、ユーザーを契約単位あるいは何らかのフィンガープリントで識別し、特定のユーザーに対して個別にDNS問い合わせの結果を変える機能を持っていますか?」

この質問はとても重要だ。もしDNSサーバーがこのような機能を持つ場合、きわめて深刻な悪用ができるからだ。

以下のような回答が得られた。

・弊社のDNSサーバでは特定のお客様のみに異なる結果を返す機能は
 設けておりません。
・今回の弊社DNSフィルタリングの仕組みは、弊社側でDNSフィルタリングを
 適用するDNSサーバと適用しないDNSサーバの両方のDNSサーバを用意し、
 お客様の判断で選択(オプトアウト)を可能としています。
・また、フィルタリングが適用されたDNSサーバにおいては、その通信先が
 レピュテーションデータに該当した場合、IIJが別途用意するサーバの
 IPアドレスに宛先を置き換えることで、本来の宛先へアクセスしないように
 しています。
・尚、オプトアウトの方法については、下記弊社ホームページにてお伝えして
 います。https://www.iij.ad.jp/sec-statement/

そのような機能はないという。ただ、興味深いことに、マルウェアが利用するドメインに対しては、IIJが管理するIPアドレスを返すという。情報収集のためのハニーポットかもしれない。しかしこれはよくよく気をつけないと、ミイラ取りがミイラになりかねない。IIJの用意するハニーポットがパーサーを使って通信を解析している場合、マルウェアのふりをして通信し、そのマルウェアからは想定しないデータを送りつけ、パーサーの実装の不備を着くことが可能になるかも知れない。

次の質問は、マルウェアの定義についてだ。

Winnyのような通信はマルウェアではない。利用者の意図通りの動作をしているからだ。たとえその通信の内容が、著作権侵害、薬物取引、マネーロンダリング、児童ポルノ、違法素数などの違法な内容であったとしても、マルウェアのみの対策と宣伝する以上、マルウェア対策以外のことは行うべきではない。

CoinhiveのJavaScriptコードを提供するドメインと、計算結果を受け取るドメインはどうか。兵庫県警はマルウェアだと主張するかも知れないが、私の意見ではマルウェアではないし、C&Cサーバーでもない。

Tor relay/exitノードや、似たようなプロクシー機能を提供するものについてはどうか。これは私の意見ではマルウェアではないし、C&Cサーバーでもない。

pastebin.comのようなユーザーからの任意のテキストをホストするようなサービスは、マルウェアのC&Cサーバーとして使われうる。しかし、pastebin.comは今の所、マルウェアのC&Cサーバーとして利用されているという情を知った時点で迅速な対応を行っている。マルウェアのC&Cサーバーとして使われうる機能を提供しているのと、意図をもってC&Cサーバーとなっているのは別だ。私はpastebin.comのようなサービスは検閲されるべきではないと考えている。これはどうか。

単なるフィッシングサイトでマルウェアのC&Cサーバーとしては使われていないものはどうだろうか。マルウェア対策のDNS検閲という以上、単なるフィッシングサイトは検閲しないはずだ。

そのような考えから以下の質問を送ったところ、回答が得られた。

・IIJmioひかりがDNSフィルタリングを実施する対象に該当すると判断
    するものをお答えください。
 ・Coinhive風のサービスにおいて!JavaScriptプログラムをホストし
    または計算結果を受け取るサーバー
  ・Winny等のファイル共有プロトコルで通信するサーバー
  ・Tor relay/exitノードまたは似たようなプロクシー機能を提供するサーバー
 ・pastebin.com風のサービスを提供するサーバーで、マルウェアが
  指令の受信や情報の伝達に用いるものであって、
  サービスの管理者はマルウェアによって悪用された場合の対応を迅速
    に行う体制を整えているもの
 ・単なるフィッシングサイトであって、マルウェアとは関わりがないもの
----------------------------------------------------------------------
(ご回答2)
・今回ご指摘いただきました対象に関しては、現在、弊社のフィルタリング
 対象に該当するものはございません。しかしながら、複数の条件が重なる
 などして、悪意あるマルウェアの通信先と判断された場合は、フィルタリン
 グ対象となる場合がございます。
 そのような場合には再度分析を行い、対象の見直しを実施いたしますので、
 正常な通信先がフィルタリングによって遮断されている可能性がある場合は、
 弊社窓口 support@iijmio.jp までお問い合わせください。

この回答をみるかぎり、IIJと私はマルウェアについて互換性のある定義を持ち合わせているようだ。

この結果を考えて、私はIIJのDNS検閲をオプトアウトするかどうかを考えなければならない。オプトアウトは簡単だ。IIJが別途用意した自称DNSフィルタリングを行わないと主張しているDNSサーバーを使うようにすればよい。これはルーターにDNSサーバーのIPアドレスを手動で設定するだけでいい。これができないような人間はDNS検閲されていたほうがインターネット全体のためにも安全だ。

ただし問題は、オプトアウトをする人間は圧倒的少数であろうということだ。インターネットにおけるプライバシーを考えるにあたって、少数派はその分余計なフィンガープリントを抱えることになり、目立つのだ。ましてや、国家の諜報機関は、意図的にDNS検閲のオプトアウトをした人間を怪しいとみなし、重点的に秘密裏に通信内容を傍受して捜査するかも知れない。私が国家の諜報機関(緊急避難と称して捜査令状も取らずに秘密裏に違法に捜査する機関を想定している)ならばそうする。

今のところ私はマルウェアを研究しているわけではないので、IIJが回答どおりの運用をするのであれば、今のところはオプトアウトをしなくてもいいかも知れない。悩ましい問題だ。あらゆる検閲は悪であるので当然オプトアウトすべきだが、オプトアウトすると目立って通信を傍受される可能性が高まるので、気軽にオプトアウトすることもできない。

2019-04-08

引越し祝い江添ボドゲ会@4月14日

引越しが完了したので4月14日に自宅ボドゲ会をします。

江添引越し祝ボドゲ会@4月14日 - connpass

同じ住所を複数の建物が共有しているので、正確な住所は経度緯度を指定した以下のGoogle Mapsで確認してください。

https://goo.gl/maps/cRYmRtqo7gR2

前の家と70メートルしか離れていません。前の住所に来たことがある人は、コンビニを通り過ぎ、弁当屋の前の角で曲がり、2軒め。道路に面しているドアは裏口で、玄関は左脇を入って裏。

気が付かず技術書展とかぶってしまった。

2019-04-06

スノーボード12回目

3月31日の日曜日に、11回目となるスノーボードに行ってきた。今回はかぐらスキー場に行くことにした。なんでも、かぐらスキー場は雪質がよいらしい。ただし、事前に得た情報によると、バスが混み、雪質も上の方まで行かないとよくないらしい。

かぐらに行くには、越後湯沢駅からバスに20分乗る。越後湯沢駅周辺のスキー場の多くが無料シャトルバスを出している中、かぐら行きのバスは有料だ。しかも荷物があると100円増しの片道480円かかる。往復だけで千円ほどかかる。ただし、更衣室のロッカーは500円だった。ガーラ湯沢のロッカーが千円であることを考えると、500円の差だ。また、私は利用しないが板とウェアを一式レンタルする場合、かぐらの方が安い。

かぐらスキー場のふもと、みつまたステーションの更衣室は狭かった。こんなに狭くて混み合ったりしないのかと思ったが、案外混んでいない。どうやらかぐらに行く客層は車で来るか、地元民か、周辺の宿の客であることが多いようだ。

みつまたステーションからゴンドラでゲレンデのふもとまで上がる。このゴンドラ、とても大きな多人数乗りのゴンドラであった。さながら満員電車のようにゴンドラにすし詰めになって乗車する。

さて、かぐらについたので今回は普通に滑ろうかと思ったが、ふとスノーボードスクールの看板が目についた。なんとかぐらのスノーボードスクールでは、コブレッスンなるコースがあるそうだ。これは興味深い。すでにきれいに圧雪された斜面ならば楽しく速度を出して滑り降りることができる腕前になっているが、圧雪されていないコースではとたんに何もできなくなってしまう。コブの滑り方の動画を何本も見たものの、いまいちよくわからない。わざわざコブレッスンという枠を設けるからには、ここのインストラクターはコブの滑り方を教えるのにもなれているに違いない。

しかし、スクールを受けるとそれだけで今日1日が終わってしまうだろう。圧雪面ならばほぼ直滑走に近い滑り方で楽しく滑ることができるようになった今、そしてもしかしたら今回が今シーズン最後のスノーボードになるかもしれない状況で、8千円も払って1日スクールを受けるべきだろうか。

少し悩んだが、スクールを1日受けることにした。結論から先に書くと、これは正解だった。

スクールで、コブレッスンの受講者は私一人だったために、実質プライベートレッスンになった。まずこれがとてもよかった。

その時の私のスノーボードは、カービングターンを練習するためにスタンス角が前30度後18度という極端な設定になっていた。インストラクターの助言に従って、スタンス角を前18度後0度に変えた。

まず、圧雪された斜面で、非圧雪面で安定してターンする方法を学んだ。ターンについて今までは、姿勢を前にするために目線は進行方向を見るとか、ロテーションを使うとか、角付けをするといったことを学んでいた。ところが、今回マンダ非圧雪面で安定してターンする方法は完全に真逆であった。目線は常に谷側に向ける、角付けをせずにフラットに乗る。ということを教わった。

非圧雪コブ斜面にはすばやいショートターンが必要で、そうなるともう目線を悠長に左右に動かしているヒマはない。進行方向というのは常に谷側だ。

ターンのときに角付けをすると、カービングターンになってしまう。スライドはさせてもカービングターンとして速度が出てしまう。まずはできるだけ速度を落としてゆっくりと確実に滑り降りたいのに、速度が出てしまっては問題だ。まだエッジで起伏に乗り上げると不安定になる。そこで角付けを抑えてエッジではなく面で乗ることによって起伏のある非圧雪面でも安定させる。ターンの際に角付けを抑えるには、リーンアウト(アンギュレーション)を強く意識する。ターンするときには体はターンの内側にリーンするのだが、この時体をリーンの逆側に起こすことにより、体を安定させる。アンギュレーションをさらに強く入れることにより板をフラットに接地させる。

圧雪面で説明を受けながら滑っている時は全然実感が沸かなかったが、実際に非圧雪面に入ると、明らかにターンの安定が違う。まだ連続ターンまでは行かないものの、単体のターンをして転ばずに立っていられるようになった。今まではターンをしようとノーズドロップし、あまりに速度が出すぎるために無理やりブレーキをかけ、その勢いで転んでしまっていたのだ。それが確実にターンして転ばずに止まることができるようになった。

その後、コブレッスンというのに圧雪面や単に柔らかい雪が積もっているだけの面だけでは退屈だろうということで、インストラクターはしっかりとしたコブが形成されている斜面に向かった。コブの山から山にサイドスリップで移動する訓練をした。途中まではうまく進めたのだが、一度失敗すると立て直しが困難だった。かぐらはコブの練習にとても良いことに、広いコースに圧雪面と非圧雪面が並走していて、横に移動するだけでコブから脱出できる。立て直しができないので脱出して休憩している横を、常連のスノーボーダーがコブの谷をターンしながら滑り降りていった。

他にも、盛り上がった壁や小山に乗り上げて頂上でターンして戻ってくる滑り方を学んだ。これはすでによそのスキー場で、慣れたスノーボーダーがやっているのを何度も見ているが、とても私にはできそうではないと挑戦すらしていなかった滑り方だ。ただ、実際にやってみると案外あっさりと成功させることができた。以前はできるわけがないと思っていたスピンもできるようになっていたりするので、知らず知らずのうちに上達していたらしい。

ゴンドラに載っている間、インストラクターが私の仕事について聞いてきたので、逆にスノーボードのインストラクターは夏の間は何をして生計を立てているのかと聞いてみた。これは様々で、飲食店で働いているものもいれば、スノーボードショップで働いているものもいるし、運送業や土方をしているものもいるという。

私を担当したインストラクターはだいぶ極端な趣味に生きる人間のようで、夏の間はひたすら金をため、シーズンの間は仕事をやめて毎日のように滑るのだという。実はインストラクターは生計を立てるための仕事ではなく、たまたま滑ってお金ももらえる補助的な仕事にすぎないのだという。

実際、かぐらではレッスンを受けるような人はなかなか来ないという。

結論として、かぐらはコブの練習にはよいスキー場であった。コブの練習をしたいときにまた来ようと思う。

2019-04-01

npm社、社員を無責任に解雇

https://twitter.com/fharper/status/1111694552262459393

npm社が人を解雇したそうだが、そのやり方があまりにも無責任すぎる。

NPM社に雇われていたFrédéric HarperはNPM社をクビになったが、その際、2週間分の給料を支払う代わりに、解雇された事自体をNDAする契約を迫られたとのこと。しかも解雇の事実とNDAの契約を伝えたのは社外の請負で、NPM社員は一切顔を出さなかったとのこと。彼の直接の上司は彼が解雇されることを知らなかったとのこと。そして今の今までNPM社の管理職からこの件について一切の連絡がないそうだ。

彼は今まで3度、経営の悪化により会社を解雇されてきたが、いずれの会社でも管理職は人間的で、経営状態によりやむをえずして解雇することを告げてきたので、解雇には慣れているが、今回の解雇はあまりにも非人間的であったそうだ。

2019-03-28

スノーボード10回目と11回目

またスノーボードに行ってきた。先週の日曜日にガーラ湯沢、翌週の今日、土曜日に舞子スノーリゾートに行った。

10回目はカービングターンを学びにガーラ湯沢のスクールに行った。

カービングターンは今まで学んできたことの逆をやらなければならない。スライドターンでは積極的にロテーションを使う。カービングターンではロテーションを抑える。スライドターンでは逆エッジしないように注意する。カービングターンでは積極的に逆エッジしにいく。

ロテーションを強く入れてしまうと、ボードはスライドしてしまう。なのでロテーションは抑えなければならない。カービングターンでのエッジの切り替えタイミングは谷周りに入る斜面に対して横に滑っている最中だ。エッジを切り替えてリーンしてバランスを保つ。

午前中のレッスンでは、エッジを立ててエッジだけで曲がることを実感した。もう立派なカービングターンだ。しかし、午後のレッスンではエッジで曲がることができなくなってしまった。これはどうも、レッスンの間の昼に滑り過ぎて筋肉が疲労しているのと、午後になって雪質が変わり、午前と感覚が違うことによるものらしい。また疲れてきて目線が谷側を向いてしまい、それに引きづられて体も谷側を向いてしまうのも問題のようだ。

結局この日はカービングターンを習得できなかった。カービングターンの感覚と、カービングターンに必要な動作や訓練方法は一通り学んだので、あとは練習だ。

この日はレッスンの後もまだ滑っていなかった奥の方にある中級者コースを連続して滑った後、下山コースも滑ったので、すっかり右足が筋肉痛になってしまった。この筋肉痛はなかなか取れなかった。しかし、ヒザの痛みはない。

右足の筋肉痛の回復には実に5日間かかった。もうシーズン終わりまで日がないので、土曜日に滑りに行くことにした。こんどは舞子スノーリゾートに行くことにした。一ヶ月半の成果で、かなり滑ることができるようになっているはずなので、今回はレッスンを入れずに気楽に滑ることにした。

舞子スノーリゾートは越後湯沢駅から無料のシャトルバスで20分のところにある。もうシーズンも終わりかけだということを考慮しても人が少ない。これでも土曜日なのだ。周りを見ると、どうやら一人で来ている者はほとんどいないようだ。だいたい家族連れや仲間と来ている。

舞子スノーリゾートはふもとにある日帰りセンターで着替え、ゴンドラで頂上まで上がるスキー場だった。頂上にある短いコースを往復するか、あるいは長いコースを滑ってふもとまで降りてまた登るかの二択のようだ。

どうもレッスン無しですべっていると、きれいにロングターンをする気にはならない。ほとんど直滑走のように滑ってしまう。ただでさえ人が少ないのに、中級者コースは特に人が少ないので、遠慮なく速度を出すことができる。どうやら、直滑走に少しだけ左右にリーンして交互にエッジをたてていくことで、安定して高速でほぼまっすぐ滑り降りることができるようだ。湯沢中里スノーリゾートでも似たようなことをしたが、リーンをいれると特に安定するようだ。

カービングロングターンも練習してみたが、どうにもスライドが混じってしまうように思われる。

未だに滑ることができないのが非圧雪コースだ。圧雪した雪面は安定して楽しく滑ることができるようになったが、非圧雪には歯が立たない。傾斜があるのでノーズドロップをするだけで速度が出る上、すぐにコブに乗り上げて不安定になる。ターンをしようとしても、コブを横切る形になるので不安定で続かない。なんとかゆっくりとサイドスリップで下ることができる姿勢を発見することができたが、これは全然楽しくない。果たして次のシーズンは非圧雪の上級者コースを滑走できるようになるのだろうか。

いろいろと調べると、スノーボードで非圧雪コブ斜面を滑るのは、スキーとはやり方がだいぶ異なるようだ。

コブ斜面はあのように形成してあるのではない。滑った雪は圧雪されて固くなり、へこんで谷を形成する。後に続く者も先達の滑った後をたどると、さらに谷が圧雪されてコブが形成される。

問題は、スキーとスノーボードでは形成されるコブが異なる。スキー場に発生したコブのほとんどはスキーによって作られている。スキー板は細いので、スキーによって作られたコブの谷をスノーボードで辿ろうとすると、そもそも谷が狭すぎて入らないことまである。

そのため、スノーボードは太さと安定性を活かして、コブの谷ではなく山を滑る。起伏の激しい斜面を滑ると不安定になる。起伏に乗り上げた衝撃を脚で吸収するために、常にヒザを曲げてやや低い姿勢で滑るようにする。フラットに滑ると不安定になるので、エッジを切り替えるタイミングをすばやくし、フラットの時間を短縮する。またロテーションやカウンターロテーションを強く入れると不安定になるので、ボードの上に安定して乗る姿勢を維持する。起伏に乗り上げる時はオーリーのようにノーズを上げて、次にテールを上げる

いくつかのスキー場の行ったので、感想をまとめてみる。

ガーラ湯沢
東京から日帰りするのに余計なオーバーヘッドが一切ない。駅直結ですべての用意が揃い、同じ建物内からゴンドラに乗ってゲレンデまで上がるので歩きにくいスキーブーツでも歩く必要がない。スキー場としては小さい上に、行きやすくて人気なのでとても混んでいる。標高が高いので雪質もよい。
白馬八方尾根スキー場
圧倒的に広い。コースはスキー向けの作りになっている。全体的に難しい。ただし広いのでスノーボードで滑って楽しいコースもある。長野駅からバスで70分かかるので交通事情が辛い。
湯沢中里スノーリゾート
越後湯沢駅からバスで10分ほど。スキー場はふもとから始まっているため雪質が悪い。というか単純に雪が汚い。横に広い雪面が3枚ほどある。安さとスノーボードと相性のよい広いほどほどに傾斜のついた雪面のせいか、スノーボード初心者が圧倒的に多かった。スキーはほとんど見なかった。ほとんど初心者と、友人の初心者を教える経験者ぐらいしかいないので、中級者コースは誰もいないほど空いていた。
舞子スノーリゾート
ゴンドラに乗って上に行けば標高が高く雪質はよい。広い。私が行った時は休日だがそれほど混んでいなかった。頂上で短く傾斜の強いコースを繰り返し滑るか、頂上に行ってふもとまで下山するコースを繰り返すかの二択になる。
軽井沢プリンスホテルスキー場

東京から67分で行ける軽井沢駅を降りてすぐの場所にある。ただ、駅前にあり見えているとはいえ、広いのでスキー場まで駅から5分10分ほど歩くかバスに乗って移動しなければならない。また滑るまでの工程が面倒だ。まずリフト券の建物を探してリフト券を買い、レンタルの建物を探してレンタルし、レンタルショップで着替え、そのままコンクリートの道を歩いてクロークに荷物を預けに行かなければならない。ソフトブーツのスノーボードならばともかく、スキーブーツで歩いて移動させられるのは辛い。

スキー場は中級者程度だ。上級者が満足できるコースはあまりない。ただし、軽井沢なので圧倒的に贅沢で楽しい作りになっている。例えばショッピングモールや飲食店街がずらりと並んでいるし、スキー場の真横に宿泊用のコテージが立ち並んでいて、ドアを開けるとすぐ目の前がゲレンデになっている。滑っている途中にコテージに戻って休むことまでできる。そういう意味では初心者グループで2泊3日するスキー旅行にはよいだろう。

軽井沢プリンスホテルスキー場には去年、ボーゲンしかできないスキーでなかなかうまく滑れず雪辱を味わったという苦い経験があるので、今シーズンの最後にリベンジしたいとは思っているのだが、今の自分のスノーボードの腕前と去年の記憶を考えると、ほとんどの軽井沢のコースは滑れるはずで、他に雪質がマシなスキー場がいくらでもあるのに、わざわざ一人で日帰りしたいとは思わない。

つぎはどこに行くべきだろうか。4月に入ってからもガーラ湯沢とかぐらは営業しているようだ。雪の状況が良ければGWまでもつとのことだが、果たしていつまで持つだろうか。

Cisco、ルーターの脆弱性を修正するためにユーザーエージェントcurlを弾く変更を加える

Cisco、ルーターの脆弱性を修正するためにユーザーエージェントcurlを弾く変更を加える。

Cisco Fixes RV320/RV325 Vulnerability by Banning “curl” in User-Agent | Hacker News

https://twitter.com/RedTeamPT/status/1110843396657238016

もちろん我々は--user-agentなどというcurlのオプションなど使うわけがないし、RFC3514に従って悪意あるパケットには邪悪ビットを立てているはずだ。

2019-03-25

兵庫県警のブラクラ摘発事件の冤罪被害者に寄付をした #alertloop

兵庫県警がブラクラと称してブラウザーがクラッシュしない、実害のない、単なる"while(true) alert("");"に過ぎないJavaScriptが使われたページへのURLを書き込んだ無実の者を補導ないし家宅捜索した件についての弁護士費用のため、近頃些少には候へども、以下から寄付をした。

アラートループ家宅捜索(いわゆる「兵庫県警ブラクラ摘発」)事件に関する寄付の呼びかけ - 一般社団法人日本ハッカー協会

なぜ寄付をしたのか。

ひとつ、この事件には実害が一切なく、したがって補導と家宅捜索を受けた者は無実である。

ひとつ、私は以下のURLに示すようにC++の入門書を執筆しており、その中ではもちろん無限ループも説明している。JavaScriptの無限ループalertのような無実なものが違法であると誤った解釈がなされた場合、私は参考書を出版できなくなる。

https://github.com/EzoeRyou/cpp-intro

なぜ寄付をしたことを公にするのか。この問題を宣伝し知名度を上げるためだ。

魔法と科学の区別がつかない兵庫県警によって法の誤った解釈をさせた結果の暴走を許してはならない。

“兵庫県警ブラクラ摘発”、弁護士費用の寄付呼び掛け 日本ハッカー協会 - ITmedia NEWS

2019-03-20

職質裁判で不当判決が出たので控訴する

職質裁判の一審判決があまりにも不当すぎる。判決文はGitHubで公開している。

https://github.com/EzoeRyou/calling-110-is-suspicious

判決文では、東京都(警察)側の多くの虚偽の主張は認定されなかった。以下は認定されなかった東京都(警察)による虚偽の主張である。

江添はパトカーとすれ違った際、顔をふせ足早に走り去った
すれ違った場所の近くにある自動販売機で飲み物を買っていることからありえない
江添は手を小刻みに動かす所作をなした
裁判所の判断では言及されず
江添は吉野家の看板をひっくり返した
裁判所の判断では言及されず
  • 江添は自らの意思で駐車場に向かった
  • 江添は走った

    特に最後の項目はとても興味深い。私は走ったところ警察官らに取り押さえられて駐車場に押し込められたわけで、裁判所は走ったのは怪しいとしている。しかしなぜか東京都(警察)の主張では、私は走っておらず自分の意志で駐車場に向かったとしている。東京都(警察)がなぜこんな嘘をついたのかというと、私が自分の意志で駐車場にとどまっていたということを主張するためらしい。私が走ったことにより、私の意思に反することが行われていたという証拠になってしまうので、嘘をついてまでも私が自分の意志で駐車場に向かったとでっち上げたかったのだ。裁判所は私の主張を採用し、走ったのは怪しいとしているが、もし走ったのが事実であるとするならば、証人尋問の場ですら私は自分の意志で駐車場に向かったと証言した警察官の井上は偽証ではないのか。井上は証人尋問において、上記の裁判所が認定しなかったことをすべて証言している。

    東京都(警察)の主張は、自身を有利にしようと嘘をつき、その嘘をごまかすためにさらに嘘を塗り重ねて、本当におかしなことになっている。

    さて、問題は裁判所だ。すでに書いたように裁判所は以下のように判断した。

    最初の10分間は職務質問の要件を欠く。しかし私は外見から目的がわからず、刃物等の危険物等が十分入るリュックを持っていたため、警察官は声をかける必要性があった。したがって最初の10分間は適切であった。

    その後、私は吉野家に入ろうとした。これは吉野家に立てこもることが予想できる。また110番通報を要請した。これは不審事由である。

    残りの1時間20分について、不審事由が存在するので適切であった。

    リュックの上から触ることによる所持品検査は私が同意しているので適切であった。所持品検査に至るまで1時間30分、所持品検査をするまで解放しないと言い、進行方向に立って取り押さえるなどの有形力の行使があったが適切であった。

    不当判決にも程がある。

    職務質問の要件を欠くのであればそれは職務質問ではない。そもそも質問はなかったのだ。いきなり所持品検査を要求しているのだから、職務質問は行われなかった。

    最初の10分間で、私は通勤中であることを告げたし、公的機関の発行する身分証も示したので目的は分かっている。刃物の入らない奇妙なリュックというものは私の知る限り存在しない。刃物が入っているという証拠もなしに、刃物を十分入れることができるなどという曖昧な理由だけで所持品検査をしていいはずがない。

    裁判所も認定するように職務質問の要件を欠いていた。そもそも所持品検査を要求するだけで職務質問は行われていなかった。目の前の警察官が法に違反しているとしたら110番通報するのは当然で、かつ110番通報は容易に改変不可能な方法で記録されるので、このとき110番通報をしてこの後のやり取りをすべて録音していれば、東京都(警察)の虚偽の主張を許すこともなかった。警察官らはなぜか110番通報を妨害した。

    110番通報の要請が不審事由に当たるなどということは被告である東京都(警察)も主張していない。原告被告双方ともに主張していない争点を勝手に設定して勝手に判断するのは裁判の手続き上問題がある。

    なぜか控訴は東京都(警察)に対する反論よりも、裁判所の判断に対する反論が多く含まれそうだ。

    2019-03-15

    J-CASTニュースの職質裁判の誤りを含む記事に対する反論

    私の裁判の一審判決を受けて、J-CASTニュースが以下のような誤りを含む記事を出している。

    職務質問で精神的苦痛 地裁判決「適法」、原告「不当だ」→法律家の見解は : J-CASTニュース

    この記事は適切な取材をしていない。判決文をまともに読んだとは思えない。原告である私への取材はない。この記事はとても現地を取材したとは思えない記述がある。弁護士の意見にもとんでもないものがある。

    この記事はニュース配信サービスによって様々なニュースサイトに配信され、かつ弁護士による意見も掲載しており、影響力が高いと判断したので、この記事について反論する。

    この記事は被告である東京都(警察)が主張しているが、裁判所は認定しなかったことを、あたかも事実であるかのように書いている。

    警察官は、パトカーで巡回していて、後部に日よけの付いたつば広の帽子を目深にかぶり、大きめの黒いリュックを背負った江添さんが、パトカーを見ると顔を伏せて足早に通り過ぎたことを不審に思い、職務質問のためパトカーを下りて追跡していた。

    このうち、「パトカーを見ると顔を伏せて足早に通り過ぎた」ということは東京都が主張しているが、裁判では認定されなかった。その理由は、車道と歩道の間に植木があり車道を走る車の中からは見通しが悪かったこと、私はその直後に自動販売機で飲み物を買っているが、足早に通り過ぎたのであれば不自然であること、による。

    裁判所は警察官らがパトカーで私とすれ違ったことは認定しているが、私はそもそもパトカーを見ていない。東京都の主張ではパトカーと私がすれちがったとき、警察官は私をしばらく見ていたとのことだが、ただでさえ植え込みがあって見通しが悪いのに、走行中の車と逆方向に歩く私がすれ違う間など一瞬であり、いったいこの「しばらく」とはどういう意味なのか疑問だ。東京都の主張によれば私とすれ違った地点から30メートル先にパトカーを停めて私を追いかけたとのことだが、これにも私は気がついていない。私はパトカーですれ違ったということすら疑問を持っている。

    またこの記事は、「すぐ横の駐車場」と書いている。この駐車場は路地に入った先にある。現地を取材しているならば「すぐ横」などという表現が出てくるはずがない。このことからこの記事は現地を取材していない疑いがある。J-CASTニュースの所在地である現千代田区二番から職務質問が行われた現場の築地6丁目まで直線距離4kmしか離れていないのだが、そんなに近くの現地に取材に行くことすらしなかったというのだろうか。

    弁護士の意見について反論する。

    「危険物がないならリュックの中身を見せればよい、訴訟まで起こすのは得策でない、というのは間違いないでしょう。しかし、こうした社会常識とプライバシーの問題は別です。それだけ世の中に訴えたい、問題提起したいものが江添さんにはあったんだろうと思います。自ら決めたことに対して、社会常識を持ち出すのはどうなのかということです」

    そもそも私には職務質問をすべき不審事由がなかった上に、職務質問というのは質問をすることができるのであって所持品の捜索ができるものではない。判例上、質問に付随する所持品検査ができるとされているだけだ。

    裁判所は最初の10分間について、そもそも職務質問の要件を欠くと認定している。理由は、「パトカーで私とすれ違った際に私が顔を伏せてパトカーから逃げるように足早に走り去った」という東京都の主張が、歩道と車道の間の植え込みによる見通しの悪さと、私がその直後に東京都が主張するすれ違ったとされる場所から10メートルしか離れていない場所にある自動販売機でのんびりと飲み物を買っていたという状況から考えて、ありえないと判断したためだ。

    ただし、ここから今回の判決を私が不当だと考える部分になるのだが、裁判所は最初の10分間の職務質問は要件を欠くが問題ないとした。裁判所は、私は外見から目的がわからず、かつリュックは刃物等の危険物等が十分に入る大きさであったから質問する必要があったと認定している。

    もう一度上の文を読んでほしい。町中を歩く人間の目的が外見からわかるだろうか。刃物が入らないリュックなど存在するだろうか。これだけの理由を持って所持品検査を行ってよいのだろうか。この論法では、職務質問の要件を欠く人間など存在しなくなる。この論法を使えば、家に住んでいる目的がわからず、家は危険物が十分入る大きさであるので、「家宅検査」を行ってよいとまで言えてしまう。

    プライバシー権は存在する。そもそも住居や荷物の中身は令状がなければ捜索してはならない。「所持品検査」とは捜索まではいかない軽いものを指し、「捜索」とは異なると判例で支持されている。そしてこのことについて、警察が金科玉条のように引用する松江相銀米子支店強奪事件の判例がある。持ち主の許諾を得ないまま所持品検査をしたことが違法ではないとされた判例だ。これは状況が付近で銀行強盗が起きており、犯人の人相に似た人物を職務質問し、荷物の中身を許諾を得ないまま見たところ、札束が入っていた犯人だと分かったという事件だ。今回の例とは状況が異なる。今回は付近で事件はなく、犯罪予告もなく、至って平時であり、かつ私は指名手配中の被疑者に人相が似ているわけではないということを当日私は警察官に確認している。

    最初の10分は職務質問の要件を欠くが、誰にでも当てはまる曖昧な理由から問題ないとされた。この最初の10分で私は身分証明証を警察官に提示し、自らの身分を明らかにまでしている。その後、警察が職務質問の要件を欠くにもかかわらず、私に全く同じ質問を繰り返し、同じ答えを返すとさっきと同じ答えですねとまるで答えが変わることを期待しているようにいい、警察官職務執行法に記述がない、リュックの中身を見せるよう迫り、一歩でも動こうとすると二人がかりで抱きとめられたのだ。私は目の前の警察官が法律を遵守していないと判断した。違法が行われたときに自力救済はできないので、私は110番通報した。かつ、私は110番通報の内容は録音され、その録音は現場の警察官の裁量程度では容易に改変できないことを知っていたのだ。だから私は110番通報を要請したのだが、現場の警察官らは私の110番通報の要請を妨害した。

    職務質問の要件を欠くにもかかわらず、身分を明らかに下にもかかわらず、同一内容の質問を繰り返し、執拗に理由もないのにリュックの中身を見せろ、見せるまで解放しない。このような目の前の警察官が法律の遵守しないことが明らかな状況で行おうとした近くの飲食店のドアを開けて店員に110番通報の要請をしたことについて、裁判所は不審事由に当たると認定した。そしてその後の1時間20分の職務質問は不審事由があるので合法であるとした。その後私は、大勢の警察官に路地裏に引きずり込まれて囲まれた状況に1時間以上置かれたのだ。

    世の中に訴えるとか問題提起以前の問題だ。私の人権が実際に侵害されたのだ。

    J-CASTニュースは記事を書く前に判決文を読み、当事者へ取材し、わずか直線距離4kmしか離れていない現地を取材し、プライバシー権について正しく理解している弁護士に意見を求めよ。そして速やかに訂正記事を出せ。

    2019-03-13

    職質裁判一審で不当判決、曰く、110番通報を要請することは不審事由にあたる

    警察官に職務質問をされた話が2017年の7月、これが違法な職務質問であると考えたので国賠訴訟をし、一審判決が今日言い渡された。

    曰く、「原告の請求を棄却する」。負けたわけだ。ではなぜ負けたのか。判決の言い渡しでは主文しか読み上げられないので、判決文を取りに行く。

    当日は、東京都(警察)の主張によれば、パトカーで私とすれ違った際、私を視認し、しばらくみていたところ、私はパトカーを見るなり顔を伏せて足早に通り過ぎたということだ。裁判所は東京都(警察)のこの主張を採用しなかった。というのも、車道と歩道の間には植え込みが多くあり、私をしばらく見るなど不可能であるからだ。したがって今回の職務質問は適切な不審事由なしで始まっていることが認められた。

    その後10分間ほど、私を路上にとどめて職務質問が行われた。裁判所はこれを適切であると判断した。不審事由がなく始まった職務質問ではあるが適切だそうだ。

    その後、私は吉野家の店舗に入ろうとしたが警察官らに抱きとめられたので、入り口から吉野家の店員に対して110番通報するよう要請した。裁判所は吉野家に入ろうとしたのは立てこもる恐れが認められ、かつ110番通報の要請は不審事由であるとし、その後に続く職務質問には不審事由が存在すると判断した。

    そんなバカな。110番通報の要請が不審事由にあたるはずがない。110番通報の要請をしたのは、目の前の警察官風の服装をした男たちが警察官職務執行法に規定された適切な職務質問をしていないから、警察ではないか、あるいは警察であるとしても法に基づかない違法な職務質問をしていると判断し、かつその時私は110番通報の内容は録音され確実に記録に残ると知っていたので、記録に残すことを意図していたからだ。110番通報の要請が不審事由にあたるとは一体どういうことだ。

    そもそも、110番通報の要請が不審事由にあたるということは原告被告ともに争点にしていない。双方とも争点にしてないことを裁判所が勝手に持ち出して争点にして判断を下したというのか。

    110版通報の要請が不審事由であるなどと、被告である東京都(警察)は主張していない。そもそも東京都(警察)が110番通報の要請をしたことをもって不審事由であると主張するのは立場上とてもおかしなことになるのではないか。

    この一審判決は不当だ。

    追記

    判決文の写しが手元に届いたのでさらに詳しく読んだところ、更にひどい理解しかねる判断がある。

    最初の10分間ほどは職務質問の要件を欠くことが認定されたが、最初の10分間の職務質問は適切であった。その理由としては、私は午後2時に月島方向から築地方向に刃物等の危険物等を十分入れることができる大きさのリュックを背負って移動していた。外見から私の目的がわからず、またリュックに危険物等が十分入る大きさであったため、警察官らは私に声をかける必要性があったそうだ。

    往来を歩く大抵の人間の目的は外見から判断できるはずがない。また刃物等の危険物等を入れるのに十分な大きさの外見から中身のわからないリュックを持っているだけで危険物を持っている疑いを書ける必要があるはずがない。

    追記2

    GitHub上で判決文を公開した。

    https://github.com/EzoeRyou/calling-110-is-suspicious/blob/master/20190313_hanketu.pdf

    2019-03-11

    スノーボード9回目

    会社の同僚で、シーズンに10回は滑りに行く人が、今シーズンはまだ1回しか滑っていないという。中級者コースが滑れるぐらい上達したと話したところ、では滑りに行こうということで日曜日に滑りに行った。日帰りガーラ湯沢だ。

    午前中はのんびりと滑ったが、前回に引き続きワックスのおかげでとても滑りやすい。上級者コースの非圧雪コブコースはやはりまだ無理だった。

    午後になり、同僚は別れて中級者コースを繰り返し滑ることになった。私は一人で滑っても上達は見込めなさそうなので、午後からレッスンを受けることにした。ガーラ湯沢の上級レッスンはどんな斜面でも連続ターンができることだが、上級者コースでなくてもいいという話だったので、私はもう上級レッスンが受けられるはずだ。

    レッスンを受ける場所に行って、何を学びたいか話しあった。インストラクターからはショートターンを進められたが、私はカービングターンがどういうものなのか体験してみたかったので触りとしてもカービングターンを学ぶことにした。するとスタンス角を大胆に変更したほうがよいとのことで、前30度後9度に設定した 。そしてバインディングの取り付け位置も若干ヒール側によっていると指摘を受けたので、トゥ側にわずかにずらした。

    上級レッスンには私以外に2人の受講者がいた。どちらもOGASAKAの板を使っていた。インストラクターと受講者のうちの一人はAlpineを使っていた。Alpineの実物を見たのは初めてだ。

    レッスン専用のコースに行く途中、直滑降だけで進む練習をした。これは大変に難しく、途中で転倒してしまった。さいわい雪が湿っぽくてかたくなかったのと、プロテクターのおかげで、問題はなかった。

    カービングターンは大きくエッジを立ててターンする。その際、ローテーションは使わない。ローテーションを使ってしまうとスライドターンになってしまう。前回、ローテーションを使うことでスライドターンが大幅に改善したというのに、今度はローテーションを使うなというのか。

    とりあえずターンしてみたが、カービングターンになっているのかどうかが自分でもよくわからない。それでもレッスンの終わりには、ややカービングらしいターンができるようになってきた。しかし安定しない。

    その日は夕方から強風の予報ということで15:30にはリフトが止まることになったので、下山コースを下って帰ってきた。人がたくさんいるために速度が出せず、足がかなり疲労した。しかし、ヒザは痛くなっていない。上達したのだろうか。

    スノーボード8回目

    どうも今年は雪がよろしくないらしく、旅行会社も4月以降のスキー旅行を用意していない。旅行会社を使わないスキー旅行は割高だし手間がかかるしといろいろとやりたくないので、今シーズンは3月末までと考えて週2回ぐらいは滑りにいく決意をした。

    さて、旅行会社で4人分の2泊3日のスキー旅行を手配したところ、湯沢中里スノーリゾートのリフト券をもらった。これが荒れば後は越後湯沢までの往復新幹線台だけで滑ることができる。普段はガーラ湯沢に行っているが、たまには別のスキー場に行くのもよさそうだ。さっそく旅行会社で少し割安な9700円で日帰り越後湯沢フリーというプランを申し込んだ。東京-越後湯沢間の往復新幹線だけの旅行プランだ。

    前回、板のデッキ面の側面が側面に沿って長さ数cm、幅数mmほど剥げてしまった。中からグラスファイバーらしい白い材質が見える。幸い、剥げたのは一番上のカバーだけで、ウッドコアを守る内部のカバーは無事のようだ。いろいろと考えた結果、防水用のエポキシパテで埋めることにした。

    また、ホットワックスのための道具一式を揃えたので、今回の板はホットワックスがしてある。とりあえずベースワックスを3回、滑走ワックスを1回した。果たして効果があるだろうか。

    湯沢中里への移動は面倒だ。越後湯沢駅まで行った後に、無料シャトルバスか上越線で湯沢中里駅まで向かうのだが、これがどちらも使い勝手が悪い。シャトルバスはおよそ30分に一本、電車は8時に一本、12時に一本、15時に一本、17時に一本といったぐあいに、かなり本数が限られる。シャトルバスは面倒そうなので、200円を払ってでも電車で行くことにした。スキー場とは駅で直結しているらしいので、楽だろうと考えたのだ。

    無事に起床に成功し、東京駅に向かった。自由席に乗っていこうとしたが、6時36分発と44分発の新幹線がある。普通は早い方の新幹線に乗るはずだが、なぜか妙に気になったので駅員にどちらが早く着くのか聞いてみた。すると、44分の方が途中で追い抜くので越後湯沢駅には先に着くのだという。なんと、知らなかった。

    越後湯沢駅について上越線に乗り換える。ホームに止まっている電車には、なんと外からドアを開閉するボタンがついている。2駅のって湯沢中里駅に到着した。降りて改札に向うが自動改札はない。駅員もいない。切符を箱の中に入れて出る。

    そのまま建物の1階に降りて更衣室で着替え、チケット売り場にチケットを引き換えに行く。しかし時間がかかる。わずかに4,5人しか並んでいないのにやたらに時間がかかる。20分以上は待たされてようやくチケットを手にすることができた。どう考えても手際が悪すぎる。

    さっそく一番近くにある第2リフトに乗って上がった。このリフト、なんとセーフティバーに板を乗せる棒がついていた。これは楽だ。

    まず一本を滑ったが、ワックスのためか明らかに滑りが違う。摩擦が段違いになくなっている。緩斜面でありながらも素晴らしい速度で滑り降りてしまった。その後、何本か滑ったが、どうやら上級者コースのほとんどは雪が足りないために閉鎖されている様子だ。かろうじて残された上級者コースは、どこからどこまでが設定されたコースなのかよくわからない場所にあった。単にそこだけ木々がなく、非圧雪で傾斜がありすべりおりることができるだけだ。挑んでみたが、全然滑れない上に、雪質が悪すぎて滑っていて面白くない。そこで少し離れたところにある第5リフトまで滑っていき、中級者コースを滑ることにした。この中級者コースはなかなか良かった。惜しむらくはコースが短すぎることだ。結局高低差がそれほどないために、傾斜のあるコースを作るとすぐに下まで滑り降りてしまうのだろう。

    平日なのと、少しアクセスの悪いスキー場であるので、人はまばらだった。興味深いことに、スノーボード率が極めて高かった、8割から9割はスノーボードで、スキーはわずかにしかいなかった。そのスキーも見たところショートスキーばかりだ。

    そしてさらに興味深いことに、ほとんどのスノーボーダーが初心者だということだ。ワックスのためか、上達のためか、私は中級者コースをほとんど減速することなく滑り降りることができ物足りなく感じていたが、実際のところそこそこの傾斜はある。他の客が中級者コースに挑んで盛大に転ぶのをリフトで上がるときに眺めていた。結果として、中級者コースはほとんど人がいなかった。実際、私が滑っていて人と出くわしたのは数えるほどしかない。経営が心配になるほど人がいない。

    昼頃に雨が降ってきて、雪質が悪くなってきた。しかしまだまだ板は滑る。ワックスのおかげだろうか。3時頃になると水気の多い雪が振り始めた。この頃になると、板が滑らなくなってきた。ソール面を見るとだいぶ汚れている。汚れを落とせば滑るようになるのだろうか。あるいはワックスの塗り直しが必要なのだろうか。スクレイパーやスプレー式の簡易ワックスを持ってこなかったことを後悔しながら、悪い雪質を滑った。だいぶ滑りにくくなっている。

    16時前になったので、そろそろ帰ろうと元のリフトまで戻った。しかし、雪が少し積もった今、上級者コースが気になる。まだ少し時間はあるので第2リフトで上がり、上級者コースに挑戦してみた。どうやら滑ることはできるようだ。ターンなのかブレーキなのかよくわからない動きをしながら、傾斜の強い非圧雪で荒れて水っぽい雪質の雪面を滑ることができた。しかし、あまり楽しくはない。止まらずに降りてくることはできないからだ。

    更衣室で着替え、変える前にいちどソールをクリーニングしようと拭いてみたところ、真っ黒な汚れが紙にびっしりとついた。これは汚れている。

    帰りも電車で帰ろうと駅に向かったが、駅員もいなければ券売機もない。張り紙に乗車券は反対側の出口でお買い求めくださいと書いてある。反対側の出口に行ったところ、たしかに券売機はあった。しかし販売中止になっている。まさか乗り過ごしたのだろうか。さてどうしよう。シャトルバスの場所もわからないし、越後湯沢駅まではそんなに遠くもないからタクシーでも拾おうかとおもったが、外を見ても流しのタクシーが走っているような場所ではない。さてどうしようと考えていたところ、電車が来た。そんなばかな。

    ホームに向かって車掌に聞いたところ、越後湯沢駅に行く電車だという。その場で乗車券を発行してもらい乗った。なんでも、券売機は故障中なのだとか。

    2019-03-05

    兵庫県警は魔法と科学の区別がつかない:JavaScriptプログラムによる補導が間違っている件について

    不正プログラム書き込み疑い補導|NHK 兵庫県のニュース

    クリックすると同じ画面が表示され、消えなくなる不正なプログラムのアドレスをインターネットの掲示板に書き込んだとして、13歳の女子中学生が兵庫県警に補導されました。

    兵庫県警は魔法と科学の区別がついていない。そのようなJavaScriptプログラムには何の問題もなく、問題はそれを閲覧したユーザー側のブラウザーにある。

    「クリックすると同じ画面が表示され、消えなくなる不正なプログラム」というのがどのように実装されていたかは知らないが、最も簡単で原始的なものは、アラートを繰り返し表示し続けるプログラムだ。

    while (true) alert("Hello") ;
    

    このプログラムを実行すると、アラートが繰り返し表示され続ける。ところで、このプログラムを実行しているのは閲覧者のコンピューターとブラウザーだ。このプログラムを提供したものの責任ではない。このプログラムを実行する時、閲覧者は上の文字列を受け取る。それだけだ。その文字列をどうするかは閲覧者の責任だ。閲覧者のブラウザーは上記の文字列を解釈して、あらかじめ定められた規則に従い処理を行う。つまりプログラムを実行するのは閲覧者の責任であって提供者の責任ではない。なぜならば提供者は単なる文字列を提供しているだけなのだから。それを予め定められた規則に従って解釈して実行するのは閲覧者のコンピューターとそしてブラウザーの責任だ。

    ブラウザーはJavaScriptを極めて安全な方法で実行する。Coinhiveもそうだが、WebブラウザーがJavaScriptプログラムを実行するにあたって問題は一切ない。もし問題があるとするならば、それはブラウザーの不具合かハードウェアの不具合だ。Webブラウザーは任意のJavaScriptプログラムを安全に実行できるように実装されている。上のプログラムにしたって、古典的すぎるのでブラウザーはとっくの昔に対処している。

    もし、上のプログラムが問題を起こすとしたならば、それはブラウザーがハードウェアの不具合であって、提供者の責任ではない。コンピューターは魔法ではないのだ。

    したがって、兵庫県警は魔法と科学の区別がついていない。

    2019-03-03

    スノーボード7回目

    前回の2泊3日の白馬八方尾根スキー場において現状の課題を確認したので、体の回復を待って再びガーラ湯沢に日帰りレッスンを受けに行った。特に問題なのはヒザの痛みだ。幸い、安静にしていれば3日間ほどで回復する。ただし今回は1日滑った後に1日おいて3日間すべったので、念の為に6日間休むことにした。越後湯沢の天気予報を見ると日曜日は雨のようだが、徐々に天気予報の雨が月火にずれていったので、日曜日で旅行会社に手配させた。行きの指定席は取れたが、帰りは指定席が満席で自由席しか取れなかった。

    さて当日、雨は降っていない曇りであった。悪くない天気だ。ただし30分ほど寝坊したために、指定席を乗り過ごし自由席で移動することになった。幸い、自由席はがら空きだった。

    前回確認した課題とは、ヒールエッジのターンが安定しないということだ。転ぶ時は必ずヒールエッジ側のターンで転んでいる。ターンの祭に雪面が荒れていると耐えきれない。そして、ヒールエッジ側のターンに細かい調整が効かないという問題もある。ヒールエッジでターンしようとすると90度近く回ってしまう。もっと浅く回ろうとすると安定しない。果たして今回のレッスンでこの課題は解決できるのだろうか。

    今回、初めてバインディングを自分で調整してみた。今まで買った店が設定したスタンス角である前18度後3度で滑っていたのだが、これを一段階上げ、前21度後ろ6度にした。スタンス幅は肩幅や足の長さを測ってみたが、このままでよさそうなので変更しなかった。

    30分出遅れたものの、ガーラ湯沢についてからレッスンが始まるまでまだ30分以上の時間がある。レッスン前に中級者コースであるジジを一滑りした。とても滑りやすく感じる。2泊3日の訓練で鍛えられたのだろうか、あるいはスタンス角の調整がよかったのだろうか。

    午前のレッスンでまず一本、インストラクターが腕前を見るための緩斜面を滑ったが、これまたとても快適だった。明らかに上達を感じる。

    午前の中級者レッスンではロテーションに特化して学んだ。スノーボードでターンに必要な要素は3つ。角付け、荷重と抜重、ロテーションだ。このうちどれかひとつに集中するだけでもターンはできる。特に緩斜面では難しいことを考えなくてもターンはできる。しかし傾斜が急になってきたり、雪面が荒れていたりすると、この3つの要素を組み合わせてしっかりと動かなければターンは安定しない。レッスンでは確かにターンが安定したように感じるが、問題はレッスンは緩斜面で行われている。果たして斜面が急になっても効果を実感できるだろうか。午後のレッスンでは荷重と抜重をするという。荷重と抜重については、前回のレッスンで実質プライベートレッスン状態になり、かなりしっかりと学んだ。おさらいをするのも悪くはないと思うがもう立ち上がりによる荷重と抜重はかなりできるようになっているのではないだろうか。そう思ってレッスン最後のインストラクターが仕上げ具合をみる一本で、ロテーションと荷重抜重を組み合わせたターンをしてみた。するとだいぶ短いターンになっている。しかも安定している。インストラクターが言うには、もうショートターンをできる頃合いではないかという。午後のレッスンで中級者レッスンが一人しかいないのであれば、ショートターンの練習をしようという話であった。

    午前と午後のレッスンの合間に、ロテーションを試してみようとまだ滑ったことがない中級者コース、グラノーブルに向かった。グラノーブルはそれなりに急な傾斜が長く続くコースだ。リフトでコースを横目に見ながら、その傾斜が延々と続く様子をみて、勇み足過ぎたかと後悔したが、いざ滑ってみると、あっさりと滑ることができた。なんと、私に足りないのはロテーションだったのだ。どうやら私は今までヒールエッジでターンをするときにむしろカウンターロテーションをかけていたようだ。これはヒールエッジのターン時にロテーションを使わないがために脚で無理やり板を回し、その力任せに回した角度が深すぎるために、浅く調整しようとカウンターロテーションをかけていたのだ。ただでさえ回りすぎるのにロテーションをかけてどうするのだと思っていたが、そもそも炉テーションをしていなかったがために力任せに回しすぎていただけで、ロテーションをすれば適切に回すことができる。

    グラノーブルを滑り終えた私は午後のレッスンに向かった。中級者レッスンが一人しかいなければショートターンの練習ということだが、残念ながら午後から中級者レッスンにもう一人来てしまった。ところが、どうも中級者にしては様子がおかしい。まずブーツが正しくはけていない。本当に中級者だろうか。ガーラ湯沢のスノーボードスクールの中級者というのは連続ターンができるレベルだ。レッスン開始前の緩斜面を一本滑るテストでは、とてもぎこちないものの、かろうじて連続ターンを行っていた。おそらく緩斜面のみでしか通用しない動きだ。結果として、中級者レッスンを受けるのは私一人になったので、予定通りショートターンの練習をすることになった。

    ショートターンの練習は中級者コースのジョアンナで行う。ジョアンナはレッスン専用のコースで、ゲレンデのコース一覧でそのようなコースがあることは知っていたが、一度も行ったことがなかった。私はインストラクターについて中級者コースのブロードウェイを危なげなく滑り、ジョアンナに向かった。ジョアンナはロングターンがかろうじてできるぐらいの幅の、やや傾斜のある直線一本のコースだった。私が到着すると、すでにスキーレッスンの受講者が滑っていた。

    滑る前にインストラクターがショートターンの滑り方を説明する。ショートターンのやり方は基本的にはロングターンと何ら変わることがない。角付け、荷重と抜重、ロテーションだ。ただし、ショートターンはターンの感覚が短いので、一定のリズムに乗ってすばやく小刻みにターンしなければならない。そして、ロテーションと荷重抜重のタイミングを合わせなければならない。ロングターンはゆっくりと曲がるので、ロテーションと荷重抜重のタイミングはそれほどシビアに一致しなくてもよい。ただしショートターンではタイミングを合わせなければロテーションと荷重抜重を組み合わせたターンにはならない。

    この説明を受け、インストラクターはまず私がショートターンだと思うものを一本滑ってみろと言った。そこでなるべくターン半径を短くターンとターンのを間を短くして滑ってみた。しかしロテーションと荷重抜重のタイミングは合わない。

    訓練は荷重抜重をおさらいするところから始まった。斜面に対して水平になり、大げさな屈伸をしながらサイドスリップをする訓練。大げさな荷重抜重とトーションだけを使ってアイソレートターンをする訓練。そしてロテーションを大げさに加えて荷重抜重とトーションでアイソレートターンをする訓練をした。インストラクターは私の動きが特に大げさである場合に褒めた。そうして動きに慣れたところで、アイソレートターンをつなげていく訓練ををした。このような一連の大げさな動きによる訓練の成果で、レッスンの終わりには私はショートターンらしいものができるようになった。後は反復練習するだけだ。

    レッスンが終わった私は、さっそくガーラ湯沢のスノーボードにとって難関の初心者コースであるエーデルワイスに向かった。エーデルワイスは林間コースだ。幅が狭く曲がりくねっておりロングターンをする余裕がない。しかも傾斜は緩すぎるためサイドスリップすると止まってしまう。

    さっそくロテーションと荷重抜重を意識したショートターンをしてみたところ、なんとあれほど狭いと思っていた幅の半分ぐらいを使うだけでしっかりとターンができるではないか。しかも確実に速度をコントロールできるので恐怖がない。速度を落としたければターンを深くし、速度を出したければターンを浅くする。ロテーションのためにターン角度の調整が思いのままだ。

    エーデルワイスを楽々とショートターンで滑り降りた私は、次にグルノーブルに挑戦した。これもまたショートターンで滑り降りてくることができた。

    ロテーションを習得しショートターンができるようになった私は、最後にガーラ湯沢の下山コースに挑戦することにした。

    ガーラ湯沢の下山コースはスノーボードにとってとてもつらいコースだ。幅は狭く、曲がりくねっており、ところどころ斜面が急になる。しかも山の上からふもとまで下るので、雪質はどんどん悪くなるのだ。そして全長2.5kmもある。とても耐久力のいるコースだ。

    しかし、今日の私はいつもほど疲れていない。いつもならもう滑れないと考えるほど痛くなるヒザも、今日はマイルドな疲労程度ですんでいる。これはどうもロテーションを習得してさらにロテーションと荷重跋重を組み合わせることにより、より効率的な滑り方をしているためらしい。これならば下山コースも行けるのではないか。

    下山コースへのリフトは4時に止まってしまう。残念ながら時間切れだ。しかし、トンネルを足で歩いていけば下山コースの入り口に行けるという。トンネルの中には長い長い階段があった。やれやれ、スノーボードのソフトブーツでよかった。これがスキー用のブーツならばつらいところであった。

    うんざりするほど長い階段を上がると、下山コースの入り口だった。長い階段を足で上がってきたので数分間入り口で休憩してから滑り出した。ロテーション、荷重と跋重、そしてショートターン。滑れる。体への負担も少ない。延々と滑っていくと、残りの距離を示す看板が見えてきた。「残り1.5km」なんと、まだ半分も滑っていないのか。しかしまだ滑ることができる。足への負担は許容範囲内だ。ロテーション、荷重と跋重、そしてショートターン。

    やがてふもとのガーラ湯沢駅が見えてきた。やった。下山コースを降りきったのだ。途中、木の葉に頼らざるを得ない場所は一切なかった。ショートターンを習得したのだ。

    次の目標はカービングターンとコブだ。そのためにはまたレッスンを受けなければならないが、ショートターンの反復練習をするために、次はたまたま手に入った湯沢中里のチケット引換券を使って、インストラクターなしでまだ滑ったことのないスキー場をショートターンで滑ってこようと思う。

    一日が終わってスノーボードを点検してみると、トップシートがエッジの上から長さ数センチ内側に3mmほどのえぐれた箇所がある。白いグラスファイバーと思われる素材が露出している。これはあまりよろしくなさそうだ。リペアキャンドルを買ってきて自分で修理しようか。このついでにアイロンを買ってもいいかもしれない。もっとも、私のボードのソールはエクストルードなので、そんなにワックスは浸透しないのだろうが。

    2019-02-27

    スノーボード6回目

    6回目は白馬八方尾根スキー場に2泊3日でスノーボードをしてきた。

    4人でスキーに行こうという話を去年からしていたが、全員の日程調整と場所の手配が面倒で、とうとう2月になってしまった。その間に私はスキーではなくてスノーボードの道具を一式買い揃えて、一人ガーラ湯沢で頻繁にグループレッスンに参加していた。ある程度の傾斜がある斜面でもベーシックターンができるようになり、ある程度は仲間について行けるようになった。そこでさっそく2月中に行こうという話になった。交通や宿の手配は旅行会社を使うようにした。最初からこうすれば手間がかからなかったのだ。

    さて、当初の計画では、越後湯沢に行こうという話であったが、あいにくと越後湯沢駅周辺のスキー場近くの宿がどこも2月中は満員で取れない。では軽井沢に行こうと探したが、これまた宿が取れない。どうやら東京から簡単に行けるスキー場はもう宿が取れないようだ。とくに土曜日が空いていない。これは平日の3日間に行くか、あるいは木金土や日月火のような2泊3日で、土曜日の宿泊を避けなければならないようだ。それをするぐらいならば、いっそのこともっと交通の便の悪い、しかし大きなスキー場に行ってはどうか。そこで持ち上がったのが白馬八方尾根スキー場だ。とても広い。日本で特に広いスキー場を挙げるとしたらまず出てくるスキー場で、長野オリンピックの会場にもなっている。そして、仲間の一人が主にここで滑っているそうで、とても良いスキー場であるとのことだ。さっそく宿を探すと、とにかく安い上に金土が空いている4人部屋の宿が見つかった。往復新幹線とリフト券2日と2泊で37200円、これに特急バスが片道1800円で。4万円ほどだ。

    しかし問題は、その週の水曜日にも職場の同僚とガーラ湯沢に日帰りで行く予定なのだ。これまでの経験から、スノーボードを1日滑ると体の完全な回復には3日間かかる。しかし金曜日からいくのでは1日しか空いていない。

    特に問題なのはヒザだ。どうも後ろ足に重心がよっているらしく、かつまだ強く減速するターンをするためか、右ヒザが痛くなる。関節痛の回復はなるべく負担を掛けずに待つしかない。しかし今回時間はない。スノーボードを始めてからというもの、筋肉痛のためにプロテインを毎日飲んでいるが、筋肉痛にはともかく関節痛には効かない。

    知り合いのボーダーに相談したところ、グルコサミンのサプリメントを取るとよいという。知り合いのサプリメント好きのボルダーに相談したところ、グルコサミンは効かない。グルコサミンとコンドロイチンとMSMを取るべきだと言われた。そこで、そのようなサプリメントを買ってみた。

    グルコサミン、コンドロイチン、MSM、ヒアルロン酸、コラーゲン、これらは関節痛に聞くとサプリメント業界では謳われているが、臨床試験でその効果が認められたことはない。臨床試験で認められているのならば、今頃は整形外科に行けば処方されるようになっている。いずれも臨床試験では偽薬と区別不可能な程度の効果しかなく、かつ副作用も偽薬特別できない程度の効果しかない。つまり偽薬と変わらないということだ。

    プラセボというのはとても強い効果を持つ。偽薬を偽薬と知りつつ摂取しても効果を発揮したという研究結果があるぐらいプラセボは実際に効果が出てしまう。残念ながら私はサプリメントを盲信するような疑似科学好きではないが、プラセボの効果を期待しよう。

    さて、我々が越後湯沢や軽井沢に行きたかった理由は、圧倒的に東京から行きやすいからだ。1時間から1時間半ほど新幹線に乗るだけでもう現地についてしまう。我々が今回行く白馬八方尾根スキー場は長野にあり、新幹線で83分かけて長野駅まで行った後、特急バスに75分乗らなければならない。幸い、バス停、宿、ゲレンデまでの移動距離はそれほどでもない。

    どうせ移動がつかれるので、あまり朝早く出発しても仕方がないと、東京駅を8時頃に出発する新幹線を予約した。しかし一人が財布を家に忘れてしまい、後から合流することになった。

    バスも思ったほど苦痛ではなく11時に現地に付き、宿に荷物を預けて、自前の道具一式を持っているスノーボーダーの私ともう一人のスキーヤーはすぐに用意ができた。一式レンタルする出遅れなかった一人はレンタルショップに行ったまま戻ってこない。そこで2人でゲレンデに向かうことにした。

    スノーボーダーであるがゆえにソフトブーツを履く私は、スキーヤーのとても歩きづらいスキー用ブーツを着用したスキーヤーをからかいながら、名木山(なきやま)ゲレンデに向かった。まず短い初心者用のコースを一本滑ろうと、さっそくリフト券を引き換えて入手し、名木山第二ペアリフトに乗った。リフトから降りて斜面を見下ろすと、どうにも傾斜が厳しいように見える。本当に初心者用のコースだろうか。あまり深く考えずに滑り降りたところ、ターンはできるが傾斜がきつく、しかも斜面があまりにもいびつでもはやコブのようであった。極めて雪質が悪い。水曜日に全国的に雨が降ったのと、ゴアテックスですら蒸すほどの日差しの強い晴天のためであろう。後で見てみたところ、どうやらこのコースは中級者用コースであったようだ。

    長いリフトに乗って上に上がり、滑り降りようとしたが、これまた難しい。大抵の斜面は今まで滑ったことがないほど急で、しかも距離が長い。その上圧雪が悪く天然のコブになっていて、まだショートターンのできない私にはターンができない。しかたがなく斜面の緩い初心者用のコースにそれたが、これまた自動車道路がそのままコースになっているような幅の狭い曲がりくねった林間コースで、スノーボードにはつらい。少なくとも、傾斜面かつコブよりはましだ。

    まだ水曜日の疲れも残っているし、2泊3日もするので初日から体に負担を掛けてはならないと判断し、私は1時間以上早めに切り上げて宿に戻った。服を着替え、板の道具の手入れをし、部屋に入って荷物を出していると、仲間たちも切り上げて帰ってきた。

    この宿は安いものの、朝夕の食事付きで、温泉もある。あまり期待はしていなかったが、形だけはきれいなジャンクフードよりはマシな食事が出てきた。しかしおかずが冷めているのは安いだけある。なぜか浴衣はプランに含まれておらず、別途200円出してレンタルしなければならない。よくわからないケチりかただ。どうせ浴衣はレンタルするので200円ぐらいなら普通に旅行会社のプランに含めればいいのではないかと思うのだが。

    安宿であるので部屋が狭いことは覚悟していたが、まさかの意外なものまで狭かった。それは布団。こんなに狭くて短い布団を私はこの生涯で見たことがない。腕を広げればはみ出すし、だいたい長さは170cmほどしかない。我々の中に背の高い人間がいなかったのは幸いだ。畳に沿って敷いてみると、なるほど、畳一倍分の大きさがある。立って半畳寝て一畳とはこのいひか。

    我々は近くにあったマウントという店で酒とツマミを買い求め、ボードゲームに興じて、その日は就寝した。

    翌日、相変わらず冷たい安っぽくてまずい鮭の朝食を食べた我々は、さっそくゲレンデに向かった。今日は寒く、雪も降っていたので雪質は多少マシであった。しかし相変わらず天然のコブがいたるところにある。このスキー場の経験者が言うには、パノラマコースが中級者コースだが滑りやすくてよいらしい。我々は早速そこに向かおうとしたが、個々で一つ私に問題が発生した。なぜかトゥと土踏まずが痛むのだ。これではトゥエッジが使えない。どうにもならないのでどうにか木の葉でふもとまで降り、別行動を取ることにした。スキー場のスタッフに話を聞いてみると、咲花(さっか)ゲレンデというのが緩斜面で広くて初心者にも滑りやすいという。だいぶ離れているのでシャトルバスで向かった。

    咲花ゲレンデはたしかに滑りやすかった。傾斜は緩く、しかも広い。足への負担も軽いようで傷まない。私は1日ここでスイッチスタンスの練習をした。レギュラースタンスで滑ることによって右ヒザが痛いのであれば、スイッチスタンスを練習することで右ヒザへの負担を軽くしようという目論見だ。レギュラースタンスでは簡単にターンできる緩い斜面だが、スイッチでは最初はターンもままならず、なんとかターンできるようにはなったもののまだぎこちない。しかし、1時間ほど滑っていたところスイッチでもある程度のターンができるようにはなった。時間はすでに15:30、3日目の午前も滑るのであれば体への負担を考えそろそろ切り上げてもいいのだが、やはりこんな広いスキー場に来たのに、山の上に上がらないのは損だ。マップを見れば、ここからリフトで少し高いところに上がり、初級者用のコースで白樺ゲレンデまで戻ることができるようだ。一日緩斜面で練習をしたので戻ることぐらいはできるだろうとリフトに乗った。これは間違いであった。

    初心者用のコースというのは、自動車用の道路をコースにした林間コースだったのだ。幅は狭く、曲がりくねり、しかも片側は崖でロープすらはられていない。もし操作を誤って崖に落ちたら深刻な怪我を負う可能性が高い。私は慎重に進もうとしたが、あいにくと斜面はとても状況が悪く、中央が削れていてサイドスリップすらなかなかままならない。それに、斜面が緩すぎるのでサイドスリップでは進まない。かと行って直滑走するとそれなりの速度にはなるし、私の技量ではターンをするには幅が狭く、ブレーキをすると僅かな左右へのブレでも崖に肉薄して恐怖がある。

    ほうほうの体でとても長いコースを休み休み降りると、咲花ゲレンデに続くやや傾斜のある斜面がでてきた。林間コースはなおも続き、これを続ければ白樺ゲレンデに帰ることができるのだが、もうすっかりくたびれた私は、林間コースを諦めて急斜面に飛び込み、咲花ゲレンデに生還した。その後、リフトの動く時間まで滑ってから、シャトルバスで宿に帰った。

    3日目に滑るかどうか悩んでいた。足の状態は悪くはなっていないものの、ヒザの痛みが完全にないわけではない。サプリメントの効果はわからない。そして前日の傾斜の厳しいところを滑ったときのトゥと土踏まずの痛みも気になる。旅行会社のプランでは3日目のリフト券はついていないので、自分で買う必要がある。3日目は午前中に3時間ぐらい滑って帰って来れるぐらいのスケジュールで帰りの新幹線を予約している。午前券は4200円、もし滑れないとなるとこの金額は痛い。しかし、都内から日帰りでガーラ湯沢に滑りに行くのにも13000円ぐらいかかることを考えると、やはり短時間でも滑るという経験はしておきたい。4人のうち、体力がまだ残っている私を含む3人で午前中に滑りに行った。なんでも、中腹にあるパノラマコースが中級者向けだが雪質もよく幅も広く滑りやすいという。

    ゲレンデに行き、まずショートリフトに上がって中級者コースを一本滑ってから考えることにした。ここで足が痛むようであれば上に上がることはできない。結果は悪くなかった。どうやら3日目の雪質は悪くなく、かつ圧雪車が走ったらしく整地されていてバンプは消えていた。これなら滑ることができる。

    そして気がついたのだが、どうも昨日の足の痛みは、バインディングを限界まできつく締めすぎたのが問題だったようだ。外れない程度に締めれば痛みはなかった。

    そしてリフトにのってパノラマコースに向かった。途中、とても長いリフトがあるので、スノーボードでは足が痛くなるだろうと危惧していたところ、なんとセーフティバーに足を乗せる棒がついていたので、とても楽だった。すべてのリフトにこれがついていてほしい。上に上がれば上がるほど雪質がよくなっていくようであった。

    パノラマコースはたしかによかった。雪質はよく、しっかりと圧雪されていて、しかも圧倒的に広い。他人の存在を気にする必要がないほど広い。傾斜はある程度あったが、雪質と広さと人口密度の低さのために、圧倒的に滑りやすかった。しかし、この傾斜ではまだスイッチスタンスでターンができないようだ。そして、どうもヒールエッジが相対的に下手になっているらしい。トゥエッジは安定するのだが、ヒールエッジの状態で、斜面の一部に存在するバンプに衝突すると衝撃に耐えきれずに転んでしまう。そして、速度が出るとヒールエッジのターンはターンと言うよりはむしろブレーキに近くなってしまう。始めたばかりはトゥエッジが極めて難しく感じたのに、すっかり逆転してしまった。次にレッスンを受けるときの課題にしよう。

    前回、今回と他人と滑ってみた感じたのは、私はなかなかよいウェアを使っているらしいということだ。前回はあいにくの雨で、一本しか滑っていないのに安物のグローブを使っている人たちはグローブが完全に浸水して気持ちが悪いと言っていたが、ゴアテックスのグローブを使っている私は何の問題もなかった。そして、ウェアも表面から見ると体重のかかる尻部分に水が浸水しているように見える。私のウェアは全く問題がなかった。またみな暑さを訴え、ウェアの前のファスナーを開けたりしていたが、私は今シーズン中に、ゴアテックスのウェアを脱ぎたいと思ったことは一度もない。そもそも私のウェアの構造は横にファスナーがついていて前をはだけることは無理な作りになっている。少し値段は高かったものの、ゴアテックスのウェアを選んで正解だったようだ。

    またプロテクターを買ったのも正解だった。最も役に立っているプロテクターは尻で、つぎに手首だ。ヒザもある程度役に立っている。ヒジについてはよくわからない。受け身を取るのにヒジを積極的に使うことができるようになったぐらいだろうか。ヘルメットは今の所役に立っていない。これはいいことだ。というのもヘルメットが役に立つようなひどい転び方をしていないということだからだ。

    さて、時間が11時になり、一人別れて上級者コースに向かった仲間がパノラマコースに帰ってきた。帰宅方法は2つ。リフトにのってゴンドラまで行き、ゴンドラで下山する方法と、自力で滑って下山する方法だ。まだ体力的にも余裕があり、バインディングを締めすぎなければトゥと土踏まずが痛まなくなることを学んだため、自力で滑って下山することにした。

    下山は主に初級者から中級者のコースを通るのだが、一箇所だけ上級者コースがあった。傾斜が急なだけでコブはなく幅もかなり広いため、挑戦してみたが、歯が立たなかった。トゥエッジのターンはできるのだが、ヒールエッジのターンがどうしてもできない。しかたなくサイドスリップでゆっくりと降りることにした。雪質がよく、パウダーも十分に積もっていたので、幸いにして安全に降りることができた。スノーボードでよかった。これがスキーならばボーゲンで大変な思いをしながら降りるところだった。上級者コースの傾斜は手強い。今シーズン中にターンできるようになるだろうか。

    無事に下山した我々は帰路についた。体力的な問題で滑らなかった仲間と合流し、バスを待つ間近くの飲食店を探そうとしたが、見つからなかったため、そのまま帰宅した。食事付きの宿を取ったのは正解だった。周辺にろくな飲食店がない。

    流石に体に負担がかかったので、一週間ほど回復を待ってから次のスノーボードに行くことにする。

    2019-02-21

    スノーボード5回目

    同僚とガーラ湯沢に行ってきた。今回はレッスンではなく、みんなで楽しく滑る予定だ。

    当日の越後湯沢は最悪の天候であった。雨と濃霧で3メートル先が見えない。滑っていてもコースがどこまで続いているのかが分かりづらい。そして雪質も最悪だ。ただ、滑走速度があまり出ないので、これはこれで初心者にも優しいといえる。ただし視界の悪さは本当にひどく、あちらこちらで衝突が発生していた。なにしろ直前になるまで相手が見えないのだ。

    4日目に大げさなストロークによる荷重と抜重でベーシックターンを安定させたが、今回、それほど大げさにストロークしなくても問題なく曲がることができた。これは雪質の違いによるものか、あるいは体が感覚を覚えたためか。その辺はよくわからない。

    ロングターンはできるようになったのだが、ショートターンができない。そして、どうも斜面に対して完全に水平になるターンを自動的にしてしまうので、林間コースを滑ることができない。今回は雨混じりのとても悪い雪質で速度が出ないためか、ブランクのある同僚達が僅かに左右のエッジを斜めにたてて幅の狭い林間コースを楽しんで抜けていくのに対し、私にはそれができず、完全にターンしてしまい、狭い幅で曲がりきれない状況になった。なぜか完全にターンしてしまうことがやめられない。おそらくその動きだけ訓練したからだろう。今までは雪質がよく、かつ傾斜もある斜面ばかりで練習していたので、同僚がやっているような動きは使えず、したがって経験がないということもあるだろう。

    とりあえずベーシックターンが安定するようにはなったが、残念ながらスノーボードの習得は終わりではなくまだ始まったばかりのようだ。課題がたくさんある。

    スノーボードを始めた時はトゥエッジのターンが極めて難しく感じたが、今はヒールエッジのターンのほうが難しく感じる。トゥエッジは安定しているのだが、ヒールエッジはかなり不安定で、ターンと言うよりはブレーキに近いような動きになってしまっている。

    1日滑った結果、右足のほうがより疲れていることに気がついた。これは重心のかけ方が悪いのだろう。スイッチスタンスでも滑れるようになるべきかもしれない。スイッチは逆向きでスタンス角がやや後ろ向きなことぐらいの違いしかないだろうと思って試したが、スイッチではターンどころかブレーキすらおぼつかない。 いずれ練習していくとしよう。

    もうひとつの問題はヒザの痛みだ。筋肉の疲労はまだ少なく、もっと滑りたいと思うのに、ヒザの痛みのためにこれ以上滑るのを断念しなければならないことがある。ヒザの痛みの完全な回復には少なくとも3日間の休息を要するようだ。私はまだ32歳で日常的にヒザの痛みを感じておらず、それどころか毎日キックスクーターで通勤しているぐらい健康なヒザを有しているのに、なぜこんなにヒザが痛むのだろうか。

    考えられる理由としては、体の動きが非効率的であることと、まだ膝関節周りの筋肉がスノーボード用に鍛えられていないことがある。

    これを知り合いのスノーボーダーに相談したところ、グルコサミンが関節痛によいと聞いた。調べてみるとグルコサミンのサプリメントは確かに関節痛に聞くと宣伝されているが、科学的な実験によれば、グルコサミンの経口サプリメントは偽薬と変わらない程度にしか関節痛に効かないとのことであった。副作用の方も偽薬と区別できず、摂取自体には問題はなさそうだ。偽薬を偽薬と知りつつ摂取しても効果があるという研究もあるし、一度ぐらいは試してみようと思う。

    2019-02-15

    スノーボード4回目

    前回、とうとうベーシックターンができるようになった私には自信がついてきた。来週末、仲間内で滑りに行くが、これならば大丈夫だろう。しかしレッスンの回数券も買ったし、来週末まではまだ10日間ほどあるので、筋肉が回復した2日後の14日木曜日に再び日帰りでガーラ湯沢に行った。レッスンも回数券を買ったことだし、消費するためにも行かない理由はない。

    そろそろ日帰りガーラ湯沢の感覚もつかめてきたので、今回の新幹線の時刻は最適なとり方をした。事前に早寝をすることにより05:00には起床し、6:44分東京駅発のMAXたにがわに乗る。帰りは17:01だ。ガーラ湯沢のリフトは16:30まで動いており、ゲレンデ自体は17:00まで開いているのだが、体力的には16:00で限界になるので、最後まで粘る必要はない。それに、平日の上越新幹線ガーラ湯沢発東京行は、17:01と17:50と19:08だけなのだ。たかが600メートルぐらいしか離れていない越後湯沢駅まで出ればもう少し細かいダイヤになっているのだが、それも面倒だ。そこで、16時過ぎに切り上げて17:01の新幹線に乗ることにした。

    この日はとても寒かった。その分雪質はよく、到着直後の斜面はよい滑り心地だった。

    ところでガーラ湯沢にはエンターテイメントという名前の初・中級者向けのコースがある。このコースは最初と最後の傾斜がきつくなっていて、安定してベーシックターンすることができない。できることはできるのだが、ヒザと足首に強い負荷がかかるため、連続したターンを維持できない。これは私の筋肉と関節が弱いと言うより、私の動きに問題があるに違いない。今日中に向上させたいものだ。ただし、明らかに上達はしている。逆エッジで転ぶことはほとんどなくなったので、転ぶときは予測ができる上、十分な減速ができるので、辛い転び方はしなくなった。

    午前のレッスンではターンを上達させるために、ターンの各要素を分解して練習した。体重を前足にかけてターン、トーションだけでターン、エッジだけでターン、視線を適切にしてターン。頭と体と重心が正しく板の上に乗っていることを確かめるために軽くジャンプ、といった練習をした。

    午前中の練習を踏まえて再びエンターテイメントに挑んでみたところ、多少マシになった感じはあるのだが、まだヒザと足首に削岩機でも使っているかのような強い負荷がかかる。

    午後になって、再びレッスンの集合場所に向かった。ガーラ湯沢のスノーボードのレッスンは、初めて、初級、中級、上級に分かれている。初級はサイドスリップができること、中級は連続ターンができること、上級はどんな斜面でも連続ターンができること、という条件になっている。はたして今シーズン中に上級に上がれるのだろうか。

    レッスン開始時間になったが、中級には私一人しかいなかった。なんと、これでは実質プライベートレッスンではないか。平日に来てよかった。

    午後のレッスンでは緩斜面で荷重と抜重の訓練をした。インストラクターいわく「トーションなどの細かいことはひとまず忘れろ、荷重と抜重がしっかりできていればターンはできる」。いままで荷重と抜重はちょっとしゃがむ、ちょっと立ち上がる程度のヒントしかもらっていなかった。緩斜面ではそれで十分だった。そもそも、緩斜面では荷重と抜重をそれほど行わなくても簡単にターンができる。

    しかしそれでは緩斜面でしかターンができない。私は腰を限界まで落としてしゃがみ、ターン開始時に前向きに斜めに立ち上がり、ターン終了時に再び腰を限界までしゃがむという、とても大げさな荷重と抜重の動きを訓練した。そしてとうとう、初めてレッスンで緩斜面ではないコース、エンターテイメントに向かった。

    なんと、荷重と抜重をしっかりするだけで、斜面の傾斜が厳しくなってもしっかりと安定してターンをすることができた。しかもヒザと足首への負荷が消えた。スクワットをする負荷だけでターンができるようになった。

    プライベートレッスンの効率は素晴らしい。プライベートレッスンはグループレッスンの3倍ぐらいの値段だが、この効率を考えると、今シーズン中にプライベートレッスンを頼むのも検討に値する。

    インストラクターから、だいぶ動きがよくなった。後は反復演練するだけだと助言を受けて午後のレッスンが終わった。ちょうど来週はみんなでスキーに行く。はじめてレッスンではないスノーボードに挑戦するいい機会だ。

    2019-02-13

    スノーボード3回目

    11日にガーラ湯沢まで日帰りスノーボードに行ってきた。今回はだいぶ寒く雪も降っていた。少し早めに着いたのでレッスン前に一滑りしたところ、あまりの寒さと横から打ち付けるが顔に張り付く問題のためにつらい思いをしながら滑り降り、直ちに売店でフェイスガード付きのフードを購入した。

    レッスンはまだ連続ターンができないので初級だ。ターン自体はできるようになったのだが、連続できない。トゥエッジ側のターンをした後、不安定になり続かない。

    今回の午前のレッスンでは、斜面にトゥエッジをかけてジャンプしてあがるトレーニングを学んだ後、ベーシックターンを学んだ。どうやらターンをするときに立ち上がることでうまくバランスを取ることができるようだ。どうやら立ち上がり系だのあるいはその逆の抱え込み系だの、荷重とか抜重といった用語が関係するそうだが、まだそのへんはよくわからない。後日スノーボードのそのへんの力学を解説した本を買って調べようと思う。

    初めてベーシックターンが決まった時は爽快だった。レッスンを忘れてそのまま下まで連続でターンしながら滑ってしまった。

    結果として、スノーボードを始めてから累計10時間ほど滑ったところでベーシックターンができるようになった。不思議なことに、一度感覚を掴んでしまうと大げさに屈伸をしなくてもターンができるようになった。

    ベーシックターンはできるようになったが、まだトゥエッジ側のターンが安定しない。午後のレッスンではトゥエッジ側のターンを安定させるために、重心を前足に置くことや、トゥエッジのサイドスリップでできる限りゆっくりと滑り降りることや、直滑降でスピードを出した状態からトゥエッジのサイドスリップに切り替えて速度を落とさず一定距離を滑ること、はてはトゥエッジで一回展するなど、筋トレのような疲れる訓練をした。

    レッスンが終わり、疲れたが最後に一滑りだけしようと初心者用の林間コースに行ったところ、地獄を見た。まずコースの幅が狭すぎてターンが難しい上に、あまりにも傾斜がなさすぎる。幅が足りずにターンしきれずブレーキをかけて止まってしまった後に、傾斜が緩すぎるために直滑降に戻しても滑らないという地獄を味わった。

    どうやら初心者用の緩斜面の林間コースというのは、スキー初心者にとって都合がいいコースであり、スノーボード初心者にとってはつらいコースのようだ。

    このような林間コースをスノーボードで滑るには、ターンの幅を短くする必要があるようだ。まだまだ学ぶことが多い。

    ところでスノーボード用語について思うことがある。どうもスノーボード用語があまり統一されているように思えない。スキーは歴史のあるスポーツだ。日本はドイツからスキーを学んだので、ボーゲンといい、最近はあまり言わなくなったがパラレルクリスチャニアといい、ドイツ語由来の用語が多い。一方スノーボードは1980年台にようやく商業的な板が販売され始めたほど歴史の浅いスポーツだ。サーフィンやスケートボードのようなトリックを決める文化から強く影響を受けていて、オーリーやノーリーといったスケートボード用語が輸入されたりしている。

    「木の葉落とし」という用語がどこから来たのかよくわからない。これは第二次世界大戦中に日本のゼロ戦がよく行っていたとされているマニューバの名称であるが、関係があるのかどうかはわからない。英語では振り子(Pendulum)というようだ。

    ベーシックターンはそのままbasic turnだが、どうも立ち上がり系に対する抱え込み系のターンのことを、英語ではdynamic skidded turnというらしい。

    インストラクターから何を学びたいかと聞かれて、今回のレッスンで一緒になった中国人は、「バターをやりたい」と言っていた。インストラクターは「バター」が何を意味するのか知らなかったが、おそらくプレス系のグラトリであろうと推測していた。調べたところ、どうやらバターというのはノーズプレスかテールプレスした上でスピンするトリックのようだ。

    グラトリという用語もよくわからない。グラウンドトリックが4音節を好む日本風に省略されたのであろう。

    次の目標はミドルターンとショートターンだ。その次の目標はおそらくカービングターンだろうか。

    2019-02-09

    スノーボード2回目

    スノーボード初体験の興奮冷めやらぬ3日後、有給を取ってガーラ湯沢に日帰りスキーに行った。今回は旅行会社のツアーを申し込んだので、往復の新幹線とリフト券で12100円だった。他にロッカー代が1000円かかるので、最低でも13100円はかかることになる。

    前回の最初のスノーボードでは怪我はなかったのだが、かえって寝ようとすると首に違和感を感じた。朝起きると首の側面に痛みがある。そんなところは打っていないはずだ。しかし、この痛みはどうも筋肉痛のような痛みだ。調べてみると、転んだときに頭を守るために瞬時に顎を引き頭を起こす動作をするために、その動きをする筋肉である胸鎖乳突筋が損傷した可能性が高そうだ。1日たった夜、筋肉痛はさらに激しくなり、仰向けのまま首だけを使って顔を起こすのが辛いほどであったが、2日目にはだいぶ楽になり、3日目にはかなりよくなった。

    もうひとつは、尾てい骨の痛みがあった。これは翌日には完全に収まっていたが、気になるところだ。

    怪我こそなかったものの、スノーボードはとても良く転ぶということがわかった。しかもスキーと違い、予測不可能なときに前後に転倒する。スキーでは転倒する時はだいたい事前に予測可能であり、受け身を取る準備ができる。しかも転ぶのはたいてい側面からだ。スノーボードでは逆エッジにより不意に転ぶ。しかも前後に転ぶので頭を打ちやすい。

    これはあまりにも危険なので、プロテクターを買うことにした。

    まずヘルメットだ。神保町から小川町にかけての通りの店をハシゴしたところ、スキーとスノーボード用のヘルメットは自転車用ヘルメットと同じ発泡スチロールとプラスチックで通気用の穴があいている作りであった。自転車用との違いは、通気穴に雪が入り込まないような設計になっている。

    そして、高級品にはMIPSというコンピューターアーキテクチャーと同名の機構が使われている。これはヘルメットがアウターとインナーの二層構造になっていて、衝撃時に二層がずれることによって衝撃を分散させる仕組みだそうだ。GIROのEmerge MIPSというヘルメットを買った。

    尻プロテクターは数千円の安いものと、BURTONの高いものがあった。どちらもパンツのように履いて装着するものだ。BURTONの高い製品は薄くて動きやすそうであったので、BURTONを買った。

    これで終わりにするつもりだったのだが、手首とひじとひざのプロテクターも買った。手首はグローブの上からつけるもの、ひじとひざは筒状のインナーでスリーブやタイツのように装着する。

    もうひとつ、上半身にインナーとして着込む胸部と背中のプロテクターがあるのだが、これはトリックを決めるときには必要だろうが、まだそのレベルには達していないので必要がないと判断して見送った。

    さて、早速ガーラ湯沢で滑ってきたが、やはりプロテクターは正解だった。何度も尻だけで全衝撃を支えるような悪い転び方をしたのだが、尾てい骨は全く痛くならなかった。ひじとひざのプロテクターも手以外で積極的に受け身を取りに行くことができるのでよい。うっかり手を先についてしまっても手首のプロテクターによって手首を痛めることはなかった。途中、インストラクターから、プロテクターを付けているので大丈夫だろうとターンの練習として360度スピンを提案され、挑んで当然派手に転んだのだが、プロテクターのおかげで何の問題もなかった。また、プロテクターのせいで動きが制限されることもなかった。

    さて、2回目のスノーボードでは朝早く出発し、午前、午後ともにレッスンを受けた。今回は、ヒールエッジ、トゥエッジ両方でのブレーキとターンを学んだ。トゥエッジのターンは難しく、まだ緩斜面でしか安定して成功しない。そして連続してターンすると安定しない。ガーラ湯沢のレッスンは、はじめて、初級、中級、上級と別れているが、中級に行くためには連続ターンができなければならない。見ていると簡単に思えるのだが実際に行うのは難しい。

    インストラクターが言うには、私は足元を見る癖があるらしい。足元を見るとバランスが崩れるし、第一足元を見ても意味がない。というのも回避すべき対象は足元にはなく、足元に回避すべき対象が見えたところですでに手遅れで回避不可能だからだ。

    スキーとスノーボードを比較すると、スキーは入門が簡単で上達が難しい。スノーボードは入門が難しく上達は簡単だそうだ。スキーはボーゲンですぐに滑ることができるし、ターンも難しくない。スノーボードはサイドスリップの習得が難しく、かつ後ろ向きに滑ることができなければターンすらままならない。

    週末もスノーボードに行くつもりだ。

    2019-02-04

    スノーボード1回目

    突然、スノーボードがしたいと思い立った。去年はスキーをしたのでにわかにスキー欲を出し、一時はスキー用具一式を買い揃えようと思ったこともあったが、ウィンタースポーツシーズンも末期の3月末にスキーをしたこともあって、そのままスキー欲はしぼんでしまった。今年は2月中に仲間内でスキーに行こうという話があったので、ふと、スキーではなくスノーボードも体験してみたいと思い立った。どうやら、都内から日帰りできるスキー場はいくつもあるようだ。

    スキーやスノーボードは手軽にできる。手ぶらでカネだけ持ってスキー場に行って道具をすべて現地でレンタルすればいいだけだ。しかしレンタルというのも結構高い。スキーやスノーボード一式とウェアで1万円ぐらいはかかる。そんなにかかるのであればいっそのこと買ってしまうというのはどうだろうか。スキーやスノーボードの道具は安いものならば数万円で手に入るし、ウェアも数万円で手に入る。ということは6回から10回ぐらいレンタルするならば買ってしまっても損はないはずだ。特にウェアはスキーでもスノーボードでも使い回せる上、スキーやスノーボードと違って錆びることもないし手入れも楽で長期間使える。

    そんなわけで土曜日に神保町から小川町にかけてのやたらとスポーツ洋品店が密集している場所に降り立った。なぜこんなところに古本屋やスポーツ用品店が密集しているかと言うと、この辺は学生街だったからだそうだ。

    何軒かの店を冷かした末にとうとうスノーボード用具を一式買ってしまった。もっと安いものもあったし、もとよりスノーボード道具の質を判断する知識もないのだが、最安値よりは少し高い道具を買ってしまった。

    スノーボードでやや想定していた予算を上回ったのでスキーウェアは安くしたいところだが、ここにも沼があった。ゴアテックスだ。過去の少ないスキーの経験から、スキーウェアはとても蒸れるということがわかっていた。しかしゴアテックス素材ならば蒸れにくいはずだ。しかしどの店でもゴアテックス素材のウェアは値段が倍以上に高い。一方で蒸れるとやる気を失う。結果としてゴアテックス素材のウェアを買ってしまった。

    さて、道具はすべて買った。スノーボード板とブーツとウェアを入れる専用のリュックまで買ってしまった。これでいつでもスノーボードに行ける。そう、明日の日曜日でも。

    都内から日帰りで行けるスキー場でも、旅行会社を経由して交通とリフト券を一括して入手すればいくらか安くなる。そういう事情もあるが、本当に都内から日帰りでスキー場に行けるのか試すためにも、何の計画もたてず、突発的に道具を購入した翌日に電撃的にスキー場に突撃することにした。一人で行こうと思っていたが、同じくスノーボードを一度もしたことがない妻もこの無計画を気に入り、同行するという。

    我々の当初の計画では、9時頃にガーラ湯沢に到着し、午前中に現地でスノーボードレッスンを受け、午後は自由に滑るというものであった。

    かくして我々は日曜日の朝7時に家を出て、9時過ぎにガーラ湯沢に到着した。ガーラ湯沢を利用したことは一度もなくて勝手がわからなかったため、リフト券の購入、着替え、レンタル手続きに手間取り、残念ながら午前のスノーボードレッスンの受付は逃してしまった。

    午後のレッスンまでは時間がある。特に妻は「レッスン費用は甚だ高し。我は体で覚える派なり」と蛮族のような思考の持ち主である。そこで我々は前日にインターネット上のスノーボードの滑り方の解説を読んだ付け焼き刃の知識を元に、入口近くの訓練用の浅い傾斜角の斜面で訓練を試みたが、一向に要領を得ない。少なくともスキーはこうではなかった。スキーは未経験でも、もう少しはマシな動きができたはずだ。スキーの知識はスノーボードでは何の役にも立たないようだ。

    そのような危うい状態で、蛮族系の妻は「レッスンは午後たり、遅し遅し。我が夫何ぞリフトに乗って初心者用のコースを滑らざる」と提案した。我々は苦労しながらリフトに乗り、つかの間の雪山の眺めを堪能し、そして死ぬ思いをしながらリフトから降りた。スキーはこうではなかった。スキーでリフトから降りるのに苦労したのは本当に最初の一回目だけであった。

    ガーラ湯沢の初心者用のリフトには2つのコースがある。リフトの横を真っ直ぐ滑り降りるコースと、リフト降り場から奥に行きカーブして戻るコースだ。私は前者のコースは最も短いので最も簡単であろうと主張したが、妻は後者のコースのほうがより簡単であると主張した。その理由は、後者のコースは特に初心者用のコースであると看板が出ているのみならず、傾斜角も前者より浅いというものだ。なるほど一理ある。スキー経験者である我々には当然の理のように思われたので、我々は後者のコースに挑んだ。スノーボードを知る読者はこれから我々の経験する過酷な運命についてすでに予想がつくだろう。

    我々は数メートルおきに転びながら、とても傾斜角の浅い初心者用コースを長時間かけて転がり落ちた。スノーボードの完全な初心者は、むしろ傾斜角の極めて浅い場所の方がつらいのだ。というのも、サイドスリップで進みにくいからである。

    ほうほうの体でからくも初心者用のコースから生還した我々は、午後のレッスン開始を待つのが懸命であると判断した。しかし、果たしてこの何もできない状況から2時間ばかりレッスンをしたところで何を学べるというのだろうか。状況は絶望的なように思われ、早くもスノーボードの購入を後悔し始めていた。

    時間になり、未経験者用のレッスンが始まった。我々はシューズの履き方、スノーボードの取り付け方、片足で平地を移動する方法を学び、初心者用コースのリフトに乗った。そして再び死ぬ思いをしてリフトから降りた。

    レッスンでは、前者のコースを使った。傾斜角がやや深い方のコースだ。スノーボードでは傾斜角が深いとサイドスリップで進みやすくなり、むしろ楽になる。そのため、スキー用の傾斜角の浅い初心者用のコースは、必ずしもスノーボードにとって初心者用のコースではない。むしろ中級者用のある程度傾斜角のあるコースのほうがマシだという。

    我々はヒールエッジによるサイドスリップを学んだ。不思議なことに、あれほど絶望的に何もできなかったはずが、インストラクターの指導の結果、3回滑るだけでヒールエッジによるサイドスリップでかなり安定して滑り降りることができるようになった。とにもかくにもスノーボードで斜面をゆっくりと安全に滑り降りることができるようになった我々は、ボーゲンを学んだスキー初心者のごとく有頂天になりすっかり自信を取り戻した。その自信はトゥエッジによるサイドスリップを学ぶ場面で再び打ち砕かれた。

    トゥエッジ! なんという無茶な滑り方。滑っている前方が見えない恐怖はもとより、バランスがとてつもなく難しい。そして背中から転倒してしまう。スキーでは初心者はまずやらない後ろ向きの滑り方をスノーボードではやるというのか! しかもインストラクターによれば、トゥエッジのサイドスリップは最も初歩的なテクニックであり、これができなければスノーボードではターンすらできないという。

    トゥエッジによるサイドスリップは当初絶望的に思われたが、一回目を滑り終わる頃にはだいぶコツを掴み、二回目ではなんと安定してトゥエッジによるサイドスリップだけで滑り降りることができるようになっていた。

    これはとても奇妙な感覚だ。このレッスンで学んだスノーボードの滑り方は、全て事前にインターネット上の文章と動画で学んでいたことだ。それがどういうものであるかは知っていた。しかし、実践することはできなかった。それがインストラクターの指導があると短時間で学べるというのはどういうことだろう。プログラミングの教育もこれほど簡単であればいいのだが。

    すっかり気を良くした筆者は、レッスン終了後にトゥエッジ側のターンを試みたが、見事に失敗して背中から転んでしまった。あまりにも急なことだったので受け身も間に合わず、頭を地面に打ち付けてしまった。痛みはほとんどなかったのだが、やや危険な転び方であった。次に来る時はヘルメットを着用しようと決意した。

    結果としてスノーボードは続けられそうだ。今シーズンだけで元を取るためには毎週のように行かなければならないが、思い立ったその日の午前中にスキー場に行って午後だけ滑るということもできるので、お手軽なスポーツだ。ただし金はかかる。

    2019-01-28

    P1337R0: 標準ライブラリへのエイリアスを追加してC++を復活させる提案

    p1337r0.pdf

    素晴らしい提案が2019年4月1日付けの文書でC++標準化委員会に上がっている。

    標準ライブラリへのエイリアスを追加してC++を復活させる提案

    背景

    Node.jsやRuby on Railsのような高パフォーマンスでスケーラブルな開発ツールの興隆を受けて、C++は市場を失いつつある。10倍プログラマーと呼ばれるような最高の開発者達は、Web 3.0アプリケーションとシステムを構築するのにもはやC++を使わない。かつてC++は当然使うべき言語であったが、近年落ちぶれている。もしこのまま何もしなければ、C++は言語として絶滅するだろう。GoogleのAbseilチームはC++の危難を救うために立ち上がった。これによりすべてのプログラマー、特に最高のプログラマーですら、C++を使うことができるようになるだろう。

    1337提案

    我々Abseilチームはかく提案する。C++2aより先、標準ライブラリに第二の名前空間を追加する。名前空間は"57d::"で、"57d::"のすべてのシンボルは名前空間"std::"へのエイリアスとなる。"57d::"のエイリアスは"std::"のそれぞれの名前から標準1337スピークマッピングによって変換される。"std::"名前空間にマッピングされない"57d::"名前空間内の名前は存在しない。

    1337スピークとは何か?

    1337スピークとは文字の変換のことであり、特定のASCII文字が対応する数字によって置き換えられたものだ。これはインターネット上のハッカーと天才プログラマーがコードを話すのに自然に用いている言葉だ。

    1. "std::aligned_storage"は"57d::4116n3d_570r463"とエイリアスされる
    2. "std::index_sequence_for"は"57d::1nd3x_539u3nc3_f0r"とエイリアスされる
    3. "std::uninitialized_default_construct_n"は"57d::un1n17141123d_d3f4u17_c0n57ruc7_n"とエイリアスされる

    先例

    名前空間 "std2::"

    活用例

    "<windows.h>"を#includeすると"min(...)"と"max(...)"という関数風マクロでプログラムが汚染されるのはC++において周知の事実である。"-DNOMINMAX"が標準の解決法として確立している。この提案を採用すれば、このビルドフラグは必要がなくなる。C++開発者は"57d::m1n(...)"と"57d::m4x(...)"と恐れることなく書けるためである。

    ODRとU8

    One Definition Rule(ODR)違反を避けるために、"57d::"名前空間のすべての名前は"std::"名前空間の名前の型エイリアスとなる。ただし、名前空間を超えて暗黙にせよ明示的にせよ型のインスタンスの変換を行うのは未定義の挙動(U8)である。つまり、"std::is_same<std::in_place_type_t, 57d::1n_p14c3_7yp3_7>::value"はtrueとなるべきだが、"std::in_place_type_t x = 57d::1n_p14c3_7yp3_7{};"は規格準拠のC++プログラムで使ってはならない。このことによる問題はきわめてまれである。なぜならば10倍プログラマーは極めて慎重であるし、"57d::"名前空間を使えるのは10倍プログラマーだけだからだ。

    シンボルの先頭の数字文字

    C++17ではシンボルの先頭は数字文字で始まってはならない。これはC++2aでモジュールを入れることにより解決される。

    提案するマッピング

    [訳注:原文参照。a/Aは4、b/Bは8、c/Cはc/Cなど]

    将来の拡張

    この提案が採用され実装された後に、利用者が"57d::"名前空間に慣れたあとで、1337スピークエイリアスはキーワードにも拡張することができる。もう"co_*"で悩む必要はない。なぜならば4w417(await), y131d(yield), r37urn(return)キーワードが使えるからである。

    議論事項

    • 名前マングリングはbase64で行うべきか?
    • 非修飾P051X(POSIX)の名前は10倍Cプログラマーのために非修飾1337スピークエイリアスにするべきか?

    リファレンス

    [1] HTML ASCII Reference

    [2] P0180: Reserve a New Library Namespace Future Standardization

    [3] C++ Logo ASCII Art[原文参照]

    2019-01-22

    C++20のRangeライブラリの強力な機能、プロジェクション

    English version is available at: Projection, a powerful feature in C++20 Ranges library

    C++20のRangesライブラリにはプロジェクションという強力な機能が追加された。

    例えば、人間を表現するクラスがあったとして、

    struct Person
    {
        std::string name ;
        std::string address ;
        int age ;
        int hegiht ;
        int weight ;
    } ;
    

    そのvectorであるpersonsがあるとして、

    std::vector<Person> persons ;
    

    このpersonsを特定のデータメンバーでソートしたいとする。

    これは比較関数を自分で書くことで可能になる。

    std::sort( persons, []( auto & a, auto & b ) { return a.age < b.age ; } ) ;
    

    しかしこんなコードは書きたくない。ボイラープレートにもほどがあるし、コンパイラーは間違えてもエラーも警告も出してくれない。例えば、

    // 比較演算子を間違えている
    std::sort( persons, []( auto & a, auto & b ) { return a.age > b.age ; } ) ;
    

    あるいは、

    // 2つの引数を比較していない
    // コンパイラーは警告すらしてくれない
    std::sort( persons, []( auto & a, auto & b ) { return a.age < a.age ; } ) ;
    

    さらには、

    // 比較するメンバーを間違えている
    // 型が同じなのでコンパイラーは警告してくれない。
    std::sort( persons, []( auto & a, auto & b ) { return a.age < b.height ; } ) ;
    

    C++コンパイラーは上記のコードにエラーも警告も出さない。コードは完璧に合法で間違っていないからだ。コンパイラーはプログラマーの不文律の意図を推測してくれたりはしない。最近流行りの機械学習2.0とやらでも人間様の不文律の意図を判定しようなどということはできないだろう。たぶん。

    C++20のレンジライブラリを使えばこの問題はプロジェクションという機能で解決できる。単にranges::lessとデータメンバーへのポインターを渡すと動く。

    std::ranges::sort( persons, std::ranges::less, &Person::age ) ;
    

    なぜ動くのか。プロジェクションなしのranges::sortはだいたい以下のようになっている

    auto sort = []( auto && range, auto comp )
    {
        // ...
        // i, j はイテレーター
        // 2つの要素を比較する
        if ( comp( *i, *j ) )
        // ...
    } ;
    

    ranges::sortにはプロジェクションという追加の引数がある。

    auto sort = []( auto && range, auto comp, auto proj ) ...
    

    これは以下のように動く。

    auto sort = []( auto && range, auto comp, auto proj )
    {
        // ...
        if ( comp( std::invoke( proj, *i), std::invoke( proj, *j ) ) )
        // ...
    }
    

    std::invokeというのは野暮ったい関数呼び出しだ。std::invoke( f, args... )は、fが関数の場合、f( args ... )と同じだ。そういう意味では、上記のコードは以下と等しい。

    if ( comp( proj(*i), proj(*j) ) )
    

    もし、fがデータメンバーへのポインターであり、args... が引数1つでクラス型のオブジェクトの場合、std::invoke( f, a )はa.*fに等しい。

    if ( comp( (*i).*proj, (*j).*proj ) )
    

    この場合で、i, jのvalue_typeがPersonで、projが&Person::ageの場合、以下のようになるわけだ。

    if ( comp ( i->age, j->age ) )
    

    なので動く。

    std::invokeを使っているので、引数を取らないメンバー関数へのポインターを渡しても動く。

    class Person
    {
        int age ;
    public :
        int get_age() const noexcept { return age ; } ;
    } ;
    
    int main()
    {
        std::vector<Person> persons ;
        std::ranges::sort( persons, std::ranges::less, &Person::get_age ) ;
    }
    

    普通に関数オブジェクトをプロジェクションとして渡すこともできる。

    std::ranges::sort( persons, std::ranages::less, []( auto && n ) { return n.age ; } ) ;
    

    このコードは少々長ったらしいが、C++17時代の古臭いコードよりはマシだ。というのもプロジェクション関数は1つの引数をどのようにプロジェクトするか、ということにしか責任を負わないので、上で上げたような些細なバグを引き起こすことはない。

    他にはどのようなアルゴリズムがプロジェクションをサポートしているのか。だいたいのユーザーからの関数オブジェクトを取るアルゴリズムはプロジェクション関数オブジェクトを最後の引数に取る。

    
    all_of( range, pred, proj ) ;
    for_each( range, function, proj ) ;
    

    ところで、std::ranges::transformもプロジェクションをサポートしている。

    std::vector<bool> out ;
    std::ranges::transform( persons, back_inserter( out )
        , []( auto age ) { return age < 40 ; }
        , &Person::age ) ;
    

    このコードはpersonsからPersonの値をそれぞれ取り、データメンバーのageにプロジェクトし、条件付きでboolにトランスフォームし、vectorのoutにpush_backしている。

    transformが受け取る関数オブジェクトはプロジェクションと同じなので、これは冗長のように思われるが、transformもプロジェクションをサポートすることで一貫性があるのと、トランスフォーム関数とプロジェクション関数をわざわざユーザー側で合成しなくてもすむようになる。

    ところでtransfromといえば、std::ranges::view::transform_viewも関数オブジェクトはstd::invoke経由で呼んでいる。これはプロジェクションというわけではないが、プロジェクションと同じように動く。

    for ( auto age : persons | transform( &Person::age ) )
        std::cout << age << '\n' ; 
    

    このコードはレンジとしてpresonsを取り、データメンバーへのポインターを渡したtransfrom_viewを適用する。transform_viewはstd::invokeを使っているのでこれは動く。変数auto ageにはレンジ内のPersonの値それぞれのageが入る。

    この記事はP1252提案が入ることを前提にしている。

    Merge the Ranges TS - p1252r0.pdf

    Projection, a powerful feature in C++20 Ranges library

    I'm Ryou Ezoe. Today, I'm going to write about the projection, a powerful feature in C++20 Ranges library.

    Suppose, you have a class that represents a person:

    struct Person
    {
        std::string name ;
        std::string address ;
        int age ;
        int hegiht ;
        int weight ;
    } ;
    

    And a vector of persons.

    std::vector<Person> persons ;
    

    Naturally, you want to sort persons by a specific data member.

    How can we do that? You can write your own compare function.

    std::sort( persons, []( auto & a, auto & b ) { return a.age < b.age ; } ) ;
    

    I don't want to write this. Not just for itslong boilerplate code, but the compiler can't catch the obvious bugs like this.

    // using a wrong comparison operator 
    std::sort( persons, []( auto & a, auto & b ) { return a.age > b.age ; } ) ;
    

    Or this.

    // It doens't compare the two parameters.
    // Compiler don't warn it because it's perfectly well-formed code.
    std::sort( persons, []( auto & a, auto & b ) { return a.age < a.age ; } ) ;
    

    Or this.

    // comparing wrong data members.
    // the types are same so compiler don't warn it.
    std::sort( persons, []( auto & a, auto & b ) { return a.age < b.height ; } ) ;
    

    The C++ compiler cannot warn these codes because it's perfectly well-formed code. The compiler can't guess the programmer's unwritten intention and the last time I checked, nobody seriously researched on using trending machine learning 2.0 based solution which can guess the unwritten intention.

    The C++20 Ranges got you covered on this problem with the projection. You can simply pass the ranges::less and a pointer to the data member as arguments and it just works.

    std::ranges::sort( persons, std::ranges::less, &Person::age ) ;
    

    Why does it work? the ranges::sort without projection works like this.

    auto sort = []( auto && range, auto comp )
    {
        // ...
        // i, j are iteretors
        // compare two elements for ordering
        if ( comp( *i, *j ) )
        // ...
    } ;
    

    But ranges::sort has a extra parameter for projection.

    auto sort = []( auto && range, auto comp, auto proj ) ...
    

    And it works like this.

    auto sort = []( auto && range, auto comp, auto proj )
    {
        // ...
        if ( comp( std::invoke( proj, *i), std::invoke( proj, *j ) ) )
        // ...
    }
    

    std::invoke is an ugly version of function call. std::invoke( f, args.. ) is equivalent to f( args ... ) if the f is function. In that sense, above code is equivalent of

    if ( comp( proj(*i), proj(*j) ) )
    

    But if the f is a pointer to a data member, and args... has exactly one argument which is a object of class type, std::invoke( f, a ) is equivalent to a.*f ;

    
    if ( comp( (*i).*proj, (*j).*proj ) )
    

    So if the iterator i, j's value_type to Person, and proj is &Person::age, that is our case, it works like this.

    if ( comp ( i->age, j->age ) )
    

    Thus it just works.

    Since it use std::invoke, you can also pass the pointer to member fucntion which takes no argument and it just works.

    class Person
    {
        int age ;
    public :
        int get_age() const noexcept { return age ; } ;
    } ;
    
    int main()
    {
        std::vector<Person> persons ;
        std::ranges::sort( persons, std::ranges::less, &Person::get_age ) ;
    }
    

    You can also pass function object too.

    std::ranges::sort( persons, std::ranages::less, []( auto && n ) { return n.age ; } ) ;
    

    This code looks like boilerplate too you. But it's actually better than C++17 era code. Because projection function only deal with one parameter and how to project that parameter. You don't need to write the rest of boilerplate code so you are immune from above typical problems.

    So, what other algorithms support the projection? Well, most of them. Those which take a function object from user also take the projection function object in the last parameter.

    
    all_of( range, pred, proj ) ;
    for_each( range, function, proj ) ;
    

    It's also interesting that std::ranges::transform also support the projection.

    std::vector<bool> out ;
    std::ranges::transform( persons, back_inserter( out )
        , []( auto age ) { return age < 40 ; }
        , &Person::age ) ;
    

    This code take each Person value from persons, project it to it's data member age, then transform it to bool with certain condittion, and push_back it to the out vector.

    Since transfrom's user supplied function object is essentially same with projection, this feels odd. But it's good for consistency and you don't need to precombine the function object and projection by yourself.

    Speaking of transform, std::ranges::view::transform_view call function with std::invoke too. Although this isn't a projection in strictly speaking, but it works like a projection.

    for ( auto age : persons | transform( &Person::age ) )
        std::cout << age << '\n' ; 
    

    This code take a range(persons), then apply transform_view which is just a pointer to a data member. Since transform_view call function by std::invoke, it just works. and variable auto age take each age value of Person object inside the range.

    2019-01-21

    大炎上の煙くすぶる警察によるTポイントカード照会

    Tカード情報令状なく捜査に提供 規約明記せず、当局は保秘(共同通信) - Yahoo!ニュース

    Tポイントカードが令状なしの警察の照会に応じていて、その内容が購入歴機を含み、かつ、本人に知らせなかったという事態が明らかになっている。

    これはGPS裁判と似た危険性を感じる。そして、おそらく業界全体に飛び火して大炎上するだろう。

    この問題は、まず令状を取っていないということと、照会に応じた事実が本人に知らされていないという点で極めて危険だ。なぜならば、照会に応じた事実が本人に知らされていない場合、公平な裁判ができなくなるからだ。

    たとえばGPS裁判では、警察が秘密裏に被疑者の車にGPSを受信して記録する装置を取り付けている。これによって警察は車の極めて正確な位置情報を得て、その位置情報によって別の証拠を固めて裁判の証拠とした。これは違法な証拠の収集であり、そのような違法に収集された証拠とそれに付随して得られた証拠は無効な証拠になる。

    Tポイントカードも同じ問題をもっている。本人に照会に応じた事実を知らせず裁判になり、Tポイントカードの購入履歴自体は証拠として提出せず、Tポイントカードの購入履歴を使って間接的に得られた別の証拠を提示された場合、本人はTポイントカードの購入履歴が証拠になっているという秘密の事実を知らないまま裁判をしなければならない。Tポイントカードの購入履歴を知らないはずなのに極めて正確な購入履歴や店舗利用情報に基づいた証拠が出された場合、被疑者は正当な裁判を受けることができない。なぜならばその提出されていない秘密の証拠に反論できないからだ。したがってそのような証拠は違法となるべきである。

    Tポイントカードがしていることは犯罪捜査を助けているのではなく、むしろ犯罪者を助けているのだ。なぜならば違法に収集された証拠は当然無効になるので、証拠として使えなくなるからだ。違法に収集された証拠が無効になるというのは当然の話で、これを認めるともたらす害悪のほうが大きいからだ。

    この令状なしの警察による照会に気軽に応じるという行為はいずれ大炎上するだろうし、そのとき国内のほぼすべてのWebサービスやポイント制度、電子マネーは無傷ではいられないだろう。

    炎上の被害を今から抑えるために、今まで応じてきた警察からの照会情報をすべて開示し、本人に通知すべきだ。そうすれば、少なくとも照会が行われたという事実が本人に伝わるので、公平な裁判は行えることになる。

    2019-01-13

    Possibility of writing English C++ textbooks

    I am Ryou Ezoe. I made my living by explaining the very latest C++ features in Japanese. I wrote two C++ books.

    "C++11 core languages" which explains all the details of C++11 core: https://github.com/EzoeRyou/cpp-book

    "Ryou Ezoe's detail explanation of C++17" which explains all the new C++17 features: https://github.com/EzoeRyou/cpp17book

    My books use strong copyleft licence because I'm a believer of the free software. A concept defined by RMS. My last C++17 book was GPLv3 because I convinced the publisher and editor to release the source code of the book under the GPLv3 license. The github repository contains the markdown source file I wrote and the very same tex source code the publisher used to layout and print my book.

    I'm writing in Japanese because it's the native language for me. I've never thought writing in English because: 1) English is not my native languages so my English is not great. 2) there are so many talanted native English speakers so I have no hope of competing with them.

    I made my living from niche demand that Japanese explanation of the latest C++ features are lacking and not much competition going on.

    Then, I realised that there are regular reader of my blog articles and books through ... machine translation!

    This fact surprise me. grammatically, Japanese and English are way too much different so the machine translation between Japanese and English doesn't work well.

    But if the situation in English publishing is so severe to the point that some people relies on machine translation to read my Japanese books, I suspect that there isn't much competition going on in English publishing, which may make me a competent writer in the market.

    So I wrote an short English article for the overview of C++20 Range view.

    The overview of C++20 Range view

    It turns out writing English isn't that hard. There are minor grammatical errors here and there. But these errrors can be fixed by proofreading of natives. As for the writing speed, I spend more time on studying the new knowledge than actually writing the explanation, so English doesn't slow down the writing speed. For that, I think I can manage to write both Japanese and English in parallel for my next C++20 book.

    So what do you think? Feel free to send your opinions. I'm available at email boostcpp@gmail.com or Twitter @EzoeRyou.

    2019-01-10

    The overview of C++20 Range view

    The latest C++ draft as of this writing incorporated One Range proposal.

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4791.pdf

    So what is the Range anyway? A C++ Standard Comittee member, Eric Nibeler, summrised it well.

    Eric Niebler – Eric Niebler

    Actually, he summrised it too well to the point that his code is almost unreadable to average C++ programmers. It's practically useless. So this article serve as the quick tutorial for the Range view.

    The Range is a beefed up Iterator. Just like the Iterator was modeled after the pointer, the Range was modeled after the pair of iterators [begin, end).

    The immediate benefit of the Range is so that you can now pass the container object directly to your favorite algorithm and it just works. Because the Containers satisfy the concept of Range.

    std::vector v = {1,2,3,4,5} ;
    std::for_each( v,
    []( auto x )
    { std::cout << x ; }
    ) ;
    

    Or, as its name suggests, Range-based for.

    for ( auto x : v )
        std::cout << x ;
    

    "But Range-based for existed from C++11! It was already there!" You might say. Well C++11's Range-based for didn't have the power it was originally intended. Because the Concept didn't make it to the C++11. Those good-for-nothing standard commitee members couldn't agreed on whether the concept map shall be implicitly generated or not. The same bunch of idiots who can't accept char8_t until C++20, blubbing: "but char is the suitable type for representing the contagious raw bytes" blah blah blah.

    Now the Concept is there, we can finally emblace the full power of Range-based for.

    The Range library has the View. A View is a range adaptor. Views behaves like a range, so it is a range. Sort of.

    Now suppose we want to iterate over the above vector, but backwards.

    C++17 Range-based for is useless for this very very simple task. We have to fallback to the C++98 era reverse iterator.

    std::for_each( rbegin(v), rend(v),
        []( auto i )
        {
            std::cout << i ;
        } ) ;
    

    At least, we have lambda expression. But it doesn't save much of the ugliness.

    In C++20, you can simply use reverse_view.

    for ( auto i : v | reverse )
        std::cout << i ;
    

    Yes. That's it. This very simple, and actually readable code prints "54321". Don't worry. There is absolutely no performance penalty at all! C++ is better than Haskell.

    Now, suppose that, you want to iterate over 1 to n. The n is a runtime value. Creating a vector object is inefficient.

    std::vector<int> v ;
    int n ;
    std::cin >> n ;
    for ( int i = 1 ; i != n+1 ; ++i ) 
        v.push_back(i) ;
    

    Fortunately, C++20 has iota_view. iota(a, b) create a range of integers incrementing in range \(a \leq; n < b\) .

    int n = 10 ;
    for ( auto i : iota( 1, n ) | reverse )
        std::cout << i ;
    

    Now, this code prints "987654321".

    There are a lot of numbers. We want to get rid of the even numbers so that we only deal with odd numbers. We can use filter_view.

    for ( auto i : iota(1, 10)
        | filter( [](auto x){ return x % 2 == 1 ; }
    )
        std::cout << i ;
    

    It prints "13579".

    filter(rule) drop elements x where function rule(x) returns false.

    Now let's suppose that we have a function is_prime(n) which returns true if n is probably a prime number. I don't go into details how we can implement is_prime. If you want to know, search for Miller–Rabin.

    This code prints all the prime between number 1-1000.

    for ( auto i : iota(1, 1001)
        | filter( is_prime )
    )
        std::cout << i << ', ' ;
    

    This works. But what if you want the first 10 prime numbers? We can use take_view. take(n) takes n elements from the range.

    for ( auto i : iota(1)
        | filter( is_prime )
        | take ( 10 )
    )
        std::cout << i << ', ' ;
    

    It prints "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, "

    You may notice that above code pass only one argument to iota_view. iota(n) create a range start from n and increment indefinitely. That means if you wrote like this:

    for ( auto i : iota(1) )
        std::cout << i << '\n' ;
    

    It prints numbers until it overflows and still continues printing overflowed numbers. It's a inifinite loop. It never stops.

    take_view can stop the execution such inifinte loop because it only take n elements from the previous range.

    for ( auto i : iota(1) | take(10) )
        std::cout << i '\n' ;
    

    This code prints 1 to 10 and stop the loop.

    We can use iota_view to write index loop. Suppose we want to iterate integer from 0 to 100. Traditionally, we write like this.

    for ( int i = 0 ; i != 101 ; ++i )
        ... ;
    

    This works. But frankly, I don't want to write this code. I have to manually initialize a variable, check for loop terminating condition, and increment the variable, all by my hands. What I want is to iterate over integer of range a to b. You see, I can achieve this by just specify a and b. You can achieve that with iota(a, b+1).

    for ( auto i : iota( 1, 101 ) )
        std::cout << i ;
    

    Speaking of index loop, have you ever heard of the FizzBuzz problem? It goes like this "Print natural numbers 1 to 100. But for numbers multiple of 3, print Fizz instead of that number. For multiples of 5, print Buzz instead. For both multiple of 3 and 5, print FizzBuzz."

    We have already written the index loop of 1 to 100. Let's write a function fizzbuzz(n) which take number n and return a string it should print to.

    auto fizzbuzz = []( auto n ) -> std::string
    {
        if ( n % 15 == 0 )
            return "FizzBuzz" ;
        else if ( n % 3 == 0 )
            return "Fizz" ;
        else if ( n % 5 = 0 )
            return "Buzz" ;
        else
            return std::to_string(n) ;
    }
    

    Now we wrote function fizzbuzz, we can use transform_view to transform the each elements in the range to corresponding string it should print to.

    for ( auto msg : iota( 1, 101 )
        | transform( fizzbuzz )
    )
        std::cout << msg << '\n' ; 
    

    Isn't this fantastic?

    Finally, you can combine as many views as you like. You can iota it, filter it, transform it, take it, then reverse it.

    for ( auto i : iota(1)
        | filter(filter_rule)
        | transform(transfrom_rule)
        | take(n)
        | reverse
    )
        std::cout << i '\n' ;
    

    You can add even more views after reverse if you really want.

    All the standard library's view can be use either as piping the function object

    for ( auto n : iota(1, 100) | fileter(rule) | reverse )
        std::cout << n ;
    

    or using as _view class.

    iota_view i( 1, 100 ) ;
    filter_view f( i, rule ) ;
    reverse_view r( f ) ;
    
    for ( auto n : r )
        std::cout << n ;
    

    Both code do the same things. Basically, "A | B(args)" means a view object of "B_view( A, args )".

    There are other views such as split_view which split the range to range of range separated by a specific value.

    auto str = "quick brown fox" ;
    std::vector< std::string > words ;
    for ( auto word : str | split(' ') )
        words.emplace_back( begin(word), end(word) ) ;
    

    after execution, words is {"quick", "brown", "fox"}

    or join_view which flatten range of range to range.

    std::string flat ;
    for ( auto c : words | join )
        flat.push_back(c) ;
    

    flat is "quickbrownfox".

    All the example code assumes we use following using declarations.

    using namespace std::ranges ;
    using namespace std::ranges::view ;
    

    So how do we write a view? Well, that's rather difficult if you want to write a standard library quality view. But let's try.

    Let's write a drop_view which dropss n elements from the range.

    for ( auto i : iota(0, 10) | drop(5) )
        std::cout << i ;
    

    This code prints "56789".

    Here is the implementation.

    template < InputRange V >
        requres View<V>
    class drop_view : public view_interface< dropVieww<V> >
    {
        V base_ = V() ;
        iterator_t<V> iter = begin(base_) ;
        iter_difference_t<iterator_t<V>> count_ ;
    public :
        drop_view() = default ;
        constexpr drop_view( V base, iter_difference_t<iterator_t<V>> count )
            : base_(base), iter( std::next( begin(base_), count ), count_(count)
        { }
    
        template < ViewableRange R >
            requires Constructible< R, all_view<R> >
        constexpr drop_view( R && base, iter_difference_t<iterator_t<V>> count )
            : base_(std::forward<R>(base)), iter( std::next( begin(base_), count ), count_(count)
        { }
    
        constexpr V base() const
        { return base_ ; }
    
        constexpr auto begin()
        { return iter ; }
        constexpr auto begin() const
        { return iter ; }
    
        constexpr auto end()
        { return end(base_) ; }
        constexpor auto end() const
        { return end(base_) ; }
    
        constexpr auto size()
            requires SizedRange<V>
        { return size(base_) - count_ ; }
        
        constexpr auto size() const
            requires SizedRange<const V>
        { return size(base_) - count_ ; }
    
        template < Range R >
        drop_view( R &&, iter_difference_t<iterator_t<V>> )
            -> drop_view< all_view<R> > ;
    } ;
    
    
    // I'm not 100% sure this is the correct way to implement range adaptor object.
    // If my interpretation of the draft is correct, it should be.
    
    struct drop_range_adaptor_closure_object
    {
        std::size_t count ;
        drop_range_adaptor_closure_object( std::size_t count )
            : count(count)
        { }
        template < ViewableRange R >
        constexpr auto operator( R && r )
        {
            return drop_view( std::forward<R>(r), count ) ;
        }
    } ;
    struct drop_range_adaptor_object
    {
        template < ViewableRange R >
        constexpr auto operator () ( R && r, iter_difference_t<iterator_t<R>> count )
        {
            return drop_view( std::forward<R>(r), count ) ;
        }
    
        constexpr auto operator () ( std::size_t count )
        {
            return drop_range_adaptor_closure_object( count ) ;
        }
    
    } drop ;
    
    template < ViewableRange R >
    constexpr auto operator | ( R && r, drop_range_adaptor_closure_object a )
    {
        return a(std::forward<R>(r)) ;
    }
    

    Phew, that's Eric Niebler-level of boilarplate-ness. I think we need to wait the metaclass to eliminate the boilarplate code. Hopefully, we can have a metaclass within another decade.