本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

Boost勉強会 #15 札幌に参加した

Boost.勉強会 #15 札幌が、下記のとおり行われた。

Boost.勉強会 #15 札幌 - boostjp

Boost.勉強会 #15 札幌 : ATND

5月22日

「あたし、ガールズバーのホームページ作ってるんだよね」と、三十路過ぎの女が言った。「とにかく、可愛い女の子がいっぱいいますってことにしなくちゃいけなくて、本当大変」

「悲惨だな」と筆者は答えた。悲惨としか言いようがない。「そもそも、何故人と話すのに金を払わねばならないのだ。今、私がここでお前に金を払って、会話してくれと頼むのは、おかしいだろう」

「でも、あたしみたいな三十路過ぎの女じゃなくて、二十代だし」

謎だ。筆者には、女の魅力というものを、世間一般が評価するように、正しく評価できない。人の魅力の評価というのは、筆者に欠如した能力であるらしいのだ。この三十路過ぎの女は、その年齢と、そして鍛えていない肥満した体躯から考えれば、世間一般には、魅力のない方に分類されるのであろう。しかし、誰だって20年もたてば、魅力のないオッサン、オバハンに成り下がるのだ。ことに、体を鍛えていない人間の、加齢による魅力の低下は悲惨だ。ガールズバーで働いているような女は、真面目に体を鍛えていないであろうし、不健康、不衛生な生活習慣であることが多いであろうから[要出典]、10年後は、目の前にいるような肥満した三十路女に成り下がるのであろう。

そもそも、なぜ会話するのに金を払わなければならないのか。なるほど、もし相手が医者であるとか弁護士であるとか、何らかの専門知識を持っていて、その専門知識を元に判断を下してもらいたいときは、金を払うのは道理だ。しかし、筆者の聞くガールズバーというところは、そういう専門知識を乞う場所ではない。

相当に有能な話し手、あるいは話の聞き手であれば、金を払う価値があるかも知れぬ。

筆者は、並み居る聴衆を相手に、昼寝をさせずに何時間も講演ができる人物に会ったことがある。話の内容は、無価値である。本当に何の価値もない話である。そんな無価値な話だけで、何時間も聴衆を飽きさせずに話ができる人間なのだ。講演の最中、筆者は講演者に対して恐怖を覚えた。この能力を使えば、詐欺師や宗教開祖になれるであろう。

有能な話の聞き手にも、筆者は会ったことがある。適切な頷きや相槌、次の話題を促すための答えやすい狭い質問。このような人物と話すと、自分が極めて有能な話し手になったかのように錯覚する。有能な話の聞き手も、また危険な人間である。

なるほど、能力を年齢から判断するべきではない。経験は当てにならぬ。しかし、若い女ばかりの偏った集団に、そのような有能な、金を払う価値のあるほどの会話の達人ばかりがいるというのは、どうにも考えにくい話だ。

単に人と世間話がしたければ、話せばいいのだ。そこに金銭が介在する必要はない。

「でもねー、江添さん、世の中江添さんみたいな強い人間ばかりじゃないんだよ。お金を払わないと女の子とお話できない寂しい四十代、五十代のオジサン達がいるんだよ」

これはかつて、ガールズバーで働いているある若い女に対して、その存在意義を問うた時、返ってきた答えだ。筆者は金を払ってこの女と会話したのではない。この女は、およそ、若いことと、肥満していない体型と、服装と、化粧により、世間一般的には女としての魅力があるであろうこと以外には、なんの価値も持たぬつまらない人間であった。その価値は単に若いことによって生じているのであって、十年後には価値が極端に下がっていることだろう。悲惨であるが、本人が自らの意思でその境遇に身を置いている以上、どうすることもできぬ。自ら意思を示さぬものは、助けようがない。まあ、意思を示したとしても、筆者にできることはあまりない。悲惨だ。

「いや、本当うちの店は悲惨だよ。コンビニで一本千円ぐらいで売ってる黒霧島とかが、一本一万とかするんだ。コンビニで売ってるポテトチップスとかが、皿にほんのわずかに入って何千円もするんだ。それで、お会計が5万ぐらいになって、そっとお会計を伏せて、申し訳なさそうに持って行って、払ってもらうんだが、なんとこのオッサン、財布に一万円札がぎっしりなんだよ。軽く50万はあった。うわ、このオッサン、持ってるわ。で、このオッサン、一晩5万は必ず使うんだが、それで毎晩うちに来るんだぜ」

昔、ガールズバーで店員として働いていた男から聞いた話だ。金はあるところにはあるようだが、使い方が人として間違っている。

しかし、ガールズバーで働く人間は、その性格上、あまり貯蓄しない。何らかの方法で散財してしまう。したがって、こうして市場に出た金は、すぐに右から左へと流れていく。金は死蔵していては価値がない。動かなければ価値がない。したがって、ガールズバーのような、倫理的に悲惨な、人として間違っているはずの商売は、経済的には最高の存在であることになる。

一体、これは何なのだ。なぜ、明らかに間違っているはずのことが、結果的に、最良の結果を出しているのは、いったいどういうことだ。天地の間には、汝の所謂哲学では予想だにしないことがあるのだ。

筆者は考えることをやめた。明日は北海道に飛ばなければならないのだ。そう、明日は札幌でBoost勉強会なのだ。

筆者がBoost勉強会 #15 札幌に参加するに至った経緯

ドワンゴに入社した直後、@ignis_fatuusからtweetが来た

@EzoeRyou ご就職おめでとうございます。札幌でBoost勉強会を5月頃にやろうかという話があるのでぜひC++の啓蒙のためにお越しください。

— いぐにすさん @πλασμα (@ignis_fatuus) February 13, 2014

札幌、北海道か。まあ、5月ともなれば給料も出ているだろうし、旅費はあるだろう。

しかし、C++の啓蒙ならば、仕事のうちではないか。

江添「Boost勉強会行きたいんですけど旅費だして」
上司「じゃあ、出張ってことで」
上司「航空券とホテル、手配しといたよ」

名目はドワンゴのC++に対する取り組みを社外に宣伝し、もってドワンゴがC++エンジニアを求めていることを知らしめるためとなった。かくして、筆者はBoost勉強会に参加するために、北海道に飛ぶことになった。

5月23日

さて、Boost勉強会#15札幌は、午前11時という早朝(ドワンゴ基準)から行われるため、前日に現地入りすることにした。東京から北海道へ移動するには、飛行機が最も適切である。列車では、一日がかりな上に、値段も飛行機より高い。ところで、筆者は、今まで飛行機に乗ったことはない。一度も体験したことがないことというのは、緊張する。まあ、何にでも初めてはあるということだ。

どこかの誰かのように、飛行機を乗り過ごす失態をしてはならぬ。筆者は離陸の4時間前に家を出て、三時間前に羽田空港に到着した。

はじめての飛行機は、特に、どうということもなかった。ただし、飛行機ほどの質量を持つ物体が、離陸に際して急激に加速するのには興奮した。飛行機の中で、筆者はカサノヴァ回顧録を読んだ。カサノヴァは、真に自由人として生きた男である。世上には、その女性遍歴が有名であるが、カサノヴァの価値はそこだけではない。実に才気あふれる方法で、幾度も窮地を乗り越えた本物の自由人である。

さて、二時間ほどで、飛行機は無事に、新千歳空港に着陸した。空港から札幌駅まで、電車で一時間、運賃は1070円である。高い。

さて、札幌駅に着いた筆者は、まず明日の勉強会の会場となる北海道大学まで歩いて位置を確認し、しかる後に、今日の宿に向かった。宿はホテル京阪札幌で、部屋には無線LAN、有線LANがあり、快適であった。ただし、筆者の考える本当の面白さは得られない宿であった。筆者は、しっかりとした予定をたてて、そして予定通りの物事が運ぶのを嫌う。それでは面白くない。もし、計画が計画通りに進んだとしたら、それは計画が素晴らしかったということであり、実行は、単なる計画の実証に過ぎない。事前に予期していない状況こそが面白い。もっとも、明日は確実に勉強会に出席しなければならないし、一日集中するために十分な睡眠が必要であることを考えると、今回は冒険できぬ。

冒険は出来ぬと書いたが、まだ午後5時頃である。腹が減っているのを幸い、夕食を認めるために、どこか適当な食べ物店に入るとしよう。どこかうまい店に入るか。あるいは、足のおもむくままにどこかの店に入るか。いずれにしても、日本全国どこにでもあるような系列店はやめておこう。

筆者は、普段は外食をしない。外で食事をする必要に迫られた時も、全国展開しているような店に入る。なぜならば、結局、タバコを吸う忌々しきニコチン中毒者どもを避けて、飲食店の唯一の正しいありかたである禁煙の店を選ぶには、遺憾ながら、全国展開している店を選ぶのが、最も手軽だからだ。そのような飲食店は、完全に平均化されていて、面白さは一切ないが、タバコの害から逃れるためには、致し方ない。

Twitter上で、札幌駅周辺の飲食店のおすすめがないものかどうかつぶやいたところ、地下鉄ですすきのまで行って、だるま本店でジンギスカンを食べるといいという。あるいは、寿司か、ラーメン横丁か。いずれにせよ、すすきのまで出て行くのがおすすめだという。

筆者は歳のためか、あまり肉を好まなくなってしまっている。ただ、せっかく北海道にいるのだし、推奨されたことでもあるので、この機会に、羊肉を食べてみようと思う。

さて、地図で確認すると、札幌駅からすすきのまで、わずかに1.4kmである。この距離は、歩いていける距離である。どうせ今日は寝るだけなので、時間に余裕はある。歩いて行くことにした。

さて、ほどなくすすきのについて、だるま本店に入った。幸い、空いていたし、タバコを吸うろくでなしどもはいなかった。

問題は、ジンギスカン自体が煙たいということだ。狭い店内のカウンターにジンギスカン用の鍋が所狭しと設置され、排気設備は貧弱すぎる。羊肉はまずくはなかったが、筆者としては、ネギのほうがうまかった。年を取ったものだ。

一切おかわりせずにだるま本店を辞した筆者は、次に寿司屋に向かった。聞説、よい寿司は回っていないらしい。筆者の入った寿司屋の寿司は止まって見えた。しかし、だからといって、特にうまいとは思わなかった。まあ、うまいというのは相対的なものだ。筆者がこれまでに体験し得たうまい寿司屋と比べると、大したことはなかった。

寿司はそれほどうまくもなかったが、ひれ酒が飲めたので、よしとした。ひれ酒は筆者の大好物である。日本酒は、あまり真面目に作っている酒蔵がすくなく、ひれ酒のようにして飲まなければ、飲めたものではない。

すすきのは、歓楽街として有名である。聞説、不思議な三助のいる特殊な浴場があるという。もうひとつの肉というわけだ。何も言うまい。ガールズバーより、なお悲惨だ。

宿に戻って午後9時に就寝した。筆者は早寝早起きなのだ。

5月24日

午前5時に起きた筆者は、身支度を済ませ、朝食を認めてから、会場となる北海道大学、クラーク会館に向かった。

Boost.勉強会 #15 札幌 - boostjp

高橋晶による、「マルチパラダイムデザイン – 再利用性の高いアプリケーションの設計」

この発表は、筆者の印象にまったく残らなかった。何やらコンサルの話しそうなことを話していた気がする。

西山 信行 (5mingame2)による、「iPhoneアプリ『ういろう』のboost以外成分」

この発表者と申すは、お立ち会いの中にご存知の方もござりましょうが、不自由なiPhone用の不自由なゲーム、「ういろう」の開発者にござる。ギターを抱えて登壇し、「聖地サッポロー」と叫びつつ、始終浮かれて発表ありし故、さだめて由あるべしと不審あり。

さてこのゲーム、テキストを画面外からささっと動かして、所定の位置に配置すれども、テキストの移動速度が線形なる時は、あまりにも無味乾燥として興ざめなればとて、ai/easings.netなるライブラリを用いて、非線形にふわっと動かすことこれあり。いや、細かいようなれども、かかる配慮のあるときは、人の目は楽しむものなり。

また、一枚絵をういろうのごとくぷよ感をだして振るわせるための計算に、バネの減衰運動の数式を用いているよし、承り候。さては、ギターをかきならせしは、さだめて弦の振動との関連なるべし。

なお、札幌が聖地なる故は、かのボーカロイドの販売買社、クリプトン・フューチャー・メディアの本社が札幌にあるためなりとす。

ほっと (hotwatermorning)による、「C++ Windows GUI ライブラリ「balor」の紹介」

不自由なWindowsのWin32 APIのみを考えた移植の難しい薄いGUIラッパー。読者は使うべきではない。以上。

でちまるさん(実際かわいい) (decimalbloat)による、「二分探索法」

忌まわしき太古の技術であるCプリプロセッサーを用いたプリプロセス時プログラミング技法の実装方法の紹介。

Cプリプロセッサーは、トークン列に対する置換のためのマクロであり、プログラミング言語ではない。たとえば、再帰をサポートしていない。Cプリプロセッサーメタプログラミングでは、実用的な回数のループを実現するために、大量のマクロを定義して、文字列連結した結果をさらにマクロ展開させることにより、ループのようなものを実現している。その時、手動展開されたバイナリサーチを用いて、目的のマクロに一致させているという。そういう技法を紹介する発表であった。

これはぜひとも、いずれドワンゴでも勉強会を開いて、発表してもらわねばなるまい。

にゃははー (Flast_RO)による、「オーブンレンジ2014夏モデル」

この発表における筆者の関心ごとは、lambda-captureを持たないlambda式から生成されたクロージャーオブジェクトは、default-constructibleでもcopy-assignableでもないということだ。なぜこのような制約があるのだろうか。すでに、そのようなクロージャーオブジェクトは、関数ポインターへの変換関数を提供している。

template < typename Func >
void f( Func func )
{
    Func f ; // default construct
    f = func ; // copy assignment
    f() ;
}

int main()
{
    auto a = [](){ } ; // closure object
    void (*b)() = a ; // function pointer
    f( a ) ; // Error
    f( b ) ; // OK
}

上記の例で分かるように、キャプチャーしないラムダ式のクロージャーオブジェクトは、default constructibleかつcopy assignableであってもいいように思われる。なぜこのような無意味な制約があるのか。

当時の議論を思い返しても、このような制約が着いた理由は思い当たらない。ただ、関数ポインターへの変換関数は、C++11規格制定の直前になって認められた機能であるので、特に強い制限緩和要求がなかった以上、そのまま捨て置かれたのではなかろうか。

将来的に制限緩和できるかも知れないが、どうだろうか。

池田公平 (hgodai)による「vectorの逆襲」

vectorは遅い。遅い理由は、C++のアロケーターがreallocをサポートしていないためである。ストレージ領域をそのまま引き伸ばせる状況では、コピーを回避することができる。reallocが必要だ。そのために、Boostのvectorやアロケーターでは、reallocに対応した設計と実装を行っているという。

江添亮 (EzoeRyou)による、「スタックからのメモリ確保の標準化

実にいい並び順で、筆者の番になったものだ。前野発表は、ヒープからのメモリ確保のrealloc、これは、スタックからの動的なメモリ確保のreallocである。

極めて短時間だけメモリを確保したい場合、スタックからメモリを確保するのは、様々な利点がある。問題は、スタックから動的にメモリを確保するのは、今のC++では難しい。Cから受け継いだallocaは昔からあるが、型安全ではない。

C++14には、実行時サイズ配列と、std::dynarrayが入る予定であった。しかし、色々と問題が会ったため、スイスのNBコメントにより、TSに移動した。

この巻き添えで、std::optionalもTS行きになった。筆者はコア言語が専門であり、ライブラリの事情はあまり追っていない。幸い、ライブラリに詳しい高橋晶氏がその場にいたため、std::optionalの問題を聞いてみた。問題は、標準化委員会内で、比較関数の実装方法の合意が取れなかったためだという。なるほど、標準化委員会内で合意の取れないような機能は、野に解き放ってはいけないのだ。標準化委員ですら納得させられずに意見の分断を引き起こすような機能は、一般のC++ユーザーにとって、極めて使いづらい難解な機能になる。exportしかり、コンセプトしかり。賢明な判断だ。

実行時サイズ配列の問題は、クラスによるabstractionができないということだ。また、クラスのデータメンバーに実行時サイズ配列を認める提案を採択したとしても、そのクラスは自動ストレージ上にしか構築できない制約を受ける。これは、C++では、型はどのようなストレージ上にも構築できるという大前提を崩壊させる、例外的なルールを導入することになる。

std::dynarrayはスタックから確保できない文脈では、自動的に動的ストレージからの確保にフォールバックする。これは、ほとんどのC++ユーザーが求めている挙動ではない。それに、C++では、デストラクターを明示的に呼び出して、生のストレージ上にオブジェクトを構築できる。std::dynarrayでは、スタックから確保するという特性上、これができない。これも、C++の大前提を崩壊させる。

この問題を解決するには、ネストしたスタックからのストレージ確保方法を、標準化しなければならない。これはまだ、具体的な提案はなされていない。まだまだ議論しなければならない状況だ。

そして最後に、ドワンゴの宣伝を行った。

筆者が勉強会に参加し、何かC++について発表するということは、ドワンゴのC++に対する取り組みを宣伝するよい方法である。ただ愚直に、「ドワンゴは優秀なエンジニアを求人中です」などと叫ぶより、よほど効果的であるはずだ。

そのため、もし各地で開かれる勉強会で、筆者がC++について何か発表して欲しい場合、呼んでもらえれば、宣伝として行くことができる。ぜひ呼んでもらいたい。

また、筆者は常々、ドワンゴは本物のC++プログラマーを募集しているが、「本物」の定義を教えてもらいたいという質問が出た。「本物」という語は、「本物のプログラマーはPascalを使わない」という、有名な文章のタイトルから来ている。

人の能力の評価は難しいが、すでにドワンゴで働いているC++プログラマーについて書いておこう。ドワンゴ社員のC++プログラマーは、仕事でC++を書くにあたって、筆者を必要としない。

これは当然の話だ。一般的なプログラマーが、C++を書くにあたって、規格の詳細な知識を求められるとしたら、それは規格の敗北である。多くのプログラマは言語を表面的な理解だけで使っている。それでいいのだ。

それにドワンゴ社員は、必要であれば、C++規格書や提案論文ぐらい読める。彼らが普段読まないのは、純粋な規格の文面解釈と格闘するよりも、具体的に動くコードを相手に格闘したいからだ。筆者は、今C++に提案されている新機能について、社内の現場のエンジニアの意見を求めるために、紹介している。しかし、筆者の紹介する提案は、何の変更もなく今の提案のまま採択されたとしても、正式に規格として発行され、主要なコンパイラーで実装され、現場で使えるのは、早くて10年後というものばかりだ。今の仕事には役に立たない。もちろん、技術者は常に学び続けなければならぬとはいえ、筆者の紹介する機能は、あまりにも遠い未来の話だ。表面的な理解であれば、実際に使えるようになってから学んでも遅くはない。プログラミングを学ぶ方法がわからないと書いたのは、自ら学べなければ、本物のプログラマーとはなれないからである。

そして、筆者は規格と格闘して、現実の問題に対処する、泥臭くも動くコードは書いていない。筆者は本物のC++プログラマーとは名乗れないであろう。この事実は筆者の自尊心を傷つける。しかし、誰かが規格を解釈して、日本語で解説しなければならないにもかかわらず、誰もやっていない。皆、動くコードが書きたいとみえる。当然だ。誰もやっていない以上、幸いに文章読解に快感を覚える筆者のような本物ではないC++プログラマーがやるしかないのだ。

懇親会

今回の勉強会では、様々な分野の人間と話をした。特に、ういろう作者の西山氏は、専門学校の講師でもあるらしく、これはいい機会と、プログラミングを学ぶ方法がわからないで提示した、プログラミング以前の基礎的なコンピューターの操作方法から教えてもらいたい初学者の存在問題について聞いてみた。

西山氏は、この違和感を質問者本人に納得させるため、以下のたとえを使っているという。

「ディズニーランドへの行き方を他人に聞くか? お前がどこに住んでいるかによって、行き方は異なるではないか。お前の状況によって異なる答えを、なぜ他人に聞くのだ。電車の乗り換えは、今は便利な検索サービスが存在する。なぜ自分で探さないのか」

この諭し方により、ハッとする人もいたという。

技術以外の話もした。

ドワンゴに入社する前、筆者に対して、「カネは人を自由にする」と主張した男がいた。曰く、「金は選択肢を増やし、自由度を高める」と。

筆者はこの意見に反対の立場である。カネは単に利便性を上げるだけで、自由とは違うのだ。選択肢が増えたからと言って、自由であるとは限らない。カネがあると物事がやりやすくなるだけだ。この勉強会に参加できるのも、つまりは利便性の向上だ。自由と利便性を混同してはならない。

この勉強会には、四十路を超えてなお現役でコードを書いている本物の男がいた。酒の席で、四十路男は、妻子を持っているために若い時ほどプログラミングに自分の時間を避けないことを語っていた。しかし、四十路男の顔には後悔の表情は見られなかった。自分の子供は猫よりも可愛いこと、自分は結婚などしないと心に決めていても、どうしても離れられない大切な人は現れるものだということを、この四十路男は語っていた。いずれも、筆者の理解の範疇を超える話であった。

なぜ、このような話が身の回りに起こるのであろうか。結局、筆者とても、いつの間にか、いい年齢に達しているためであろうか。そして、もし身を固めるのであれば、そろそろ身を固めておかなければ、統計的に取り返しのつかない年齢に近づきつつあることも事実だ。

はて、統計的には、歳を取るほど結婚は難しくなる事実はありながら、理論的には、違和感がある。というのも、三十すぎのオッサンやオバハンが、二十歳の青年や小娘と結婚すると、周囲からは奇異の目で見られるであろうが、五十歳と四十歳の結婚は、特に周囲から奇異の目で見られない。しかし、年齢差は、どちらも10年である。つまり、歳を取るほど、交際可能な年齢幅が広がり、交際可能人数も増えるのだ。

xkcd: Dating Pools

女「ああ、やだやだ。初婚年齢の中央値は26よ。独身は減っていくばかり。もう時間がないわ」
男「いや、実際のとこは違うね」

男「確かに、年齢の高い独身者はより希少ではある。しかし、歳を取るにつれ、交際可能な年齢幅は広くなる。18歳の年齢幅は16歳から22歳であるが、30歳の年齢幅は22歳から46歳ぐらいだろう」
男「標準奇異ルール:デートする年齢下限\(\left(\frac{AGE}{2} + 7\right)\)」

男「先週、ちょうど国勢調査の数字に対して解析したところなんだ。交際可能人数は、実際には中年まで増えていくんだよ。だから、そう、気をやむことはないよ!」

女「あなたの解析とやらは、週末をグラフ作って過ごす人の交際見込みについては、何か分かるの?」
男「おいおい、よしてくれよ。ベル・カーブの端っこには、僕に合う女の子だっているはずさ」

「ベル・カーブの端っこには、僕に合う女の子だっているはずさ」というセリフは、オタクぶるために使える便利なセリフだ。

筆者のような人間には、平均から相当離れた端の端を探さなければならないだろう。探す気が出ればの話だが。

さて、懇親会はすでに三次会となり、場所をカラオケ屋に移動した。筆者は、カラオケの喧騒が苦手であるし、なにより、部屋がタバコ臭いし、眠くもあるので、途中で辞して、宿に帰った。

5月25日

飛行機で帰宅した。おみやげに定番の白い恋人、白いバウムを買った。また、イカの塩辛、松前漬け、鮭のルイベ漬け(鮭とイクラの醤油漬け)、ジンギスカン用の味付きの羊肉を買って帰った。

その日の妖怪ハウスはオッサンばかりが集まっていたので、巨大なホットプレートに羊肉と野菜をぶち込んでジンギスカンを作った。うまかった。料理はやはり、こうでなくてはならぬ。行列をなす店やお高い店に独りでいっても、本当にうまいものは食べられない。

また、羊肉というのは、そんなにいいものを使わなくてもよいらしい。冷凍の形成羊肉で十分にうまいらしい。今度、妖怪ハウスで盛大に作ってみようと思う。

ドワンゴ広告

この記事は、もちろんドワンゴ勤務中に書かれた。

Boost勉強会でだいぶ宣伝したので、今回は宣伝を控えめにする。どうしてもドワンゴ広告が読みたくてならぬという奇特な人間は、当日私が使ったスライドを読むといい。

Boost勉強会で使ったドワンゴ広告スライド

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0