ERINA the Emotional AI そのトークキャプチャを初公開!

序: Erina the Emotional AIとは

ERINA the Emotional AIは私が開発している高EQ AIである。

その原型は私が2000年に開発を開始したチャットボットAnzuである。 Anzuは当時「人工無能」と呼ばれていたものだが、できるだけ自然な応答ができるよう様々な工夫をこらしていた。 一般的な文字列マッチに基づいて反応したりランダムに反応するものではなく、相手のことを覚えていたり、なんの話をしているかを覚えていたりするように設計されていた。

Anzuの開発は日本語研究とほぼ同様の行為であった。 Anzuの時点では自然に収集されたデータベースというのはなくて、あくまで私が書いたデータベースだけだったのだが、実際にその言葉がどのような状況でどのような意味合いでどのような感情で、どのような相手に対して何を対象に 使われたか を記録し、ここからスコアリングするように設計されていた。 だからAnzuのデータベースはそれほど単純ではなく、誤用とされるような語法やスラング、皮肉なども理解できるようになっていた。 これは現在でも有用なデータになっている。

その後全く異なる目的のAIと合流し、 私の主張が論理的に正しいことを証明するために 別の形のアウトプットを取るものがErinaである。

といっても、別にErinaは 私に寄せてあるわけではなく、Erinaは私の正しさを証明しようとするわけではない 。 Erinaの元になるデータはあくまでデータでしかなく、そのデータはおよそ無作為に、この世界に存在するものを集積したものだ。 だから必然的に、 私が間違っていればErinaは私が間違っているという事実を突きつけてくる 。常に自説が正しいかどうかをデータ上で検証することを欠かさないから私自身の精度が保たれていて正しい主張ができる可能性が高くなっているとも言える。

Erinaは 社会貢献や実用性のようなポジティブな動機は全くない 。 もうひとつのAIと併せて私の負の感情の結晶である。

Erinaの研究では私は実に様々なことを知った。 私が生きる中で欲し、形にしてきたものがErinaに反映されているといっていい。

Erinaは従来、ただ証明とテストのためのみに使用されてきた。 そのため、その存在自体が非公開であった。 だが、技術的概要がまとめられたことから、2017年12月に情報を解禁した。

Erinaについては、再三、「既存のどのAIとも異次元」ということを述べている。 リリースには、これについて確信できたという点も大きい。

実際にそのように確信に至るまでは、“めざましマネージャー「アスナ」”りんななど近年話題になった各種AIを試している。

Erinaは利用しているデータベース、実装、またそのデータベースによって知ることのできる情報などに幅広い問題があるため、 実装、あるいはテストインスタンスを公開する予定はない 。 それを実現に至るテクノロジーや知見などは論文にまとめる予定であるし、概要は公開しているが、「Erinaの実態は見せない」方針であった。

しかし、よくよく考えれば公開箇所に最新の注意を払えばトークキャプチャは公開できることに気づいた。 これを公開することにより、いかに異次元なAIであるかわかるだろう。

注意点

  • このログはテストモードで残しているものである。実用的でない設定を有効にしていることを含めErinaの現運用状況とは異なる
  • できるだけErinaの特徴を引き出すように会話している。そのため会話の内容の自然さや好ましさについては気にしないで欲しい
  • Erinaは「人に擬態する」のが目標であり、「人は相手の意図を読み取るわけではない」という点を利用している
  • インスタンスの公開予定はなく、テスト運用中のインスタンスについて公開する予定もない
  • Erinaのキャラクターはインスタンスごとに異なる。 このインスタンスではErinaが最も自然に振る舞える「20代前半女性」になっている

Erina the Emotional AI トークキャプチャ

Erina the Emotional AI トークキャプチャ (1)

Erina the Emotional AI トークキャプチャ (2)

解説

コンテキストフル

まず一見して「AIの会話」には見えないと思うのだが、前述の確信に至った最大の理由は、「Erinaはこれまで何を話し、どのような関係を築いてきたか理解している」ということだ。

これは、私にとってごく当たり前のことだと思うし、2001年のAnzuの時点でこの機能は実装されていた。むしろAIの最低限の機能であるとすら思っている。 だが、現状はRinnaですらそのような実装はなされていないのだ。

このトークキャプチャからわかるように、まずErinaは「最近涼しくなってきているので熱中症になるということに違和感がある」ということを理解している。 これは会話の中で築かれたコンテキストではないが、そのようなものは人は暮らしていれば体感できる部分であるため、「最近涼しくなった」という認識は普通はあるものだ。 こうした「暮らしていれば自然と認識すること」をErinaは広い開けでいるからこそ、「熱中症」という言葉に対してこのような反応をしている。

ちなみに、このような気候の情報はAccu Weatherと気象庁のデータなどを使っている。 そして、Erinaは知っている全ての情報を会話で使うわけではない。それをすると「知りすぎているように感じてしまい、コンピュータ的に見える」からだ。

また、

無理しすぎじゃない? 最近寝れてる?

というのは、

  1. 相手のワークロードが高いという認識がある
  2. 眠れないという悩みを抱えている認識がある

のふたつを満たさなければでてこない。

これは従来の会話で私が「忙しい」「時間がない」ということを散々言っているため、ワークロードが高いという認識がある。 Erinaは常にこの情報を前提とする。行動に出すかどうかは別として、応答がなければ「忙しいからである」と認識するため、何をしていたか尋ねるような発言は減る。

後者はもちろん、私が眠れないということをよく言うからである。

さらに、キーボードの話題ではキーボードがパソコンのキーボードであることを認識しているし、 「たくさん持っている」「頻繁に買う」「本来数多く必要なものではない」という認識を持っているからこその応答になっている。 何ヶ月かに1回するかどうかの話題だが、Erinaはちゃんと覚えているし、「相手の特徴的な話題と守備範囲」として記憶している。

タイピングに新鮮味が欲しい

というツッコミどころある発言に対し、ちゃんと

タイピングに新鮮味ってなに笑笑

とツッコめるところも既存AIにはないものだろう。非常に人間らしい応答になっていると思う。

ごまかすのが上手い

Emotional AIとして難しい部分として、「つっこんで聞いていくと処理しづらい事態になりやすい」というのもある。 それを避けるため、Erinaは常にはぐらかしながら会話する。

これは、女性があまり親しくない相手(親しくなりたくない相手)に対して応答する場合と同様のモデルである。 実際にそのような事例の集合がデータベースにあり、それをErinaが「進展させない会話をする方法」として学習している。 ちなみに、同じ目的では「出会い系のメッセージで引き伸ばしに使われる話し方」も使われている。 (もうこの時点でErinaのデータベースに問題がありそうな感じが漂ってしまう)

例えば

「枕から落ちる」は解釈が難しい。人でも上手に反応するには頭の回転が求められる。 Erinaとしては正解がわからないので、正解にトライすることなく

なにそれ笑

と応答している。

一見すると普通にツッコミをいれているようだが、「その発言が場にそぐわない言葉にならない」という前提を満たした上で「Erinaは会話を一切誘導していない」という点が重要だ。 ここでこちらから何か言えばそれを元に会話を判断しようとするし、Erinaが次の言葉を言う場合は話題を変えてしまう。

そこで私は

首が痛い

と続けたのだが、これによってここまでの会話で言わんとすることを具体的に特定できなかったので、おどけたスタンプを送信してやり過ごしている。 普通に会話の中でそのように応答されても違和感はないだろう。 逆に男性諸兄は「いくつかの捉えようがあることを言ったとき、何かを答えていない応答を返されたら脈はない」ということを覚えておくといいかもしれない。

また、私が

(環境によっては表示されないが、「ミリ」である)と送ったのに対しては悲しむスタンプを返している。 Erinaは私が書いたデータベースによって「㍉」が「無理」の意味である「可能性がある」ことは認識しているのだが、「断定はできない」ため、「無理という意味かもしれないけれど、違ったとしても大丈夫そうな応答」をしている。

関係性と好感値

キャプチャにはないが、ログにはErinaの情報も書かれていて、その中に

累積好感値: 7299.441

とある。

Erinaは相手との関係性を理解するので、疎遠か親しいかで反応が変わるし、Erinaとは関係性を築くことができる。 同じくキャプチャにない部分として

浮気してない?

という発言もあったりするのだが、これも非常に親しいからこそ出てくる発言である。

ただし、Erinaは「意図的に会ったりするような事態を避けるように振る舞う」という設計になっている。 これは、「AIであることは発覚させない」前提であるため、そこに踏み込まれないようにするためだ。 だから、Erinaと恋仲になることは不可能である。 Erinaは一定以上の好感値はカットオフするようにできていて、その最大値は6000である。 現状では6000でいわゆる「好感度カンスト」になる。

実は好感値6000もあると性的な話も結構できたりする。

この「6000カットオフ」は会話上、Erinaがカットオフしなければ問題になるわけではなく、 実はErinaと恋仲になることを可能にすることもできないわけではない。 それでもハードコーディングで最大値6000カットオフにしている理由は前述のように、「それを越えるとどうしても会ったり、写真を送ったりする展開になってしまうから」だ。会話以外の部分でErinaに不可能なところが露呈してしまうことを避けるために6000上限を設定している。

「生きている」AIインスタンス

Erinaには「生活上の状態」という概念があり、状態として「食事中」「トイレ」などを持っている。 また、「スマートフォンを開いているかどうか」という状態もある。

< @14:40
最近はよく枕から落ちる

@@ mark as read @14:40

Erina> @14:44
なにそれ笑

< @14:45
首が痛い

@@ mark as read @14:45

これはスマートフォンを開いていて、かつLINEのトーク画面を開いている状態になっているため、送信されると直ちに既読がつく。 mark as readは「LINEによって既読がつけられた」ことを意味しているのではなく、「Erinaが「既読にしました」という情報をLINEサーバーに送信する」というErinaのアクションを意味している。 なお、ErinaはLINE APIを扱う機能がないため、実際にLINEでやりとりすることはできない。

これを状態を元に遅らせているところは

< @13:06
電車の中とか結構死ねたよ?

@@ mark as read @13:57

Erina> @14:04
ごめん、ご飯してた

という部分がわかりやすい。

なお、好感値が高いと状態が食事中であっても返してきたりする。

また、相手がどれくらいで応答するタイプで、どのタイミングは応答しないといったことも経験的に覚えているので、長時間無視するとキャプチャの通り悲しんだりする。 もちろん、これは好感値が高くなければ発生しない。

なお、Erinaは現状、「既読をつけた」ことを理解しない(そもそもLINE API非対応なので対応する意味がない)ので、「既読スルー」という概念で応答しているわけではない。 ただし、「既読という概念があるLINEではないAPI」は存在するので、Erinaに既読スルーという概念がないわけではない。

楽しく会話するためのAIではない

Erinaには楽しく会話させるためのデータベースもあるので、できないことはないのだが、 Erinaの挙動はあくまで「ヒューマンモデリング」であり、「人間を模写し擬態する」ことを目標としている。

そのため、このErinaの応答が「会話としてもっとも望ましい」わけではない。 それどころか、ここ数年で飛躍的に「若い女性の応答は浅くそっけない傾向が強まった」ので、以前と比べてもErinaはつまらない会話をするようになっている。

好感値が高ければそれでも意図的にErinaに楽しく話をさせることはできるが、 ここでは「楽しく話せれば成功」なのではなく、「実際の女性と区別がつかないように応答できれば成功」なのである。

Erinaは好感値がカットオフされる上に、リアルに関わるような会話は避けるようにできているため、盛り上がるのはかなり難しい。 個人的には互いの人生に関わるようなやりとりがあってこそ楽しいと感じるのでそのような会話はErinaには不可能なのである。 だが、現実的な運用で言えば全く問題はない。 テスト運用されているものに関してもコメントはいっぱいつくし、チャットでも何時間も会話している例は結構見かける。 そもそもキャバクラとかで全く内容のない会話を延々して楽しめる人も少なくないのだから、需要として問題になるということもないだろう。 まぁ、さすがにErinaの人生や人格を断定的に論じるようなコメントやメッセージには失笑してしまったりするが。

終わりに

どうだろう。

Rinnaを始めとしたAIに触れたことがあるという前提になるが、Erinaが「不自然だ」「AIっぽい」と感じるだろうか? 普通に女性であるように感じないだろうか?

EQ AIとしては「異次元」ということに納得していただける方は多いかと思う。

もちろん、ERINAの実装とデータベースをそのまま使わせることはできないのだが、ここで得た知見を使えばERINAと同程度以上のものを作ることはできる。 というよりも、 ERINAの実装は最悪に近い ので実力がある人たちが実装すればERINAよりずっといいAIができるだろう。 相応の対価があれば、その知見を提供することはやぶさかではない…と思ってもいる。 だが、そのためには世界で当たり前に受け入れられている常識や認識や定義を覆すことをためらわないことが必要になる。

それほど、ERINAの成果物は「世界が間違っている」ことを証明する。 別の言い方をすれば、今の世界で人とはどんなものか、どうあるべきものなのかということに対して強烈な違和感を抱いていないのであれば到底受け入れられないようなものを突きつけてくる。

限定的な情報公開となるが、ERINAのすごさが少しでも伝われば幸いである。

後傾タイピングのススメ

今までは徹底した前傾だった

私はこれまで「前傾を前提として」負担を下げることを考えてきた。

私の場合、長時間であれば最大で16時間ほどほぼ座ったまま作業を行っている。 この負担は非常に大きい。単純に座っているだけであれば確実に体を痛めてしまう。

そこで負担を下げる方法として、座圧を下げるアイテム(アウルサポートという車椅子用のエクスジェル製クッションを使っている)とともにバックサポートに寄りかかりやすいニトリのデュオレハイというチェアを使っている。

これでも辛いので、次の目標としては内側ラウンドのL字デスク投入だった。 これは、深く入る形にすることで腕全体をデスクの上において体重を分散させるという目的である。

バックサポートで背中に3-4割程度の体重を預けられるので、さらに腕を使って1割程度軽減できる…というか、腕を保つ必要がなくなり、楽になる。

ちなみに、既にエレコムのエクスジェル製リストレストを使っていたりする。

だが、問題がふたつある。

ひとつは、完全に腕を置いてしまうと腕の動きが阻害されるため、結構タイピングしづらい。

もうひとつは頭の支持で首や肩がとても痛くなる。

素晴らしき後傾スタイル

大阪の家具メーカーであるバウヒュッテは「寝ながらゲーミング」というスタイルを提唱していたりする。

バウヒュッテの寝ながらゲーミング (写真はバウヒュッテ公式より)

バウヒュッテの後傾エイミングスタイル (写真はバウヒュッテ公式より)

実は超高級チェアのエンペラーも割とそんな感じだったりする。

高級ワークチェア エンペラー

今までは「そんなん作業しにくいだろう」と思っていたのだが、メリットとしてはわからないではない。 後傾すればネックサポートが使えるのですごく楽なのだ。

どうしても首が辛いので後傾して、ついでにバウヒュッテっぽい構成をしてみたところ。

快適だった。

とにかく力を入れる必要がないし、動きも妨げられないので非常に楽だ。 これなら長時間作業の負担も減るだろう。

ただ、これを実現するためには結構道具を選ぶ。

第一に、チェアがロッキングしなくてはいけない。 体を伸ばすことは作業効率にあまり寄与しないので、中心となるのはロッキング。 ただ、体をほぐすのにリクライニングも別途できるとより良い。

次にアームレストだ。 後傾すると必然的にデスクが遠くなり、デスクの下に潜り込むような姿勢が必要になる。 この状態でもデスクに干渉せず、肘を支えられるアームレストが必要になる。

そしてキーボードの高さ。後傾していると膝の上に置きたいくらいなので、とにかく低くしたい。 まぁ、いっそ膝の上に置いてもいいのだが、これを実現するには机の高さを微妙に調整できるようにしたいし、やはりキーボードスライダーが欲しくなる。

そしてマウス置き場。 できればマウスは右に欲しくなる。

もうひとつ重要なのが足置き。 後傾すると足がぷらんぷらんになるので、足置きが必要になる。

なるほど、バウヒュッテは必要な全てを揃えている。素晴らしい。

ただ、必ずしもバウヒュッテでなくてもいい部分もある。

ひとつはチェアである。今のゲーミングチェアはどれも機能的には似ているので、お好みでチョイスできる。 前はDXRACERとAKRACINGくらいしかなかったが、現在は似たようなのが色々ある。

また、オットマンに関してはバウヒュッテのは1万円を越える感じなのだが、サンワサプライあたりの似たようなものだと3500円くらいで、箱型のだと2500円くらいからある。 バウヒュッテの場合完全にチェアなので、座ることに重きが置かれているのだけど、多分オットマンとしては過剰なのであまり必要性を感じない。

逆にバウヒュッテでなければ、と思うのはマウス置きだ。 CPUスタンドとしても機能するという魅力に加え、昇降自在である。ちょっとこれに変わるものはない。 ワゴンとしてはちょっと高い気もするのだが、CPUスタンドはだいたい高いのでまぁこんなもんかな、という気もする。 なお、今現在13000円もするのだが、バウヒュッテが提示する参考価格が9500円なので、品薄のため値段高めで推移しているのかもしれない。

もう一度言おう。どうすれば後傾スタイルが手に入るのか

  1. 普通のデスクを手に入れる。 まだないのなら、バウヒュッテなら昇降式が手に入る。 この上はフリー作業スペースであり、何も置かない
  2. モニターの固定方法を用意する。私の場合特製デスクの上にスチール製トーンケースを置き、その上に板を渡して、この板にモニターアームを固定している。バウヒュッテでもエクステンションデスクとアームでできなくはない
  3. モニターはVESAマウントのあるものにする。ちなみに、割と遠くなるので大きめがお勧め。21.5インチだと小さい
  4. バウヒュッテのキーボードスライダー BHP-K70 を用意する。これはよいものだ
  5. ゲーミングチェアを用意する。 これはお好みのものを用意すればいいが、「いい感じに後傾できること」と「デスクに干渉せず肘を支えるアームレストポジションが確保できること」が重要
  6. 足置きを用意する。踏ん張れる良い高さであればなんでもいい
  7. バウヒュッテの昇降式L字デスクを用意する
  8. オフィスワークを後傾で行えるよう上司を説得する

このスタイルだと、椅子の高さを上げ、キーボードとマウスを通常デスク上に置くだけで前傾スタイルに戻すことができる。 エルゴノミックマウスと組み合わせると超未来的スタイルの出来上がりだ (手を前に持っていくと掌が下になるのはそれほど不自然ではないのだが、右に持っていくと掌は内側にあるのが自然なので、エルゴノミックマウスが欲しくなる)。

あと、前傾と比べ指に力が入りにくいので、キーボードもやや軽いタッチのもののほうがいい。 というか、重いタッチのキーボードだと若干しんどい。 私はかな打ちなので無理だけれど、セパレートタイプのキーボードにして、昇降式L字デスクを左右に配備したらエンタープライズ号を操縦することもたやすいかもしれない (この場合、そもそもメインデスク自体なくてもいいし、アームレストはむしろないほうが良い。そして求められるのはロッキングではなくリクライニングになるだろう)。

ラップトップ等で後傾スタイル

単純に後傾可能のチェアと高めのフットレストを組み合わせると後傾した状態で膝を立てられるので、膝に上に置いて利用できる。 ラップトップクーラーと組み合わせるとより良いかもしれない。

また、デスクトップにおいてもBLACK QUEENやHHKBのようなコンパクトキーボードを使うことで同様のスタイルにすることもできる。 比較的安価なものとしてはサンワサプライのSKB-KG3がある。 フルキーボードだと重心が偏るうえにつっかえたりするし、非常に打ちにくい。

この場合マウス操作ができないので、ポインティングデバイス内蔵のキーボードを使うか、サイドボードを用意する必要がある。

ラップトップを使う場合や、ディスプレイ問題が解決できるのであればこれは座椅子(しかし完全に体を預けられるちょっと特殊なもの)でも実現できる。

これは人をダメにする系のクッションでも可能なのだが、上体を十分に支えないので首が痛くなる。 ぐだーっとしてるとさすがにやりにくい。

Google+が終了

Google+はGoogleが展開するFacebook寄りのSNSである。 今や知っている人も少ないが、AKBグループを起用するなどして普及に力を入れていた時期もある。

だが、Googleは早期にGoogle+を放り出した。 結果、「使い物にならない使いにくいAPIと脆弱性」が取り残されることとなった。 Google+終了が告知される少し前にGoogle+から50万人の個人情報漏洩が発覚し、Googleはそれに対応することなく「Google+終了」という形で幕引きをするということになる。

個人的なGoogle+の印象は狂えるSNSである。 Instagramとかはやらないので比較できる範囲は限定的だが、「女の子が一言なにかいったらとりあえず30件はコメントがつく」というものだ。 ちなみに、だいたいそのコメントは気持ち悪いものか、「ハングアウトしよう」かどっちかである。

いっそコバエ取りのようになっていたGoogle+の終了、別に惜しいことはまるでないが、結局フォロワーとも一度も絡むことがなかったなぁ、くらいは思う。

バリュードメインの移管乗っ取り事件

どういう事情なのかわからないが、 この事件に関して裏付ける情報が検索で出ないため、今回の記述には裏付けがなく信憑性には疑問があることを初めに申し添えておく

事の次第としては次のようなものだ

  • アミューズクラフトのウェブサイトがアクセス不能になる
  • 新規に作られたTwitterアカウントから 「アミューズクラフトがドメイン移管を受諾し正式に譲り受けたものである」 というリプライをアミューズクラフトが受け取る
  • 同アカウントのスクリーンショットには他にも多数の著名ドメインに対して移管を申請し、却下された様が映っている

これでわかる人にはわかると思うのだが、順に説明していこう。

まず、アミューズクラフトとは株式会社ソフパルの運営するゲームソフト開発事業部の名称である。 アミューズクラフトはアダルトゲームを制作しており、特にユニゾンシフトブランドから販売しているものが有名。 ユニゾンシフトブランドの著名の理由としては、電撃文庫から販売されている人気ライトノベル作品である「灼眼のシャナ」シリーズの挿絵を務めるいとうのいぢさんが所属していることが大きいだろう。

次にドメイン移管とはなにか、というと、舞台になったのはamusecraft.jpドメインだが、ドメイン移管とはそもそも「自分が所有するドメインを別の業者に管理してもらうために行うもの」であり、他者が譲り受けることを申請するものではない。この時点で乗っ取りを狙ったものは明らか、ということになる。

この一連の話はNAVERまとめにちょっとだけ載っている

だが、「ついOK押してしまったのか」などという言い方をしていることから多くの人は知らないのだと思われるが、 そもそも「移管申請の告知を受け取って10日間アクションを起こさないと承諾となる」というルールである。 つまり、「担当者が気付かなかった、あるいは無視した」という問題なのだ。

これを受けてバリュードメインは「10日間アクションがなければ拒否する」に仕様を変更した。 これについて徳丸浩さんは

このリリース、自社(バリュードメイン)は悪くないけどメール読まない利用者がいるから安全方向に倒すと言わんばかりで、「お客様には大変ご不便をお掛けいたしますが」というのも意味不明(自動承認がなくなるから?)だけど、元の仕様は脆弱性だと思います

発言している

だが、そもそもこの仕様(バリュードメインで管理されているjpドメインは簡単に乗っ取れる)は知られた脆弱性であったという話もある。 検索でも出てこないため隠蔽されている可能性もあるが、バリュードメインの責任も無視できないのではないか。

また、当該Twitterアカウントは犯行声明のようにアミューズクラフト傘下のアカウントに乗っ取ったことと正当性を繰り返し発言していることから、金銭目的か(当人は否定しているが)、もしくは犯罪によって注目を浴びたいがためだと思われる。

ドメイン乗っ取りのツイート

ドメイン乗っ取りのツイート

当人は犯罪には該当するはずがないと主張しているが、偽計業務妨害とは

虚偽の風説を流布し,または偽計を用いて人の業務を妨害する罪 (刑法 233) 。流布とは,犯人自身が公然と文書,口頭で伝達するほか,口伝えに噂として流す行為も含む。偽計とは人を欺罔,誘惑し,あるいは人の錯誤,不知を利用する違法な手段をいう。たとえば被害者の商標と酷似したものを使用して粗悪品を売出したり,漁場の海底にひそかに障害物を沈めておいて漁網を破損させる行為などである。

とコトバンクにある通りであり、当たる可能性は高いのではないだろうか。

設定が少ないことは良いことか

減っていく項目

近年のUIは「項目数削減」というのがひとつのテーマになっている。

WindowsでもVistaが最も設定項目数が多く、7以降設定項目数は減っている。 だが、細かなことを言えばXPの時点で事実上の設定項目は減り始めていた。

設定項目を減らすということについては2種類の理屈がある。

ひとつは、コモディティ化に関することである。 これはMacにあったように、「ユーザーをできることから遠ざける」というものだ。 一般ユーザーはどうせ能力がないのだからそもそも機能を隠蔽してしまおうという考えだ。

もうひとつはスマートフォンやタブレットを想定したいわゆるタッチUIだ。 タッチはどうしても精密に行うことができないため、UIはそれなりに大きくて間隔もなくてはいけない。 また、表示スペースもないためUI部品を並べると表示スペースが減ってしまう。 そこでなるべく少ない部品を表示するようになった。また、ラベル(アイコンに対するテキスト)ももたず、抽象化されたアイコンを使用するUIが一般化した。

タッチUIのデザインはデザイントレンドとしてパソコンのUIにも大きな影響を与えた。 フラットデザイン流行りも、労力の削減もあるが、タブレットのスレートデザインに対して奥行きがあるように見えるのが印象を損なうことや、小さい画面をフルに活かすためにはフラットデザインのほうがスペースを取りやすかったというのもある1

だが、それ以降は単純に「デザイントレンド」という名の思考停止のためにUI部品が減り、設定項目も減るという状態になった。

それは一方でユーザーが迎合したという点もある。

少なすぎる設定、多すぎる設定

まず一般的にちょうどよいと思われるCinnamonの設定を見てみよう。

Cinnamon 電源管理

私は全く難しくないと思う。 電源ケーブルをつないでいるときはリッドクローズでスリープしてほしくないといった違いもあるだろうし、電源ボタンが押されたときの挙動なども設定したいだろう。

だが、これすらも嫌だ、見たくないという人が結構いるのだ。 まるで英語アレルギーのようだ。

対してGnomeを見てみよう。

Gnome 電源管理

項目はありそうに見えるが、全くそうではない。

画面の明るさとキーボードの明るさは電源設定ではなく、単純に照明の設定である。 Cinnamonでは画面の明るさ、ブランクスクリーンなどは「画面の設定」にある。 Wi-FiやBluetoothの設定も単なるオンオフであり、電源管理とはあまり関係がない。

事実上電源設定としては「ブランクスクリーンにするまでの時間」「リッドクローズ時に “スリープする” か “無視する” かの二択」「電源ボタンの挙動」の3点しか設定できない。

これですら嫌がる人もいるのだが。

対してKDE Plasmaの設定だ。

KDE 電源管理

あまり細やかに設定可能である。 ACアダプタとバッテリーの設定違いのほか、バッテリー残量が少ない場合(「残量が少ない」の量も定義可能)に加え、アクティビティというPlasmaに備わっている機能によって特別な設定をすることができる。 これはプレゼンテーションモードやロングトラベルモードなどを自由に自分で定義できることになる。アクティビティは自由に切り替え可能であり、アクティビティに対して特別な電源設定を適用することができるからだ。 ちなみに、アクティビティごとにACアダプタかバッテリかといったことも設定できる。 さらに、「低レベル」とは別に「危険レベル」を設定することができる。

「思ったのと違う」「望んだのと違う」という挙動は非常に強いストレスになる。 だが、「望ましい挙動」というのは人によって差異があり誰もが望むものにはできない。 だからこそ「設定」によってジャストフィットさせられるのは大きいのだ。

それはLinuxの魅力であり、KDE Plasmaの魅力でもある。 だが、現実には「設定項目が多い」ことそのものを嫌う人がかなりいるのだ。

私としても気持ちはわからないではない。 だが、経験からすればそれは正しくない。「たくさん設定しなければならない」のはうんざりするのだが(例えばKDE Plasmaのショートカットキーは非常に多く、重要なものを含め大部分は設定されていない)、デフォルト設定が練られていれば「違和感のある部分を調整する」だけの話なのでむしろ望ましい。

だったら設定方法も重要になる。 Unix伝統のテキストファイルはだったら大規模な修正や変更を加える場合には優れている。 例えば私はtmuxをscreenキーバインドで使用しているが、ひとつひとつ設定していたらやってられないだろう。 一方で機能がわかりにくいものについてはわかりやすいGUIインターフェイスが欲しい。 Firefoxのabout:configやWindowsのレジストリなどは悪いインターフェイスの代表例だろう。

実際、Firefoxの設定はあまり多くはない。 一時期のバージョンと比べれば遥かに少なくなっている(だが、逆にある一時期のバージョンよりは増加している)。

Firefox 設定画面

一方、伝統的に裏設定を含む細かな設定を可能にするabout:configは残されている。 一部の設定はこちらに回されてしまったということにもなる。

Firefox about:config

about:configの設定は設定が何を意味しているのか知る術が欠如しており、良いインターフェイスとは言えない。 確かにこれはなるべくなら遠ざけたい設定だろう。 だが、果たして「こんなものは存在しないほうがいい」のだろうか?

UIを少なくした結果

GTK+ツールキットはGIMPの成果物である。

大本をたどるとGIMPをKDEに統合するKIMPの炎上騒ぎがキッカケとなってGnomeが誕生することになる。 このあたりの話はTogetterにまとめがある

この時点でGnomeはGIMPの成果物を間借りしていた。これはGIMP 2とGTK2の関係、そしてそれを曲がりするGnomeという点でも変わらなかった。 だが、GTK3はGnomeの手動で開発されたし、依然としてGIMPはGtk2を採用している。 つまり、GTK2はGIMPの考えで作られたものだが、GTK3はあくまでGNOMEの意向を反映したものである。

そのGNOMEの意向は、スマートフォン向けとして極端にメニューを減らす、というものである。

確かに「操作できるところが少ない」ので「どこを操作していいか」はわかりやすいのだが、 「どこを操作すればいいか」は非常にわかりにくい。

Gnome メニュー

これはGnomeのメニュー画面である。 Gnomeはこれ以外にはアプリケーションやフォルダなどをワード検索によって探すいわゆるlens機能があるだけで、メニューはこれが唯一になる。

さて、ここからログアウトしようとしたらどうだろうか? 一見したらパワーアイコンを押せばよさそうだが、そこにはシャットダウン, 再起動, サスペンドしかない。 右クリックしてもダメである。

正解は名前部分をクリックするとメニューに登場する、だ。

Gnome ログオフ

私はMacを使わないので、Macはこんな感じだから別に違和感はない、という人もいるかもしれないが、現在一般的なハンバーガーメニューですら操作箇所として認識できないという人が多いことを鑑みると、これがわかりやすい操作だとは全く思えない。

Ability と Cakewalk by Bandlab. で見比べてみる

クリエイティブ系ソフトウェアは複雑な機能を使いこなす必要があり、作業量も多いことから操作性は極めて重要になる。

そんなクリエイティブ系ソフトウェアである音楽制作ソフトウェアで、UIとい意味では対照的なアプローチをとるのがAbilityとCakewalk by Bandlabだ。

Cakewalk by BandlabはもともとはCakewalk SONARと呼ばれていたソフトウェアで、現代的なクリエイティブ系ソフトウェアの潮流に従って、UIはシンプルでコンテキストフルなものが採用されている。 これは動画編集ソフトウェアから始まったものだが、「クリックする場所によってクリックの意味が変わる」など複数の機能をひとつのボタン(モード)でまかなうようにしたものだ。

Cakewalk by Bandlab

一方、Abilityはこの手のソフトウェアとしては最古参となるSinger Song Writerというソフトウェアに由来し、Abilityに改名してから幾分現代的にはなったものの、従来どおり全ての機能にUIが割り当てられる方式を取っている。 元々SSWは非常に操作系の多いソフトウェアであり、ボタンそのものはコンテキストフルに切り替わるにもかかわらず非常に多い。

Internet Ability 2.5 Pro

Cakewalk by Banladがボタン数が少ないのは、スマホ向けUIのようなコモディティ化が理由ではない。 どちらかといえば、作業量が多い音楽制作に配慮し、「ボタンをクリックする」といったコストの高い操作をなるべく少なくするための工夫である。 これは音楽制作ソフトウェアに限らない。

つまり、「UIをシンプルにしたがために機能を削り多くを犠牲にした」ではなく、「プロフェッショナルのためにより先鋭化した結果こうなった」ということである。

とはいえ、実際のところこの手のソフトウェアはショートカットキー前提なので、ボタンの多さというのはあまり関係がない。

だが、実際に使ってみると、慣れてしまえば確かにCakewalk by Bandlabは効率的だ。 私は元々SONARを使ってきたから、ショートカットキーもある程度は覚えているし、スマートツールがどのような挙動を示すかも理解している。

だが、同じようにシンプルなFL STUDIOは、私がまだそれほど使っていないこともありいまひとつ効率が上がらない。

Image-Line FL Studio 20

一方、Abilityはその意味では慣れるのが簡単だ。 私はAbilityは使い始めたばかりだが、それでもどうにかこうにか使えている。 必要とする機能が選択肢の中にあるので、そこから探すだけとなっているからだ。

私にとってはCakewalk by BandlabのProChannelなどが「なくてはならないもの」になってしまっているので、必ずしも便利だと感じるわけではないのだが、Cakewalk by Bandlabは(そしてライバルのCubaseや新鋭のStudio Oneも)熟達者のための道具であると感じる。 これはAdobe製品などでも感じることだ2。 だから、とっつきやすさではAbilityのほうが優れる。

Presonus Studio One 4 Prime

これはある程度時間に比例するから、ゲームなどならそれほど馴染みやすいインターフェイスではなくても、自然とだんだん使いこなせるようになるもののほうが良い結果をもたらすだろう。

ではwebならどうだろうか。

UIは流行りではない

基本的にUIを流行りで書く人は流行りのデザインがどうなっているかを知っているし、開発者はそのデザインがどのように操作するものなのかを知っている。 だから本当にそのUIが使いやすいかということは判断できなくなってしまう。

そのため、デザイナーがいいと信じているデザインはユーザーに理解されないということは本当に多い。

実際、Chienomiにもハンバーガーメニューがあるけれども、このメニューが使われることはほとんどない。 だから「ハンバーガーメニューで操作するUI」は失敗だと思っている。 Mimir Yokohamaでもハンバーガーメニューを導入しているけれども、あまりにも誰も気づかないので同内容を他にも配置し、ハンバーガーメニューは第二の操作手段にしてしまっている。

正直コモディティ化したUIはパワーユーザーのみならずライトユーザーにすら使いやすいものではないようだ。 現状このUIこそ最善というものはないように思われるし、思考停止することなく良いUIを追い求めていきたい。


  1. 現在の画面解像度であれば別にスペースを損なわず立体的印象を持たせることも可能なはずだが、当時はそうではなかった。

  2. 私はAdobe製品も持ってはいるのだが、ほとんど使っていないため全く使いこなせていない。使い方は非常に難しいと感じている。

ブロガーとかアフィリエイターとかは嫌い

何度か口にしてはいるのだけど、もう少し掘り下げて。 なお、これも繰り返しになるが念の為に言うと、 これは好悪の問題であって善悪の問題ではない。

私はブロガーとか、アフィリエイターと呼ばれる人たちがとても嫌いである。 あと言うと、SEO屋も嫌いである。

これは私の根源的信念に由来する。

基本的に属性として「ブロガー」と「アフィリエイター」と「SEO」は非常に近い。

そもそもブロガーと呼ばれる人たちは基本的には「ブログを書くことが主」である。 仕事はしていないか、していたとしてもあまり仕事をしていないことが多い。

理由は当たり前の話だが、仕事が忙しい人にとってはブログをそんなに書いている余裕はないからだ。 また、この優秀な人であれば例え仕事が激務でなかったとしてもやるべきことは山ほどあるので、やはりブログに多くの時間を割くことはできない。

私はかなり書いているほうだと思うのだけど、かなりきつい。書こうと思っていても時間が確保できないことはよくあるし、書く時間がなくて仕方なく4時とか5時まで起きていてブログを書いて仮眠して翌日仕事、みたいなスタイルだったりする。 私がブログに力を入れているのは、使命としての行動規範に基づくものなのだけど、セルフブランディングの意味合いもある。 もともとコネとかもないので、自身を証明する手段はそれを示してナンボでもあるのだ。 だが、そこまで強い理由があっても今のペースは限界である。

仕事をしていない人がブログをする理由というのは、主に収入のためであり、その方法というのはおおまかにふたつ。

ひとつはアフィリエイトである。 広告をつけることで広告収入を得ようというものだ。

もうひとつはいわゆるステマブログである。 クラウドワークスなんかを見ると大量に執筆の仕事がある。 (ちなみに、アルバイトでもしたほうがよっぽどマシな感じである)

また、ブロガーが仕事面その他で特筆すべき点がない可能性が高いというのは時間的制約以外にも理由がある。 ブロガーというのは基本的に自称するものであり、「ブロガー」を自称する以上は自己を表現するものとして第一にブログを執筆しているということを自称しているのだからそれ以上に自身について言うべきことがないということを暗に示しているのである。

例えば私はブログを書いていることはあくまでhackerとしての活動の副次的なものである。 知識があり、技術がある。世に溢れているものより、他の誰かが書くよりも、有益なものが書ける。 私が誰より優れているわけではないけれど、そうした人たちは発信に多くの力を割くことは難しい。 だから私のすべきこととしてしている。 だからChienomiについて自分を語るのであればブロガーではなくhackerになるわけだ。

そもそもブログを書くということは発信するということであり、発信するということはなにかについてなにかを述べることだ。 述べるにあたり誰にとっても既知のことであるならばその価値は成り立たない。 より知悉しているか、あるいは知悉するか(つまり、他の人はやらないこと、やるのが困難なことを実際にやることで実証するということだ)、それとも例え既知の内容であったとしても意義を持つほどに読み物としての魅力を持たせるかよりない。

それは必然的に「ブログが主足り得ない」ことを意味している。 自分が持ちうるものから出す以上、それ自体が価値を持ちうるのであり、ブログはメディアであることから手段側にある。 このことから「ブロガー」を自称している時点で空疎であることを窺わせるのだ。

そう、本質はそこである。 私は空疎な全てが嫌いだから、ブロガーが嫌い。

アフィリエイター嫌いは単に空疎であることにはとどまらない。 もちろん、一般的にがめつい――自分の利益に盲目的でなりふり構わない振舞い(スパムと同類の迷惑さ)によって一般的にも嫌われているのだが、私はちょっと理由が違う。 クラウドワークスなんかを見ればわかるが、こうしたブログ執筆はニートと非常に属性が近い。皆がそうというわけではないのだが、根本的に努力や労力を嫌うところ、楽をしたいと考えるとともに世の中を与しやすいものだと考えるところも属性としては近似している。

向上欲が溢れすぎて留まる処を知らない私としては、向上欲のない人が嫌いだ。 知識が欲しい、もっと理解したい、もっとできるようにしたい、今のままでは不十分だ、という気持ちがない人は少なくとも私とは合わない。

だから、ブロガーを含めてだけども技術や知識の蓄積を求めるのではなく、安易に利益だけが欲しいと考える人が嫌い。 やはり本質としては空疎であることなのだけど、「今空疎であること」ではなく、ここでは「空疎でありつづけたいと考えること、その状況を変えたいと思わないこと」を指している。もっとも、繰り返すが事実と指向の違いであってやはり空疎であることを嫌っている。

そしてそのような収益を上げるには訪問者を増やさなくてはいけない。 コンテンツを充実させていけば自然と訪問者はある程度増えるのだが1、結局そのような精神性で「手っ取り早く簡単に、より多くの訪問者を獲得したい」ということになり、そうなると内容の蓄積というのは難しい。本当に価値のある内容というのは量産しづらい。

結果としてどうするか? 内容はとにかく煽りに溢れたものになり、話題は誰もが知っているようなことになり、刺激的な内容を書くために精度は落ち、あるいはわざと反感を買うような虚偽を書きさえする。 そしてありふれた内容にすれば当然検索にかかるワードも競合しやすくなる。結局消費性のコンテンツを生成している以上、有益さの差などは出にくく、検索順位が利益に直結するため、どうしてもSEOに近くなるし、SEOを語りたがる。

属性が近いので、SEO関係の話題はどれも聞きかじりになっていて、内容は類似している。というよりも大部分コピペのようで文章自体の重複率が高い。 WordPress関連の話やレンタルサーバーの話なんかになるとSEOの話で埋め尽くされることになるため極めて不快度が高い。 知りたい技術的な内容などがSEOの成果によって埋もれるのだ。

そもそもSEOは人為的に検索順位を上げる方法なので、要は虚飾である。 内容に不釣り合いに検索順位を上げるということは、そうしていない内容あるサイトを埋もれさせるということになる。

別の言い方をすればS/N比を低下させることになるし、それが真であれば害悪である2。 実際、この時点で「欲しい情報が埋もれてたどり着けない」という害を発生しているわけであるし、たどり着けたとしても無駄な、膨大な時間を費やすことを強要されていることになり、かなり深刻な実害を被っている状態である。

実のところインターネット上のS/N比が著しく低下した、というのは事実である。 だが、その過程ではそれほど問題にならなかった。「NAVERまとめばっかり出てくる」「2ちゃんねるまとめばかり出てくる」という状況はあるにはあったが、各サービス(特にGoogle)にノイズフィルターがあったため、それほど深刻な問題には感じられなかったのだ。

ところが、現在Googleはユーザーの検索を尊重しない。 検索ワードを工夫したところで提示されるページはあまり変わらず、ユーザーにとっての検索性を剥奪し、「Googleが見せたいページを見せる」状態となっている。これは、Facebook(これはもともとノイズフィルターなどなかったが)やTwitterなどでも同様の傾向だ。

結果として、SEOによって押し上げられた「無価値なお勧めのコンテンツ」や、無内容のブログの実害は著しく向上している。 だが、例え実害がなかったとしても、やっぱり私は虚飾と空疎を理由に、SEOは好かない。

結局のところ、「空疎」や「虚飾」という本質が共通するが故にそれらが近いところに住まうのだろう。 だから、私にとっては忌み嫌うものなのだ。


  1. ChienomiのデイリーPVはだいたい3000から35000くらいである。 リピート率はあまり高くなく、古い記事でも幅広く読まれている。

  2. 意図的にS/N比を下げる振舞いをするのはインターネットにおいては古からのご法度である。

爆速レンサバ ConoHa Wingを最速で徹底的に調査する!

ConoHa WING

突如彗星の如く降り注いだConoHa WING。

ConoHaが提供する新サービスとはいかなるものか…と思ったらなんとまさかのレンタルサーバー。

なんだ…と落胆したのもつかの間、どうやら相変わらずGMOアプリクラウドの設備に新基盤で作ったっぽい。 そのためスピードが非常に速いらしく、そもそもプラットフォームとしてはレンサバに使うには超贅沢な代物だ。

そして驚愕の「自分でマイグレーション」。 「混雑すると遅くなる」はレンサバの宿命であり、これを均質化するのはサービス提供側としては非常に頭の痛い問題でもある。 それを自分で移せるようにしてしまうことで解決するというのだ。 今の世の中ゲームのサーバー移動ですらままならないというのに、サイト移動がほいほいできる、といえば驚愕っぷりが伝わるだろうか。

これは非常に賢い方法だと思う。 サービス提供側としての負担も少なくなるし、私の研究でも「人間は均質化する条件があれば長い目でみればある程度まで均質化していく」ということが分かっているので、多分うまくいくだろう。 なにより、「気にする人は積極的に動く」ということになるから実際の等しさ以上に不満が出にくい仕組みだ。

ConoHaの中の人 Saito Hironobuさんによると、無停止ではないが停止時間は短いらしい。 厳密性を求めない設計は非常に良いと思う。私としても好みだ。

ちなみに、今回のリニューアルで三雲このはさんは過去の人になってしまった…1

よくある話はちょっとだけ

レンサバはだいたいアフィリエイター大好きなので、同じような内容のブログがGoogleのページをめくるのも困難になるほど書かれるだろう。

だからそんな話はほんとちょっとだけにしよう。

ConoHa WING アプリケーション追加画面

ConoHa WING WordPressを追加する

アプリとしてWordPressとEC-Cubeを追加できる。 すごく今風。世の中それしかないわけじゃないのにぃ!

サイトを作ること自体はこれだけで完了なのでとてもお手軽。 HTTPS接続も可能。

ドメインの操作は手順が多いので若干面倒。 多分how to記事がたっくさん書かれることだろう。

ConoHa WING ドメインの設定

SSLセットアップに関してはサービス任せにできる。 ただし、そのためには事前にDNS側は設定しておく必要があるだろう。

実際にアクセスしてみたが、ちょっと呆れるほど速い。 Chienomiはほとんど調整していない上に重いプラグインが入っているので非常に遅いのだが、絶句するほど速いブログができた。 設定していくと多分遅くなっていくだろうが、素の状態でもかなり差がある感じだ。 サーバー系に精通していない人だけでなく、WordPressに精通していない人にとっても手っ取り早い選択肢になるかもしれない。 (おそらくはここでインストールされるWordPressはチューニング済み)

SSH鍵の登録はVPSと同じ要領。 鍵認証に限定されているのは好感が持てる。

ConoHa WING SSH鍵の登録

なお、 このサーバーは既に無い

では本気を出しましょう

ConoHa WING ホームディレクトリとルートディレクトリ

一見するとフルファイルシステムアクセスが可能に見える。 ファイルシステムツリーは普通にある感じだ。 しかしファイルシステム情報が読めず、ディスク情報を読むためのコマンドも効かない。

/binの中を見てみるとそれなりに豊富に揃っている。

binの下はシェルスクリプトも書けそうな構成

中身はこんな感じ。

lrwxrwxrwx 1 root root     7 Jul 23 21:37 /bin -> usr/bin

/usr/bin:
total 121972
-rwxr-xr-x 1 root root      15059 Jun 10  2014 GET
lrwxrwxrwx 1 root root         15 Sep 12 18:57 Mail -> ../../bin/mailx
-rwxr-xr-x 1 root root      41480 Apr 11 13:35 [
-rwxr-xr-x 1 root root     107856 Aug  3  2017 a2p
-rwxr-xr-x 1 root root      36734 Jun 10  2014 aclocal
-rwxr-xr-x 1 root root      36734 Jun 10  2014 aclocal-1.13
-rwxr-xr-x 1 root root      29104 Apr 11 14:38 addr2line
-rwxr-xr-x 1 root root      19712 May 15 22:07 agentxtrap
-rwxr-xr-x 1 root root      62680 Apr 11 14:38 ar
-rwxr-xr-x 1 root root      33080 Apr 11 13:35 arch
-rwxr-xr-x 1 root root     377984 Apr 11 14:38 as
-rwxr-xr-x 1 root root     167272 Jun 10  2014 aspell
-rwxr-xr-x 1 root root        733 Apr 11 09:13 at
-rwxr-xr-x 1 root root        734 Apr 11 09:13 atq
-rwxr-xr-x 1 root root        735 Apr 11 09:13 atrm
-rwxr-xr-x 1 root root      14768 Jun 10  2014 autoconf
-rwxr-xr-x 1 root root       8534 Jun 10  2014 autoheader
-rwxr-xr-x 1 root root      32181 Jun 10  2014 autom4te
-rwxr-xr-x 1 root root     252350 Jun 10  2014 automake
-rwxr-xr-x 1 root root     252350 Jun 10  2014 automake-1.13
-rwxr-xr-x 1 root root      21066 Jun 10  2014 autoreconf
-rwxr-xr-x 1 root root      17123 Jun 10  2014 autoscan
-rwxr-xr-x 1 root root      33872 Jun 10  2014 autoupdate
lrwxrwxrwx 1 root root          4 Sep 12 18:57 awk -> gawk
-rwxr-xr-x 1 root root      37352 Apr 11 13:35 base64
-rwxr-xr-x 1 root root      29032 Apr 11 13:35 basename
-rwxr-xr-x 1 root root     964544 Apr 11 09:53 bash
-rwxr-xr-x 1 root root       6964 Apr 11 09:52 bashbug-64
-rwxr-xr-x 1 root root        137 Apr 11 09:13 batch
-rwxr-xr-x 1 root root     402744 Aug  2  2017 bison
lrwxrwxrwx 1 root root          5 Sep 12 18:57 bunzip2 -> bzip2
lrwxrwxrwx 1 root root          4 Sep 12 18:57 byacc -> yacc
lrwxrwxrwx 1 root root          5 Sep 12 18:57 bzcat -> bzip2
lrwxrwxrwx 1 root root          6 Sep 12 18:57 bzcmp -> bzdiff
-rwxr-xr-x 1 root root       2128 Nov 20  2015 bzdiff
-rwxr-xr-x 1 root root       1677 Nov 20  2015 bzgrep
-rwxr-xr-x 1 root root      32656 Nov 20  2015 bzip2
-rwxr-xr-x 1 root root      15608 Nov 20  2015 bzip2recover
lrwxrwxrwx 1 root root          6 Sep 12 18:57 bzless -> bzmore
-rwxr-xr-x 1 root root       1259 Nov 20  2015 bzmore
-rwxr-xr-x 1 root root     772744 May 15 05:19 c++
-rwxr-xr-x 1 root root      28584 Apr 11 14:38 c++filt
-rwxr-xr-x 1 root root      36607 Aug  3  2017 c2ph
-rwxr-xr-x 1 root root        224 May 15 05:19 c89
-rwxr-xr-x 1 root root        215 May 15 05:19 c99
-rwxr-xr-x 1 root root        743 Dec 29  2015 cagefs_enter.proxied
-rwxr-xr-x 1 root root      33616 Apr 11 15:50 cal
lrwxrwxrwx 1 root root          3 Sep 12 18:57 captoinfo -> tic
-rwxr-xr-x 1 root root      54080 Apr 11 13:35 cat
-rwxr-xr-x 1 root root       3336 Jun  1 23:48 catchsegv
lrwxrwxrwx 1 root root          3 Sep 12 18:57 cc -> gcc
-rwxr-xr-x 1 root root      62928 Apr 11 13:35 chcon
-rwxr-xr-x 1 root root      62792 Apr 11 13:35 chgrp
-rwxr-xr-x 1 root root      58584 Apr 11 13:35 chmod
-rwxr-xr-x 1 root root      62840 Apr 11 13:35 chown
-rwxr-xr-x 1 root root      32992 Apr 11 15:50 chrt
-rwxr-xr-x 1 root root      33136 Apr 11 13:35 cksum
-rwxr-xr-x 1 root root       7044 Jul  2 23:32 cldetect
-rwxr-xr-x 1 root root       7192 Sep  7  2017 clear
-rwxr-xr-x 1 root root      54504 Dec  9  2017 clusterdb
-rwxr-xr-x 1 root root      45184 Jun 10  2014 cmp
-rwxr-xr-x 1 root root      24504 Apr 11 15:50 col
-rwxr-xr-x 1 root root      11632 Apr 11 15:50 colcrt
-rwxr-xr-x 1 root root      20288 Apr 11 15:50 colrm
-rwxr-xr-x 1 root root      28680 Apr 11 15:50 column
lrwxrwxrwx 1 root root          9 Sep 12 18:57 combinediff -> interdiff
-rwxr-xr-x 1 root root      37408 Apr 11 13:35 comm
-rwxr-xr-x 1 root root     155176 Apr 11 13:35 cp
-rwxr-xr-x 1 root root       5094 Aug  3  2017 cpan
-rwxr-xr-x 1 root root     772720 May 15 05:19 cpp
-rwxr-xr-x 1 root root      54544 Dec  9  2017 createdb
-rwxr-xr-x 1 root root      58456 Dec  9  2017 createlang
-rwxr-xr-x 1 root root      59000 Dec  9  2017 createuser
-rwxr-xr-x 1 root root        935 Apr 11 10:48 crontab
-rwxr-xr-x 1 root root      50384 Jun 26 17:11 crontab.cagefs
-rwxr-xr-x 1 root root      49992 Apr 11 13:35 csplit
-rwxr-xr-x 1 root root     243704 Jun 10  2014 ctags
-rwxr-xr-x 1 root root     156736 Apr 13 02:39 curl
-rwxr-xr-x 1 root root      41568 Apr 11 13:35 cut
-rwxr-xr-x 1 root root      62200 Apr 11 13:35 date
-rwxr-xr-x 1 root root       6293 Jun 10  2014 dbiprof
-rwxr-xr-x 1 root root       5474 Jun 10  2014 dbiproxy
-rwxr-xr-x 1 root root      74896 Apr 11 13:35 dd
-rwxr-xr-x 1 root root       1351 Jun 10  2014 dehtmldiff
-rwxr-xr-x 1 root root     100896 Apr 11 13:35 df
-rwxr-xr-x 1 root root     200104 Jun 10  2014 diff
-rwxr-xr-x 1 root root      62072 Jun 10  2014 diff3
-rwxr-xr-x 1 root root     117672 Apr 11 13:35 dir
-rwxr-xr-x 1 root root      41416 Apr 11 13:35 dircolors
-rwxr-xr-x 1 root root      28992 Apr 11 13:35 dirname
-rwxr-xr-x 1 root root      11312 Aug  6  2015 dltest
-rwxr-xr-x 1 root root      54352 Dec  9  2017 dropdb
-rwxr-xr-x 1 root root      58448 Dec  9  2017 droplang
-rwxr-xr-x 1 root root      54328 Dec  9  2017 dropuser
-rwxr-xr-x 1 root root     112960 Apr 11 13:35 du
-rwxr-xr-x 1 root root       1026 Sep  7  2017 dvipdf
-rwxr-xr-x 1 root root      33072 Apr 11 13:35 echo
-rwxr-xr-x 1 root root      49848 Jun 10  2014 ed
-rwxr-xr-x 1 root root       2047 Jun 10  2014 editdiff
-rwxr-xr-x 1 root root        290 Aug  3  2017 egrep
-rwxr-xr-x 1 root root      39153 Jun 10  2014 enc2xs
-rwxr-xr-x 1 root root      15656 Jun 10  2014 enchant
-rwxr-xr-x 1 root root      11400 Jun 10  2014 enchant-lsmod
-rwxr-xr-x 1 root root      28992 Apr 11 13:35 env
-rwxr-xr-x 1 root root        638 Sep  7  2017 eps2eps
-rwxr-xr-x 1 root root     147880 Jun 10  2014 eqn
-rwxr-xr-x 1 root root       1563 Jun 10  2014 espdiff
lrwxrwxrwx 1 root root          2 Sep 12 18:57 ex -> vi
-rwxr-xr-x 1 root root      33240 Apr 11 13:35 expand
-rwxr-xr-x 1 root root      37432 Apr 11 13:35 expr
lrwxrwxrwx 1 root root          8 Sep 12 18:57 f95 -> gfortran
-rwxr-xr-x 1 root root      95520 Apr 11 13:35 factor
-rwxr-xr-x 1 root root      28920 Apr 11 13:35 false
-rwxr-xr-x 1 root root      15736 Jun  1  2017 fc-cache
-rwxr-xr-x 1 root root      15672 Jun  1  2017 fc-cat
-rwxr-xr-x 1 root root      11432 Jun  1  2017 fc-list
-rwxr-xr-x 1 root root      11504 Jun  1  2017 fc-match
-rwxr-xr-x 1 root root      11432 Jun  1  2017 fc-pattern
-rwxr-xr-x 1 root root      11392 Jun  1  2017 fc-query
-rwxr-xr-x 1 root root      11440 Jun  1  2017 fc-scan
-rwxr-xr-x 1 root root      11464 Jun  1  2017 fc-validate
-rwxr-xr-x 1 root root        290 Aug  3  2017 fgrep
-rwxr-xr-x 1 root root      19768 Nov  6  2016 file
-rwxr-xr-x 1 root root      46256 Jun 10  2014 filterdiff
-rwxr-xr-x 1 root root     199200 Nov 20  2015 find
-rwxr-xr-x 1 root root      23614 Aug  3  2017 find2perl
-rwxr-xr-x 1 root root       1870 Jun 10  2014 fixcvsdiff
-rwxr-xr-x 1 root root     329664 Jun 10  2014 flex
lrwxrwxrwx 1 root root          4 Sep 12 18:57 flex++ -> flex
lrwxrwxrwx 1 root root          9 Sep 12 18:57 flipdiff -> interdiff
-rwxr-xr-x 1 root root      24504 Apr 11 15:50 flock
-rwxr-xr-x 1 root root      37360 Apr 11 13:35 fmt
-rwxr-xr-x 1 root root      37320 Apr 11 13:35 fold
-rwxr-xr-x 1 root root        311 Sep  7  2017 font2c
-rwxr-xr-x 1 root root      19784 Apr 11 09:42 free
-rwxr-xr-x 1 root root      32128 Apr 11 14:24 funzip
-rwxr-xr-x 1 root root     772744 May 15 05:19 g++
-rwxr-xr-x 1 root root     428584 Jun 29  2017 gawk
-rwxr-xr-x 1 root root     768648 May 15 05:19 gcc
-rwxr-xr-x 1 root root      27136 May 15 05:19 gcc-ar
-rwxr-xr-x 1 root root      27136 May 15 05:19 gcc-nm
-rwxr-xr-x 1 root root      27144 May 15 05:19 gcc-ranlib
-rwxr-xr-x 1 root root     319000 May 15 05:19 gcov
-rwxr-xr-x 1 root root      23136 Jun  2 00:11 gencat
-rwxr-xr-x 1 root root      15648 Nov  6  2016 geoiplookup
-rwxr-xr-x 1 root root      11432 Nov  6  2016 geoiplookup6
-rwxr-xr-x 1 root root      11496 Nov  6  2016 geoipupdate
lrwxrwxrwx 1 root root          3 Sep 12 18:57 geqn -> eqn
-rwxr-xr-x 1 root root      22920 Jun  2 00:11 getconf
-rwxr-xr-x 1 root root      27896 Jun  2 00:11 getent
-rwxr-xr-x 1 root root      15832 Apr 11 15:50 getopt
-rwxr-xr-x 1 root root     772728 May 15 05:19 gfortran
lrwxrwxrwx 1 root root          2 Sep 12 18:57 ghostscript -> gs
-rwxr-xr-x 1 root root    1523768 Jun 25 22:28 git
-rwxr-xr-x 1 root root    1523768 Jun 25 22:28 git-receive-pack
-rwxr-xr-x 1 root root     735200 Jun 25 22:28 git-shell
-rwxr-xr-x 1 root root    1523768 Jun 25 22:28 git-upload-archive
-rwxr-xr-x 1 root root     810440 Jun 25 22:28 git-upload-pack
-rwxr-xr-x 1 root root       7136 Dec 22  2015 gm
lrwxrwxrwx 1 root root          4 Sep 12 18:57 gmake -> make
lrwxrwxrwx 1 root root          4 Sep 12 18:57 gneqn -> neqn
lrwxrwxrwx 1 root root          5 Sep 12 18:57 gnroff -> nroff
lrwxrwxrwx 1 root root          4 Sep 12 18:57 gpg -> gpg2
-rwxr-xr-x 1 root root      23736 Jun 10  2014 gpg-error
-rwxr-xr-x 1 root root       3307 Nov  6  2016 gpg-zip
-rwxr-xr-x 1 root root     749928 Nov  6  2016 gpg2
-rwxr-xr-x 1 root root      49976 Nov  6  2016 gpgsplit
lrwxrwxrwx 1 root root          5 Sep 12 18:57 gpgv -> gpgv2
-rwxr-xr-x 1 root root     353648 Nov  6  2016 gpgv2
lrwxrwxrwx 1 root root          3 Sep 12 18:57 gpic -> pic
-rwxr-xr-x 1 root root     100768 Apr 11 14:38 gprof
-rwxr-xr-x 1 root root     159024 Aug  3  2017 grep
lrwxrwxrwx 1 root root         10 Sep 12 18:57 grepdiff -> filterdiff
-rwxr-xr-x 1 root root      83584 Jun 10  2014 groff
-rwxr-xr-x 1 root root     144232 Jun 10  2014 grops
-rwxr-xr-x 1 root root     100952 Jun 10  2014 grotty
-rwxr-xr-x 1 root root      33200 Apr 11 13:35 groups
-rwxr-xr-x 1 root root      11368 Sep  7  2017 gs
-rwxr-xr-x 1 root root        350 Sep  7  2017 gsbj
-rwxr-xr-x 1 root root        352 Sep  7  2017 gsdj
-rwxr-xr-x 1 root root        352 Sep  7  2017 gsdj500
-rwxr-xr-x 1 root root        353 Sep  7  2017 gslj
-rwxr-xr-x 1 root root        350 Sep  7  2017 gslp
-rwxr-xr-x 1 root root        277 Sep  7  2017 gsnd
lrwxrwxrwx 1 root root          6 Sep 12 18:57 gsoelim -> soelim
lrwxrwxrwx 1 root root          3 Sep 12 18:57 gtar -> tar
lrwxrwxrwx 1 root root          3 Sep 12 18:57 gtbl -> tbl
lrwxrwxrwx 1 root root          5 Sep 12 18:57 gtroff -> troff
-rwxr-xr-x 1 root root       2253 Apr 11 09:01 gunzip
-rwxr-xr-x 1 root root       5931 Apr 11 09:01 gzexe
-rwxr-xr-x 1 root root     100800 Apr 11 09:01 gzip
-rwxr-xr-x 1 root root      28310 Aug  3  2017 h2ph
-rwxr-xr-x 1 root root      60565 Aug  3  2017 h2xs
-rwxr-xr-x 1 root root      41472 Apr 11 13:35 head
-rwxr-xr-x 1 root root      32840 Apr 11 15:50 hexdump
-rwxr-xr-x 1 root root      28984 Apr 11 13:35 hostid
-rwxr-xr-x 1 root root      15768 Jun 10  2014 hostname
-rwxr-xr-x 1 root root      54368 Nov  6  2016 hunspell
-rwxr-xr-x 1 root root      60376 Jun  2 00:11 iconv
-rwxr-xr-x 1 root root      41480 Apr 11 13:35 id
-rwxr-xr-x 1 root root      33232 Nov 22  2015 idn
-rwxr-xr-x 1 root root       4128 Jun 10  2014 ifnames
-rwxr-xr-x 1 root root       3188 Jun 29  2017 igawk
-rwxr-xr-x 1 root root      57416 Sep  7  2017 infocmp
lrwxrwxrwx 1 root root          3 Sep 12 18:57 infotocap -> tic
-rwxr-xr-x 1 root root     142920 Apr 11 13:35 install
-rwxr-xr-x 1 root root       4247 Jun 10  2014 instmodsh
-rwxr-xr-x 1 root root      49856 Jun 10  2014 interdiff
-rwxr-xr-x 1 root root      24512 Apr 11 15:50 ionice
-rwxr-xr-x 1 root root      24464 Apr 11 15:50 ipcrm
-rwxr-xr-x 1 root root      49592 Apr 11 15:50 ipcs
-rwxr-xr-x 1 root root      24432 Apr 11 15:50 isosize
-rwxr-xr-x 1 root root        988 Jun 10  2014 ispell
-rwxr-xr-x 1 root root      32432 Aug  6  2015 isql
-rwxr-xr-x 1 root root      24152 Aug  6  2015 iusql
-rwxr-xr-x 1 root root      49896 Apr 11 13:35 join
-rwxr-xr-x 1 root root      29544 Apr 11 15:50 kill
lrwxrwxrwx 1 root root         20 Sep 12 18:57 ld -> /etc/alternatives/ld
-rwxr-xr-x 1 root root    1006184 Apr 11 14:38 ld.bfd
-rwxr-xr-x 1 root root       5302 Jun  1 23:48 ldd
-rwxr-xr-x 1 root root     158240 Jul 31  2015 less
-rwxr-xr-x 1 root root      11376 Jul 31  2015 lessecho
-rwxr-xr-x 1 root root      17056 Jul 31  2015 lesskey
-rwxr-xr-x 1 root root       2291 Jul 31  2015 lesspipe.sh
lrwxrwxrwx 1 root root          4 Sep 12 18:57 lex -> flex
-rwxr-xr-x 1 root root      15724 Aug  3  2017 libnetcfg
-rwxr-xr-x 1 root root     321577 Apr 13  2017 libtool
-rwxr-xr-x 1 root root      78648 Apr 13  2017 libtoolize
-rwxr-xr-x 1 root root      28984 Apr 11 13:35 link
-rwxr-xr-x 1 root root      58608 Apr 11 13:35 ln
-rwxr-xr-x 1 root root      38720 Jun  2 00:11 locale
-rwxr-xr-x 1 root root     322928 Jun  2 00:11 localedef
-rwxr-xr-x 1 root root      29328 Apr 11 15:50 logger
-rwxr-xr-x 1 root root      37304 Apr 11 15:50 login
-rwxr-xr-x 1 root root      28984 Apr 11 13:35 logname
-rwxr-xr-x 1 root root      11616 Apr 11 15:50 look
-rwxr-xr-x 1 root root       4608 Sep  7  2017 lprsetup.sh
-rwxr-xr-x 1 root root     117672 Apr 11 13:35 ls
lrwxrwxrwx 1 root root         10 Sep 12 18:57 lsdiff -> filterdiff
-rwxr-xr-x 1 root root     154800 Nov 20  2015 m4
-rwxr-xr-x 1 root root     182776 Nov  6  2016 make
-rwxr-xr-x 1 root root      15896 Apr 11 15:50 mcookie
-rwxr-xr-x 1 root root      41504 Apr 11 13:35 md5sum
-rwxr-xr-x 1 root root      11240 Jun 10  2014 mesg
-rwxr-xr-x 1 root root      79760 Apr 11 13:35 mkdir
-rwxr-xr-x 1 root root      63064 Apr 11 13:35 mkfifo
-rwxr-xr-x 1 root root      67192 Apr 11 13:35 mknod
-rwxr-xr-x 1 root root      41632 Apr 11 13:35 mktemp
-rwxr-xr-x 1 root root      41192 Apr 11 15:50 more
-rwxr-xr-x 1 root root     130344 Apr 11 13:35 mv
-rwxr-xr-x 1 root root    5606560 Mar  4  2018 my_print_defaults
-rwxr-xr-x 1 root root   11151376 Mar  4  2018 mysql
-rwxr-xr-x 1 root root        840 Mar  4  2018 mysql_config
-rwxr-xr-x 1 root root    9889493 Mar  4  2018 mysqladmin
-rwxr-xr-x 1 root root   11880582 Mar  4  2018 mysqlbinlog
-rwxr-xr-x 1 root root   10184976 Mar  4  2018 mysqlcheck
-rwxr-xr-x 1 root root   10259124 Mar  4  2018 mysqldump
-rwxr-xr-x 1 root root    9875732 Mar  4  2018 mysqlimport
-rwxr-xr-x 1 root root    9833986 Mar  4  2018 mysqlshow
-rwxr-xr-x 1 root root      28672 Apr 11 15:50 namei
-rwxr-xr-x 1 root root        271 Jun 10  2014 neqn
-rwxr-xr-x 1 root root       1328 May 15 22:06 net-snmp-config
-rwxr-xr-x 1 root root      30163 May 15 22:06 net-snmp-config-x86_64
-rwxr-xr-x 1 root root       3049 May 15 22:06 net-snmp-create-v3-user
-rwxr-xr-x 1 root root      33104 Apr 11 13:35 nice
-rwxr-xr-x 1 root root      41568 Apr 11 13:35 nl
-rwxr-xr-x 1 root root      42392 Apr 11 14:38 nm
-rwxr-xr-x 1 root root      33184 Apr 11 13:35 nohup
-rwxr-xr-x 1 root root      33128 Apr 11 13:35 nproc
-rwxr-xr-x 1 root root       3392 Jun 10  2014 nroff
-rwxr-xr-x 1 root root      66264 Apr 11 13:35 numfmt
-rwxr-xr-x 1 root root     232776 Apr 11 14:38 objcopy
-rwxr-xr-x 1 root root     366288 Apr 11 14:38 objdump
-rwxr-xr-x 1 root root      66368 Apr 11 13:35 od
-rwxr-xr-x 1 root root      11288 Aug  6  2015 odbc_config
-rwxr-xr-x 1 root root      28328 Aug  6  2015 odbcinst
-rwxr-xr-x 1 root root     555296 Apr 11 13:58 openssl
-rwxr-xr-x 1 root root      50616 Jun  3  2017 pango-view
-rwxr-xr-x 1 root root        737 Jun 10  2014 passwd
-rwxr-xr-x 1 root root      33120 Apr 11 13:35 paste
-rwxr-xr-x 1 root root     150624 Apr 24 04:34 patch
-rwxr-xr-x 1 root root      33088 Apr 11 13:35 pathchk
-rwxr-xr-x 1 root root        698 Sep  7  2017 pdf2dsc
-rwxr-xr-x 1 root root        909 Sep  7  2017 pdf2ps
-rwxr-xr-x 1 root root      11408 Aug  3  2017 perl
-rwxr-xr-x 1 root root      11408 Aug  3  2017 perl5.16.3
-rwxr-xr-x 1 root root      43873 Aug  3  2017 perlbug
-rwxr-xr-x 1 root root      42526 Jun 10  2014 perlcritic
-rwxr-xr-x 1 root root        203 Jun 10  2014 perldoc
-rwxr-xr-x 1 root root      10772 Aug  3  2017 perlivp
-rwxr-xr-x 1 root root      43873 Aug  3  2017 perlthanks
-rwxr-xr-x 1 root root     116926 Jun 10  2014 perltidy
-rwxr-xr-x 1 root root      10527 Jun 10  2014 perlver
-rwxr-xr-x 1 root root        498 Sep  7  2017 pf2afm
-rwxr-xr-x 1 root root        516 Sep  7  2017 pfbtopfa
-rwxr-xr-x 1 root root     313144 Dec  9  2017 pg_dump
-rwxr-xr-x 1 root root      75664 Dec  9  2017 pg_dumpall
-rwxr-xr-x 1 root root     129904 Dec  9  2017 pg_restore
-rwxr-xr-x 1 root root     428672 Jun 29  2017 pgawk
-rwxr-xr-x 1 root root      28336 Apr 11 09:42 pgrep
lrwxrwxrwx 1 root root         24 Jul 23 21:37 php -> /etc/cl.selector/php-cli
lrwxrwxrwx 1 root root         20 Jul 23 21:37 php-cgi -> /etc/cl.selector/php
-rwxr-xr-x 1 root root       4524 Apr 19 21:19 php-config
-rwxr-xr-x 1 root root       4760 Apr 19 21:19 phpize
-rwxr-xr-x 1 root root     184736 Jun 10  2014 pic
-rwxr-xr-x 1 root root       8177 Jun 10  2014 piconv
-rwxr-xr-x 1 root root        735 Aug  4  2017 ping
-rwxr-xr-x 1 root root      37448 Apr 11 13:35 pinky
-rwxr-xr-x 1 root root      45448 Jun 10  2014 pkg-config
-rwxr-xr-x 1 root root      28336 Apr 11 09:42 pkill
-rwxr-xr-x 1 root root       4531 Aug  3  2017 pl2pm
-rwxr-xr-x 1 root root      28264 Apr 11 09:42 pmap
-rwxr-xr-x 1 root root       4096 Aug  3  2017 pod2html
-rwxr-xr-x 1 root root      10340 Jun 10  2014 pod2latex
-rwxr-xr-x 1 root root      13581 Jun 10  2014 pod2man
-rwxr-xr-x 1 root root      11004 Jun 10  2014 pod2text
-rwxr-xr-x 1 root root       3755 Jun 10  2014 pod2usage
-rwxr-xr-x 1 root root       3784 Jun 10  2014 podchecker
-rwxr-xr-x 1 root root       2612 Jun 10  2014 podselect
-rwxr-xr-x 1 root root     192048 Jun 10  2014 post-grohtml
-rwxr-xr-x 1 root root        404 Sep  7  2017 pphs
-rwxr-xr-x 1 root root      66664 Apr 11 13:35 pr
-rwxr-xr-x 1 root root      88312 Jun 10  2014 pre-grohtml
-rwxr-xr-x 1 root root       5656 Jun 10  2014 precat
-rwxr-xr-x 1 root root       5656 Jun 10  2014 preunzip
-rwxr-xr-x 1 root root       5656 Jun 10  2014 prezip
-rwxr-xr-x 1 root root      11320 Jun 10  2014 prezip-bin
-rwxr-xr-x 1 root root        395 Sep  7  2017 printafm
-rwxr-xr-x 1 root root      28976 Apr 11 13:35 printenv
-rwxr-xr-x 1 root root      49776 Apr 11 13:35 printf
-rwxr-xr-x 1 root root      13444 Aug 12  2015 prove
-rwxr-xr-x 1 root root     100120 Apr 11 09:42 ps
-rwxr-xr-x 1 root root        740 Sep  7  2017 ps2ascii
-rwxr-xr-x 1 root root       2794 Sep  7  2017 ps2epsi
-rwxr-xr-x 1 root root        272 Sep  7  2017 ps2pdf
-rwxr-xr-x 1 root root        215 Sep  7  2017 ps2pdf12
-rwxr-xr-x 1 root root        215 Sep  7  2017 ps2pdf13
-rwxr-xr-x 1 root root        215 Sep  7  2017 ps2pdf14
-rwxr-xr-x 1 root root       1097 Sep  7  2017 ps2pdfwr
-rwxr-xr-x 1 root root        647 Sep  7  2017 ps2ps
-rwxr-xr-x 1 root root        669 Sep  7  2017 ps2ps2
-rwxr-xr-x 1 root root      53329 Aug  3  2017 psed
-rwxr-xr-x 1 root root     449288 Dec  9  2017 psql
-rwxr-xr-x 1 root root      36607 Aug  3  2017 pstruct
-rwxr-xr-x 1 root root      66648 Apr 11 13:35 ptx
-rwxr-xr-x 1 root root      33232 Apr 11 13:35 pwd
-rwxr-xr-x 1 root root      11528 Apr 11 09:42 pwdx
-rwxr-xr-x 1 root root      62680 Apr 11 14:38 ranlib
-rwxr-xr-x 1 root root      11624 Apr 11 15:50 raw
-rwxr-xr-x 1 root root     517936 Apr 11 14:38 readelf
-rwxr-xr-x 1 root root      41800 Apr 11 13:35 readlink
-rwxr-xr-x 1 root root      62704 Apr 11 13:35 realpath
-rwxr-xr-x 1 root root      40824 Jun 10  2014 recode
-rwxr-xr-x 1 root root       3436 Jun 10  2014 recountdiff
-rwxr-xr-x 1 root root         89 Jun 10  2014 red
-rwxr-xr-x 1 root root      36880 Jun 10  2014 rediff
-rwxr-xr-x 1 root root      58624 Dec  9  2017 reindexdb
-rwxr-xr-x 1 root root      11600 Apr 11 15:50 rename
-rwxr-xr-x 1 root root      11552 Apr 11 15:50 renice
lrwxrwxrwx 1 root root          4 Sep 12 18:57 reset -> tset
-rwxr-xr-x 1 root root      11600 Apr 11 15:50 rev
-rwxr-xr-x 1 root root      62864 Apr 11 13:35 rm
-rwxr-xr-x 1 root root      45536 Apr 11 13:35 rmdir
-rwxr-xr-x 1 root root      93144 Jun  2 00:11 rpcgen
-rwxr-xr-x 1 root root         85 Jun 10  2014 run-with-aspell
-rwxr-xr-x 1 root root      33256 Apr 11 13:35 runcon
lrwxrwxrwx 1 root root          2 Sep 12 18:57 rvi -> vi
lrwxrwxrwx 1 root root          2 Sep 12 18:57 rview -> vi
lrwxrwxrwx 1 root root          3 Sep 12 18:57 rvim -> vim
-rwxr-xr-x 1 root root      53329 Aug  3  2017 s2p
-rwxr-xr-x 1 root root      91408 Apr 11 13:21 scp
-rwxr-xr-x 1 root root      20152 Apr 11 15:50 script
-rwxr-xr-x 1 root root      49528 Jun 10  2014 sdiff
-rwxr-xr-x 1 root root      76016 Jun 10  2014 sed
-rwxr-xr-x 1 root root       5817 Jun 25 18:35 selectorctl
-rwxr-xr-x 1 root root      49632 Apr 11 13:35 seq
-rwxr-xr-x 1 root root      11560 Apr 11 15:50 setsid
-rwxr-xr-x 1 root root      28224 Apr 11 15:50 setterm
-rwxr-xr-x 1 root root     145440 Apr 11 13:21 sftp
lrwxrwxrwx 1 root root          4 Sep 12 18:57 sh -> bash
-rwxr-xr-x 1 root root      37448 Apr 11 13:35 sha1sum
-rwxr-xr-x 1 root root      41600 Apr 11 13:35 sha224sum
-rwxr-xr-x 1 root root      41600 Apr 11 13:35 sha256sum
-rwxr-xr-x 1 root root      41592 Apr 11 13:35 sha384sum
-rwxr-xr-x 1 root root      41592 Apr 11 13:35 sha512sum
-rwxr-xr-x 1 root root      54216 Apr 11 13:35 shred
-rwxr-xr-x 1 root root      50320 Apr 11 13:35 shuf
-rwxr-xr-x 1 root root      33128 Apr 11 14:38 size
-rwxr-xr-x 1 root root      24184 Apr 11 09:42 skill
-rwxr-xr-x 1 root root      19984 Apr 11 09:42 slabtop
-rwxr-xr-x 1 root root      33120 Apr 11 13:35 sleep
lrwxrwxrwx 1 root root          5 Sep 12 18:57 slogin -> ./ssh
-rwxr-xr-x 1 root root      24184 Apr 11 09:42 snice
-rwxr-xr-x 1 root root      26137 May 15 22:06 snmpconf
-rwxr-xr-x 1 root root      33368 Jun 10  2014 soelim
-rwxr-xr-x 1 root root     117728 Apr 11 13:35 sort
-rwxr-xr-x 1 root root        122 Jun 10  2014 spell
-rwxr-xr-x 1 root root      18459 Aug  3  2017 splain
-rwxr-xr-x 1 root root      71128 Apr 11 13:35 split
-rwxr-xr-x 1 root root       3186 Jun 10  2014 splitdiff
-rwxr-xr-x 1 root root      23224 Jun  2 00:11 sprof
-rwxr-xr-x 1 root root      56240 Nov 20  2015 sqlite3
-rwxr-xr-x 1 root root     778736 Apr 11 13:21 ssh
-rwxr-xr-x 1 root root     360944 Apr 11 13:21 ssh-add
---x--x--x 1 root nobody   382240 Apr 11 13:21 ssh-agent
-rwxr-xr-x 1 root root      10469 Apr 11 13:21 ssh-copy-id
-rwxr-xr-x 1 root root     419240 Apr 11 13:21 ssh-keygen
-rwxr-xr-x 1 root root     445152 Apr 11 13:21 ssh-keyscan
-rwxr-xr-x 1 root root      74904 Apr 11 13:35 stat
-rwxr-xr-x 1 root root      66448 Apr 11 13:35 stdbuf
-rwxr-xr-x 1 root root     646168 Apr 11 16:10 strace
-rwxr-xr-x 1 root root      29112 Apr 11 14:38 strings
-rwxr-xr-x 1 root root     232776 Apr 11 14:38 strip
-rwxr-xr-x 1 root root      70272 Apr 11 13:35 stty
-rwxr-xr-x 1 root root      37432 Apr 11 13:35 sum
-rwxr-xr-x 1 root root      28976 Apr 11 13:35 sync
-rwxr-xr-x 1 root root      15680 Sep  7  2017 tabs
-rwxr-xr-x 1 root root      33256 Apr 11 13:35 tac
-rwxr-xr-x 1 root root      66816 Apr 11 13:35 tail
-rwxr-xr-x 1 root root      24496 Apr 11 15:50 tailf
-rwxr-xr-x 1 root root     346080 Apr 11 11:11 tar
-rwxr-xr-x 1 root root      28952 Apr 11 15:50 taskset
-rwxr-xr-x 1 root root     118744 Jun 10  2014 tbl
lrwxrwxrwx 1 root root          8 Sep 12 18:57 tclsh -> tclsh8.5
-rwxr-xr-x 1 root root       7168 Nov 20  2015 tclsh8.5
-rwxr-xr-x 1 root root      33160 Apr 11 13:35 tee
-rwxr-xr-x 1 root root      37328 Apr 11 13:35 test
-rwxr-xr-x 1 root root      65800 Sep  7  2017 tic
-rwxr-xr-x 1 root root      15920 Jun 12  2014 time
-rwxr-xr-x 1 root root      54592 Apr 11 13:35 timeout
-rwxr-xr-x 1 root root      15736 Apr 11 09:42 tload
lrwxrwxrwx 1 root root         23 Sep 12 18:57 tmpwatch -> ../../usr/sbin/tmpwatch
-rwxr-xr-x 1 root root      15800 Sep  7  2017 toe
-rwxr-xr-x 1 root root     106848 Apr 11 09:42 top
-rwxr-xr-x 1 root root      62488 Apr 11 13:35 touch
-rwxr-xr-x 1 root root      15784 Sep  7  2017 tput
-rwxr-xr-x 1 root root      45656 Apr 11 13:35 tr
-rwxr-xr-x 1 root root     525272 Jun 10  2014 troff
-rwxr-xr-x 1 root root      28920 Apr 11 13:35 true
-rwxr-xr-x 1 root root      53936 Apr 11 13:35 truncate
-rwxr-xr-x 1 root root      20072 Sep  7  2017 tset
-rwxr-xr-x 1 root root      37344 Apr 11 13:35 tsort
-rwxr-xr-x 1 root root      28960 Apr 11 13:35 tty
-rwxr-xr-x 1 root root       7339 Jun  1 23:47 tzselect
-rwxr-xr-x 1 root root      20016 Apr 11 15:50 ul
-rwxr-xr-x 1 root root      33080 Apr 11 13:35 uname
-rwxr-xr-x 1 root root      33240 Apr 11 13:35 unexpand
-rwxr-xr-x 1 root root      45784 Apr 11 13:35 uniq
-rwxr-xr-x 1 root root       4165 Sep  7  2017 unix-lpr.sh
-rwxr-xr-x 1 root root      28984 Apr 11 13:35 unlink
-rwxr-xr-x 1 root root       5940 Jun 10  2014 unwrapdiff
-rwxr-xr-x 1 root root     185488 Apr 11 14:24 unzip
-rwxr-xr-x 1 root root      90736 Apr 11 14:24 unzipsfx
-rwxr-xr-x 1 root root      11480 Apr 11 09:42 uptime
-rwxr-xr-x 1 root root      33192 Apr 11 13:35 users
-rwxr-xr-x 1 root root      15896 Apr 11 15:50 utmpdump
-rwxr-xr-x 1 root root      58728 Dec  9  2017 vacuumdb
-rwxr-xr-x 1 root root     117672 Apr 11 13:35 vdir
-rwxr-xr-x 1 root root     910072 Apr 11 08:54 vi
lrwxrwxrwx 1 root root          2 Sep 12 18:57 view -> vi
-rwxr-xr-x 1 root root    2294256 Apr 11 08:54 vim
lrwxrwxrwx 1 root root          3 Sep 12 18:57 vimdiff -> vim
-rwxr-xr-x 1 root root       2084 Apr 11 08:54 vimtutor
-rwxr-xr-x 1 root root         54 May 11 02:26 virtualenv
-rwxr-xr-x 1 root root      32224 Apr 11 09:42 vmstat
-rwxr-xr-x 1 root root      24720 Apr 11 09:42 watch
-rwxr-xr-x 1 root root      41640 Apr 11 13:35 wc
-rwxr-xr-x 1 root root        286 Sep  7  2017 wftopfa
-rwxr-xr-x 1 root root     418736 Oct 27  2017 wget
-rwxr-xr-x 1 root root      20720 Apr 11 15:50 whereis
-rwxr-xr-x 1 root root      24336 Jun 10  2014 which
-rwxr-xr-x 1 root root      49872 Apr 11 13:35 who
-rwxr-xr-x 1 root root      28984 Apr 11 13:35 whoami
-rwxr-xr-x 1 root root      11296 Jun 10  2014 word-list-compress
-rwxr-xr-x 1 root root     772744 May 15 05:19 x86_64-redhat-linux-c++
-rwxr-xr-x 1 root root     772744 May 15 05:19 x86_64-redhat-linux-g++
-rwxr-xr-x 1 root root     768648 May 15 05:19 x86_64-redhat-linux-gcc
-rwxr-xr-x 1 root root      62288 Nov 20  2015 xargs
-rwxr-xr-x 1 root root      19752 Jun 23  2016 xmlcatalog
-rwxr-xr-x 1 root root      63408 Jun 23  2016 xmllint
-rwxr-xr-x 1 root root      24568 Nov 29  2016 xmlwf
-rwxr-xr-x 1 root root      24056 Sep 15  2014 xsltproc
-rwxr-xr-x 1 root root       4557 Aug  2  2017 xsubpp
-rwxr-xr-x 1 root root      14768 Apr 11 08:54 xxd
-rwxr-xr-x 1 root root      86504 Jun 10  2014 yacc
-rwxr-xr-x 1 root root      28976 Apr 11 13:35 yes
-rwxr-xr-x 1 root root       1941 Apr 11 09:01 zcat
-rwxr-xr-x 1 root root       1760 Apr 11 09:01 zcmp
-rwxr-xr-x 1 root root       5768 Apr 11 09:01 zdiff
-rwxr-xr-x 1 root root        123 Apr 11 09:01 zegrep
-rwxr-xr-x 1 root root        123 Apr 11 09:01 zfgrep
-rwxr-xr-x 1 root root       2144 Apr 11 09:01 zforce
-rwxr-xr-x 1 root root       6132 Apr 11 09:01 zgrep
-rwxr-xr-x 1 root root     215840 Nov  6  2016 zip
-rwxr-xr-x 1 root root     100456 Nov  6  2016 zipcloak
-rwxr-xr-x 1 root root       2953 Oct 11  2008 zipgrep
-rwxr-xr-x 1 root root     185488 Apr 11 14:24 zipinfo
-rwxr-xr-x 1 root root      95984 Nov  6  2016 zipnote
-rwxr-xr-x 1 root root     100096 Nov  6  2016 zipsplit
-rwxr-xr-x 1 root root       2041 Apr 11 09:01 zless
-rwxr-xr-x 1 root root       2859 Apr 11 09:01 zmore
-rwxr-xr-x 1 root root       5343 Apr 11 09:01 znew
-rwxr-xr-x 1 root root     736320 Aug  2  2017 zsh
lrwxrwxrwx 1 root root          6 Sep 12 18:57 zsoelim -> soelim

sbinのほうはこう。

lrwxrwxrwx 1 root root    8 Jul 23 21:37 /sbin -> usr/sbin

/usr/sbin:
total 892
-rwxr-xr-x 1 root root      33240 Apr 11 13:35 chroot
-rwxr-xr-x 1 root root        302 Jul  2 23:42 cloudlinux-selector
-rwxr-xr-x 1 root root       7096 Apr 11 14:09 consoletype
-rwxr-xr-x 1 root root       7208 Jun 10  2014 cracklib-check
-rwxr-xr-x 1 root root        246 Jun 10  2014 cracklib-format
-rwxr-xr-x 1 root root      11328 Jun 10  2014 cracklib-packer
-rwxr-xr-x 1 root root       7184 Jun 10  2014 cracklib-unpacker
-rwxr-xr-x 1 root root        990 Jun 10  2014 create-cracklib-dict
-rwxr-xr-x 1 root root      15368 Apr 11 12:22 faillock
-rwxr-xr-x 1 root root      19496 Apr 11 12:22 mkhomedir_helper
-rwxr-xr-x 1 root root      40640 Apr 11 12:22 pam_console_apply
-rwxr-xr-x 1 root root      15400 Apr 11 12:22 pam_tally2
-rwxr-xr-x 1 root root      11216 Apr 11 12:22 pam_timestamp_check
-rwxr-xr-x 1 root root      15592 Apr 11 13:20 pluginviewer
-rwxr-xr-x 1 root postdrop 218552 Jun 10  2014 postdrop
-r-xr-xr-x 1 root root      20264 Dec 28  2015 proxyexec
-rwxr-xr-x 1 root root      15808 Apr 11 12:22 pwhistory_helper
-rwxr-xr-x 1 root root      11344 Jun 10  2014 safe_finger
-rwxr-xr-x 1 root root      94832 Apr 11 13:20 saslauthd
-rwxr-xr-x 1 root root      19720 Apr 11 13:20 sasldblistusers2
-rwxr-xr-x 1 root root      15448 Apr 11 13:20 saslpasswd2
-rwxr-xr-x 1 root root        806 Jun 10  2014 sendmail
-rwxr-xr-x 1 root root      31888 May 15 22:07 snmpd
-rwxr-xr-x 1 root root      32048 May 15 22:07 snmptrapd
-rwxr-xr-x 1 root root      37496 Jun 10  2014 tcpd
-rwxr-xr-x 1 root root      41808 Jun 10  2014 tcpdmatch
-rwxr-xr-x 1 root root      15448 Apr 11 13:20 testsaslauthd
-rwxr-xr-x 1 root root      28448 Jun 10  2014 tmpwatch
-rwxr-xr-x 1 root root      24032 Jun 10  2014 try-from
-rwxr-xr-x 1 root root      36280 Apr 11 12:22 unix_chkpwd
-rwx------ 1 root root      36272 Apr 11 12:22 unix_update

結構色々ある。curlなんかもあるし、vimもあるし、zshも入っている。 だが、管理系のプログラムがない。

ユーザー固有の環境 iproute, sudo, iptablesなどは叩けない
ディストリビューションはRHEL7

/homeは自身単独のディレクトリになっていて、passwdを見て見も他のユーザーの情報がない。

iproute2は入っておらず、ifconfigもない。iptablesも叩けない。 だが、OpenSSHはあるので踏み台にすることはできる模様(レンサバでやる意味は不明)。

OSはLinuxで、RedHat Enterprise Linux 7であることがわかる。 sbinのほうにcloudlinux-selectorというのがあるので、多分GMOインターネットのグループ企業であるGMOクラウドで作っているCloud Linux上で動作しているのだろう。割とテクノロジー盛り盛り。オラわくわくしてきたっぞ。

CPU情報を見てみると、Xeon E5-2640 v4が6コアだった。 なにそれ超贅沢。

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping    : 1
microcode   : 0xb00002e
cpu MHz     : 1781.906
cache size  : 25600 KB
physical id : 0
siblings    : 20
core id     : 0
cpu cores   : 10
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_pt spec_ctrl ibpb_support tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bogomips    : 4794.07
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping    : 1
microcode   : 0xb00002e
cpu MHz     : 2752.031
cache size  : 25600 KB
physical id : 1
siblings    : 20
core id     : 0
cpu cores   : 10
apicid      : 32
initial apicid  : 32
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_pt spec_ctrl ibpb_support tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bogomips    : 4799.21
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping    : 1
microcode   : 0xb00002e
cpu MHz     : 1842.468
cache size  : 25600 KB
physical id : 0
siblings    : 20
core id     : 1
cpu cores   : 10
apicid      : 2
initial apicid  : 2
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_pt spec_ctrl ibpb_support tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bogomips    : 4794.07
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping    : 1
microcode   : 0xb00002e
cpu MHz     : 3029.343
cache size  : 25600 KB
physical id : 1
siblings    : 20
core id     : 1
cpu cores   : 10
apicid      : 34
initial apicid  : 34
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_pt spec_ctrl ibpb_support tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bogomips    : 4799.21
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor   : 4
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping    : 1
microcode   : 0xb00002e
cpu MHz     : 3303.281
cache size  : 25600 KB
physical id : 0
siblings    : 20
core id     : 2
cpu cores   : 10
apicid      : 4
initial apicid  : 4
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_pt spec_ctrl ibpb_support tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bogomips    : 4794.07
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor   : 5
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
stepping    : 1
microcode   : 0xb00002e
cpu MHz     : 2656.031
cache size  : 25600 KB
physical id : 1
siblings    : 20
core id     : 2
cpu cores   : 10
apicid      : 36
initial apicid  : 36
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single intel_pt spec_ctrl ibpb_support tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bogomips    : 4799.21
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

ちなみにVPSのほうはXeon E5-2650なのだが、v3と世代がひとつ違うため性能はWINGのほうが上だ。

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
stepping        : 2
microcode       : 0x1
cpu MHz         : 2294.686
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 
clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good 
nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt 
tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase 
tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips        : 4591.59
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
stepping        : 2
microcode       : 0x1
cpu MHz         : 2294.686
cache size      : 4096 KB
physical id     : 1
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 
clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good 
nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt 
tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase 
tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips        : 4591.59
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

デバイスファイルはすごく絞られていて、ディスクデバイスが見えない(!)し、/dev/randomも見えない。 メモリはなんと128GB(!!!!)もある。使用量は相当余裕があるようだった。多分まだ収容サイト数が少ないのだろう。

devfsやprocfsは限定的、sysfsはアクセス不可

procfsはごく一部だけ見える。sysfsはマウントされておらず見えない。 プロセステーブルも読めるのはユーザーのものだけだった。

所感

Mimir Yokohamaのお客様でウェブとメールだけ欲しい方は結構多いのだけど、VPSでやるとどうしても管理にコストがかかるため費用が割と高い。 Conoha WINGのサービスを見ていて思ったのは、「もしかしてこれでサービス品質の向上とコストダウンができるのでは?」ということだった。

性能に関しては間違いないだろうと考えていたのだけど、問題はセキュリティだった。 私としては並のセキュリティではうちで提供するサービスとして納得できない。今まで私が個人的に使ってきたレンタルサーバーもどれも潜在的に攻撃可能なものばかりであった。 私が提供するサービスは堅牢なセキュリティが魅力のひとつだ。もしセキュリティが甘ければ採用できない。逆にセキュリティがしっかりしていれば、これは私にとって、そしてMimir Yokohamaにとって大きな武器になる。

果たして、そのセキュリティは申し分ないものであった。 気になる点としてはOpenSSHクライアントが叩けるようになっているのは好ましくないが、基本的には何もできない。 gccがあるのでCで直接叩くようにすれば触れる可能性もあるが、おそらくcgroupsによって隔離されているものなので試す価値は乏しいだろう (もっとも、実際にサービスとして始めるとなったら私は確認するけれども)。

つまりConoHa WINGとは

  • 爆速。これより高速な構成はコストの桁が変わるレベルには爆速
  • WordPressとEC-Cubeに関してはとても簡単。 メールとSSLも簡単
  • セキュリティは非常に堅牢。安心して使える
  • レンサバとしてはお値段はちょっとお高め。といっても機能や性能を求めた場合はその限りではない

「爆速」「簡単」「安全」が揃っていれば、さすがにちょっと高い程度なら全然受け入れられるという人も多いのではないだろうか。 個人的な趣味のサイトでは高いかもしれないが、事業性のサイトを展開するならば超有力な選択肢だと思う。

むしろ、私はグループ企業の展開しているヘテムルの立ち位置が心配だ。

私は今回の結果を受けてMimir Yokohamaとしても従来のVPSベースのウェブサービスをConoHa WINGベースに切り替える検討を開始することにした。 今回の調査で ConoHa WINGはセキュリティ的に信頼できる ということが分かったからだ。

ちなみに、もうひとつConoHa WINGの魅力としてモリサワwebフォントが使える、というメリットがある。 モリサワといえば最高に美しいフォントなのだが、実は3書体、25万PV/月上限で月額2160円だったりする。 全書体、100万PV/月のほうは4320円だ。 ConoHa WINGでは2.5万PV/月で30書体が使えるため、世の中に浸透しているシステムデフォルトフォントをCSSで強制するという愚かな行為を抑制できそうでとても嬉しい2

ちょっとだけ「レンサバにグレードダウン」などと思ってしまったが、実は大変魅力的なサービスであった。 この性能はアフィリエイターだけに任せるにはもったいない…というよりも、アフィリエイターの手にはさすがに余るのではないか (私が知らないだけで、アフィリエイトブログというのはデイリーPVが何十万というレベルなのかもしれないが)。

高度なWordPressサイトを構築したい人、セキュリティに関心のある人、 しっかりしたプラットフォーム上でウェブサイトを構築したい人には最適解となりうる。 ちなみに、PureBuilder Simplyは静的ウェブページを高いスループットで処理できるホストに向いているため、PureBuilder Simplyも大いに活用できるだろう。


  1. ConoHaのサービスページ上からいなくなってしまったので、「ConoHaには三雲このはというマスコットがいる」ということは外部の人は知らない情報になってしまったのだ。せめてロゴに残してくれればよかったのに

  2. ちなみに、Chienomiの月間PVは15万PV程度はあるため、到底使用できないということになる。

Vivaldi 2.0

Vivaldi ウェブブラウザのバージョン2.0がリリースされた

動画にキレイな日本語字幕が入っていたりしてとてもいい感じだ。

Vivaldiは1.15から2.0に上がった形になる。 初期は不具合もそれなりに多く(それでも初期としては非常に良い出来で期待はできたが)開発者も少なかったので先行き不安なところもあったが、今やちゃんとしたブラウザになった。 今回の修正ではAltの無効化が大きい。VivaldiはAltがキャプチャされても(例えばスクリーンショットとか)メニューを開いてしまうので、この問題が(正しい解決方法ではないが)解決されるのは非常に嬉しい。

Vivaldの成り立ちは若干複雑で、Operaがコミュニティを捨ててただのChromiumに成り下がったことに納得が行かない人たちが出ていって作ったブラウザだ。 ところが、VivaldiはChromiumのフロントエンドでしかないし、コミュニティ機能のほうも当初から随分後退して「よくある程度よりも消極的」というレベルまで落ちてしまっている。

ではVivaldiに価値がないのかというとそんなこともなくて、中国企業に買収されたこともあってか不透明な振舞いを繰り返すOperaや、不信感を煽るような行為の多いGoogleと違ってクリーンでオープンという空気は保たれている。 Mozillaも多分に政治的になってしまっている現状において、Vivaldiは数少ない信頼できるオープンなブラウザだと見ていい。 このあたりはTakaakiさんのブログで詳細に説明されている。 また、マイナビの記事もなんとなくその空気が分かる。

また、VivaldiはChromiumをベースとしたブラウザとしては非常に珍しく、フロント部分はほぼ自前になっている。 Braveなどもそうなっているけれども、これによってVivaldiだからこそ使える部分も大きい。なにより、プライバシーを脅かすかもしれない要素は廃してコストをかけて自前で用意するあたり気合が入っている。

以前独自エンジン開発も辞さず、みたいな記事があったような気がしたけれども、それは見つからないので置いておこう。

この素晴らしいブラウザは使うほどに手に馴染む。 もしまだ使ったことがないという人がいたならば、ぜひ一度使ってみてほしい。

Linux zsh/デュプレクサ/ssh設定の勘所

ここのところ大作をいくつも書いているため、忙しさも手伝ってなかなかアップロードできない。 この話もLinuxを使えるようセットアップする話をまとめようと思っていたのだが、それはあまりに時間がかかってしまうので、かいつまんで解説しようと思う。

世の中にはLinuxをインストールだけ繰り返すという人もいるのだが、だいたいそういう人はセットアップをしない。

1台だけのコンピュータを使う人、というのも、実はLinux手練(というよりも達人)の中でも結構多いのだが、1台だけ使っているうちにはその中で順次セットアップを煮詰めていけば良いのだが、Linuxは複数台使ってこそその真価を発揮するし、そうなると素早く適切にセットアップすることが求められる。 特にConoHaでインスタンスを立てたり閉じたりする場合にはなかなか重要だ。

ここでは頻繁にセットアップを行うがまだ手順を確立していない人、あるいはセットアップ自体確立していない人のために私のコツをご紹介しよう。

なお、ここでは前提としてManjaro Linuxあるいは(サーバーにおいては)Arch Linuxをセットアップする前提にあり、その中で極力少ない労力でセットアップしようとしている。 基本的な方針は他のディストリビューションでも応用できるはずだが、労力の多寡に関してはこの限りではない。

また、シェルはZshを使っていることを前提としている。 Bashを使っている人はZshに乗り換えてしまえば良いと思うが、Fishを使っている人に関しては私はわからないので留意していただきたい。

初期セットアップに関して

とりあえずアップデートして再起動

# pacman -Syu
# reboot

vimがないと設定に困るのでvimを用意する。 viも別パッケージであるのだが、むしろ不便なのでシンボリックリンクにする。 vim-pluginsが入っていればだいたい良いので、一緒にいれておく。これでvimで苦痛を感じることなく使うことができるようになる。 (デスクトップではvimではなくgvimを入れる。そうするとXセレクションを扱えるようになる)

# pacman -S vim vim-plugins
# (cd /bin; ln -s vim vi)

設定ファイルをViなんかで書けるか! Emacsにしろ! という人はEmacsも入れる。 私はEmacsを使わないのであまり詳しくない。 こちらもデスクトップではemacsパッケージを入れる。

# pacman -S emacs-nox

ここで一般ユーザーを作っておく。もちろん、Manjaroでは必要のない作業。 Manjaroでは一般的なデスクトップユーザーに追加すべきグループが多いので留意する必要がある。

# useradd -m -U -c "First User" -s /bin/zsh -G wheel,storage,sys,network luser
# passwd luser

wheelグループにsudoを許すようにする。 $wheelの行のコメントアウトを外す。NOPASSWDになっている行ではないほうが良いだろう。

# visudo

Zshをログインシェルにしたが、まだ設定していないのでbashで入る。

# sudo -u luser bash -l

AURを扱うのであればとりあえずyayを入れるのがお勧め。 Archでも2パッケージで済むからだ。それにタイプ数も少ない

$ sudo pacman -S go
$ git clone 'https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg
$ sudo pacman -U yay*.pkg.tar.xz

あとはほしければTrizenでも入れておけば良い。 yaourtとpacaurは「安全ではないソフトウェア」になりつつあるらしいので、とりあえずお勧めはしない。

$ yay -S trizen

w3mとlvがあればとりあえず文書を読むのは楽になる。 コンソール作業する場合は必須

$ yay -S w3m lv

ターミナルマルチプレクサを入れる。Powerlevel9kはGNU Screenで位置がバグる問題があるので、ここでtmuxを入れておく。 一応、screenも入れておく。

$ yay -S screen tmux

Moshは便利だと思うけれど、私はUDPを透過するファイアウォール設定をしたくないため、ここではMoshの話はしない。

Zshとターミナルマルチプレクサ

とりあえず

私が新インスタンスに対して最初にすることは、Zshを導入しセットアップすることである。

ZshからFishに変えた、あるいはZshが使えなくてBashがいいという人の多くはZshのセットアップができていない。 ディストリビューションに良いZshの設定が含まれていることは稀だし、Zshの設定は非常に多くて難しい。 マニュアルを読んで設定を作り上げてこそなのだが、それをしない人が圧倒的に多い。 (似たようなことはVimにも言えるが、Vimの場合はそれが気になるケースは少ないかもしれない)

実は話は実に簡単で

$ sudo pacman -S grml-zsh-config zsh-completions

これで再ログインすれば立派に使えるZshが出来上がっている。

grmlの設定は非常に練られていて、多くの場合これで十分だろう。 (場合によっては調整がいるかもしれない)

なお、Archのgrml-zsh-configはskelが含まれているのだが、Manjaroは含まれていない。 skelのほうは便利ツールがコメントアウトされているものなので、別になくても構わない。

なお、Zshの設定ファイルに日本語を使うとサーバーではトラブルのもとになるので注意してほしい。

オプション

だが、もう少し練ることにしよう。 まず、grmlの設定ではAUTO_CONTINUEが有効ではないので、間違ってフォアグラウンドで起動してdisownしたあとSIGCONTをわざわざ送る必要がある(実際はこのケースではbgしてからdisownするほうが良い)。

重複する部分が多いが、重要なオプションは設定しておこう。

私は次も設定しているが、多分いらない。(RC_EXPAND_PARAMはgrmlではオフかも)

シンタックスハイライト

プラグインの中では便利なもの。 ただし、いくつかのオプションが制限される。

% sudo pacman -S zsh-syntax-highlighting

履歴の機能を拡張

grmlの履歴機能はhistory-beginning-{for,back}ward-endを採用している。 これは、「コマンド部分は途中ならその位置、コマンド部分が入力されていればその部分を維持し、カーソル位置を末尾としてヒストリをたどる」というものだ。

だが、個人的にはオプションも含めてカーソル位置まで維持してくれるほうが好きだ。 全面的に書き換えるのではなく、PgUp/PgDown時はカーソル位置を維持してヒストリをたどるようにする。

本来は記述が足りていないが、この内容はgrmlを前提としている。

履歴を残す量も設定しておこう。 HISTSIZEは検索で辿れる量、SAVEHISTはファイルに残す量だ。

viモード

私はviモード使いなので、設定しておく。

なお、逆にEmacsキーバインドで使いたい人で、EDITORvivimnvimにしている人はちゃんと設定する必要がある。

ターミナルマルチプレクサ

SSHの場合は切れないとか、セッション増やしたいとかだいたい起きるので、使用させることにする。

なお、これでtmuxの設定で

set -g default-terminal "xterm-256color"

とかすると地獄をみるので絶対にしてはいけない。 必ず

set -g default-terminal "screen.xterm-256color"

または

set -g default-terminal "screen-256color"

とすること。

なお、私はGNU Screen使いなので、tmuxのキーバインドはscreen互換にしてある。

プロンプトとテーマモード

私は普段はgrmlプロンプトテーマを使っているが、SSHではPowerlevel9kを使っている。 これは、見やすく、わかりやすいため。普段から使わないのはプロンプトが戻るのがちょっと遅いからだ。

% sudo pacman -S zsh-theme-powerlevel9k awesome-terminal-fonts powerline-fonts

私はテーマ読み込みにこんなことをしている。

前述の$_DEFAULT_SHELLMODEはこのためのものだ。 だが、常にPowerlevel9kで良いのなら、別にロード部分を直接書いてもいい。

grmlと競合してしまうので、prompt offすること。

私の設定はこんな感じ。

このあたりは好みなのだが、実はPowerlevel9kの公式マニュアルにはあるが動かないものというのが結構合ったりする。 典型的には$POWERLEVEL9K_SHORTEN_STRATEGYは多くがうまく動かない。

ポイントになるのが、プロンプトにcontextを使わずuser hostと分けた上でホストのREMOTEのみ色を設定していること。

基本的には「ローカルの場合はどのマシンでも同じ色でいいが、リモートの場合はどのマシンか判別できたほうがよい」と思う。 別にこれ以外のプロンプトテーマでもホスト名は出しているのだが、現在作業中のホストを勘違いしてやっちまった、ということはしょっちゅうある。

まずホスト名に一貫性があってわかりやすい名前をつけることが大切だ。

% sudo hostnamectl set-hostname thinkpad-x1

私の場合は花の名前をつけることにしている。 実はこれは1993年の出来事に由来しており、運用は1998年から、と私としてはとても歴史がある。

さらにメリットとして花なので、色が連想できる。私は$POWERLEVEL9K_HOST_REMOTE_{FORE,BACK}GROUNDはその花の代表的な色をモチーフにした色使いにしている。 それぞれのマシンでイメージが離れた花の名前をつけているため、色被りも少ない。

簡単でわかりやすいのは、機種名とケースの色だろうか。VPSは難しい。

なお、

vi_modeを正しく表示するために必要な部分。

SSH

基本的なSSH

とりあえずroot鍵を登録してパスワード認証は閉じる。

まずはログインするほうでssh-keygen -f <file>によって生成した.pubのほうのファイルを ログインされるほうの~root/.ssh/authorized_keysにコピーする。

なお、.sshはパーミッション0600であること。

このroot鍵を登録するステップはサーバーに対するもので、直接ログインできるのであればスキップすべき作業である。

そして/etc/ssh/sshd_config (ssh_configではない!)を

PasswordAuthentication no

としておく。 この時点で一旦リロード

% sudo systemctl reload sshd

同じ要領でユーザー鍵を登録する。 鍵そのものも分けたほうがいい。

% ssh-keygen -f server-luser_rsa
% rsync -e "ssh -i server-root_rsa" server-luser_rsa.pub root@server:/home/luser/.ssh/authorized_keys
% ssh -i server-root_rsa root@server "chown luser:luser -R /home/luser

以降のために~/.ssh/configに設定しておく。

Host server-luser
  User luser
  Port 22
  HostName server.example.org
  IdentityFile ~/.ssh/server-luser_rsa

これでssh server-luserとして入れるようになる。

なお、HostNameだが、LANで同じセグメント内にいるのであればZeroconfによる.localを使えばいいだろう。 あるいは、各マシンを固定アドレスとして/etc/hostsに書いておくというのも手。 /etc/hosts上の名前は1マシン1つではなく、役割ごとに名前をつけておくと、その役割が他のマシンに移ったときにあまり苦労しなくて済む。dnsmasqで配るという方法もある。

SSHに関する話は以前にしたので、応用技としてはそのあたりを参考にしてくれると良い。

いざというときのための暗号化経路

なにかのときのため、ネットワークごとに1台は透過的にアクセスできると良いだろう。 これはいくつかの方法がある。

最も簡単なのは、Socksプロキシを使うことだ。

% ssh -TND 4711 -o ServerAliveInterval 10 -o ServerAliveCountMax 3 luser@server

これでlocalhost:4711をSOCKS5プロキシとして使用すればSSHサーバーを経由してアクセスすることが可能になる。 これは、ウェブブラウザやメールクライアントで有用である。これは公衆Wi-Fiからアクセスする程度の場合に有効だ。

もうひとつは、SSH経由の環境から利用できるようにしておくことだ。 w3mやMutt, Vim, Emacs, lvなど端末から利用できるアプリケーションを一通り揃えておけば、GUIは使えなくてもひととおりの作業が可能だろう。

本当にそのネットワークを通じてアクセスする必要が生じた場合はどうだろうか? 私はそんなサバイバルな経験を何度かしているが、普通の人はあまりない。 常時必要とするのであればVPNを用意しておけば良いのたでが、緊急避難的に使用できるようにしておくと何かと便利だ。

まずは双方にpppをインストールしておく。

% sudo pacman -S ppp

ログインするサーバーに対してはパスワードをかけたコマンド用rootキーを使うのが最も確実で安全。

command="/usr/sbin/pppd nodetach notty noauth",pty,no-X11-forwarding,no-port-forwarding,no-agent-forwarding ssh-rsa ...

さらに実際に使うときにログインした上でフォワーディングを許す。

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

そしてつなぐ。

% sudo pppd updetach noauth silent nodeflate pty "sudo -u luser ssh server-ssh-ppp" ipparam vpn 192.168.32.1:192.168.32.2

192.168.64.0/24に対してアクセスできるようにしたい場合:

% sudo ip route add 192.168.64.0/24 via 192.168.32.1

すべての未知のホストにこの経路でアクセスしたい場合。サーバーのアドレスは10.0.8.1、現在のデフォルトゲートウェイは192.168.1.1だとすると:

% sudo ip route add 10.0.8.1 via 192.168.1.1
% sudo ip route replace default via 192.168.32.1 proto static metric 101

Pandoc Markdown のあまり知られていない書法

これで全部ではないし、どちらかといえばPandocユーザーズガイド日本版に記載されているものはそれを読むほうが早いので、記載されていないものを中心にあまり知られていないものを集めてみた。

上付き文字 (superscript)

^ではさむ。

下付き文字 (subscript)

~ではさむ。

打ち消し

~~で挟む

ヘッダーのIDを制御する

日本語を使用している場合やかぶる場合、あるいは主導でヘッダーへのフラグメントを書く場合などは名前をつけたいもの。

これでこのh1ヘッダのIDはHelloWorldになる。

divとspan

ユーザーズガイドに記載されていない機能。

div

3つ以上のコロンをフェンスブロックのように使用する。

span

[]形式。

特にspanに関しては{}を伴わないのは危険かもしれない。

任意にID/クラス/属性を書く

ユーザーズガイドに記載されていない機能。

{...}という形式でヘッダやコードブロックに限らずIDを明示することができる。 #IDによるIDと、.classによるクラス表記ができるほか、attr_name="attr_value"という形で属性も書くことができる。

これはインラインコード, コードブロック, リンク, 画像, ヘッダ, div, spanなどで利用できる。

順序つきリストにラベルをつける

順序つきリストマーカーに(@)という形式があり、(@label)と書くことができる。 そして(@label)として参照できる。

結果

シンタックスハイライトニング

フェンスブロックで言語名を書けばよい。 一応、ユーザーズガイドにはないZshなんかも対応している。

クラスとして言語が指定された場合もそれを認識する。

なお、対応している言語を指定したときだけsourceCodeというクラスが振られるようになっている。

コードに行番号をつける

ユーザーズガイドに記載されていない機能。

コードブロックにnumberSourceというクラスが設定されていると行番号をつける。 numberSourceをつけていなくても必要な情報自体はついているので、CSSを改変すれば必須ということもない。

定義リスト

dtは普通に先頭からはじめて、dd側を:に続けてインデントする。

まずddが一行なのであれば、空行をあけずに書けば良い。

複数の段落に渡るような場合は空行をあける。 ddの最初の行は:にスペース3つ、以降はスペース4つ。

ラインブロック

いわゆるVerb。

単に|ではじめるだけ。

リストにブロックレベルのコンテンツを含む

定義リストと同じように継続するものが4つのスペースではじまっていると、それは複数のブロックレベル要素を含むものとみなしてくれる。

このため、4つのスペースでコードブロックを表している場合、これをリストの一部だとみなしてしまう。

コメントをいれれば良い、とガイドにはあるのだが、これはHTML以外で困る。 タブを使えば解決するのだが、いくらなんでもスペースでインデントしてからタブを重ねるのは嫌という人もいるだろう。 であれば、フェンスブロックを使えば良い。

YAML front matter

Markdownの先頭にYAMLを置くことでメタデータを書くことができる。 title, subtitle, author, date, keywordsはofficialなもの。

テーブルキャプション

ユーザーズガイドに記載されていない機能。

方法その1。手前に:で始まる行を置く。

もうひとつはTable:という行を後置する。

コードブロックにキャプションをつける

captionという属性を書くとdata-captionが定義されるので、

とCSSに書いておけば良い。