[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
北斗神拳のトラック係数が書いていて楽しかったので続き。
前回は北斗神拳は一子相伝と言われているけど案外そうでもないよね、トラック係数1じゃないよね、という話だった。
しかし、北斗神拳には伝承者にしか授けられない秘技があると考えられる。実のところ、一子相伝なのはこの秘技だけで、他の技は一子相伝でもなんでもないのではないか。しかし、この秘技こそが伝承者と非伝承者を隔てる大きな壁となる。前回の末尾にも書いたがこの秘技を知っていれば知らないものにはまず負けないからである。
伝承者であれば北斗神拳を授けるのも、北斗神拳を習得した者から奪うのも意のままである。伝承者とは北斗神拳を行使できる唯一無二の存在なのではなく、北斗神拳の利用権限を付与・剥奪できる管理権限保持者なのではないか。一般ユーザを管理ユーザに昇格させるのは比較的容易だが、逆はそうではない点でも似ている。
数年に一度、北斗神拳修得者の棚卸も行われたはずだ。ここで北斗神拳が不要と判断されてしまったある者は拳をつぶされ
、ある者は記憶をうばわれ
たのだろう。恐るべき棚卸である。システムアカウントの棚卸がこうでなかったことは幸運だったと言う他ない。
ところが、リュウケンはこの管理権限をラオウにいい感じに奪われてしまった。これは大変重大な失敗である。管理権限の流出であり、セキュリティ事故である。リュウケンはその直後に亡くなっているのでその責を問われはしなかったが、これは大変によろしくない。
ここまで考えて、管理ユーザと一般ユーザの違い、そしてセキュリティ事故を北斗の拳に例えて教育出来たりしないかなぁとか思ったわけである。
Creative Commons Attribution Share Alike 4.0 で公開されている資料の訳を載せている。この記事も同様のライセンスとなる。
nginx の設定を可能な限り nginx を止めずに変更したい。SSL 証明書の更新とか、設定の追加とか。
しかし、どうにもうまくいかない。
# nginx とした後、設定ファイルを書き換えて # nginx -s reload でもだめ。~/newNginxConf/nginx.conf に新しい nginx.conf を置いて # nginx -c ~/newNginxConf/nginx.conf とかしてもダメ。
一応、 stop/start すれば問題なく反映はされるのだが……
CommandLine | NGINX (Creative Commons Attribution Share Alike 4.0 で公開されている) の Loading a New Configuration Using Signals のあたりが関係するか。簡単に訳すと以下のようになる (翻訳元の版は 2017/3/6 日版)。
シグナルを用いて新しい設定を読み込む
NGINX はいくつかのシグナルもサポートしています。なので、これを使って NGINX を操作することもできます。
多くの場合、15番 (SIGTERM 終了) を NGINX の終了のために送信するでしょう。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.confしかし、より注目すべき使い方があります。NGINX の設定ファイルを無停止で差し替えることができます (これをやる前に新しい設定ファイルのテストをお忘れなく)。
2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok 2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.confNGINX が HUP シグナルを受け取った際、NGINX は新しい設定ファイルを解析します (引数として新しいもののパスを与えていなければ default のものを解析します)。解析に成功すれば、新しい設定ファイルを適用します (例えばログファイルを開きなおしたり、Socket を listen しなおしたり)。成功すれば NGINX は新しい Worker Process を起動し、古い Worker Process は安全にシャットダウンします。古い Worker によって Listen されていた Socket は閉じられますが、クライアントの動作は続行します。最終的にはすべての古い Worker がシャットダウンされます。もし、NGINX が新しい設定ファイルの適用に失敗すれば、古い設定ファイルのママ動作を続けます。
どうもこの Worker の終了・作成がうまくいっていない?
我が家では家計簿をつける習慣がなかった。何度か始めようとはしたのだが、続かなかったのだ。
とにもかくも買った直後につけられない点である。今の時代、携帯電話があるじゃないか、とも思うが携帯電話でつけられるだけでは不十分だ。家族のための物を買うのは私もだし、妻もだからだ。家計簿が共同編集できなければ続かない。
スマホから利用できて、制限された複数人で編集できるなら何でも良かった。結果、Google Spreadsheet で試してみることに。Google Spreadsheet ならスマホから編集が可能だし、Google Account でユーザ制限もできる。我が家は夫婦共に Android ユーザなのでアプリを追加で入れる必要も特になかったのも良い。
8ヶ月間、運用を継続できたのでこのままいけるな、と判断。しかし、妻から「項目別の集計ができなくて面倒」というお言葉を頂いた。
しかし、項目別の集計は難しい。どの入力がどの項目に該当するのかを判定する必要がある。しかし、これを毎回手入力したくない。ドロップダウン入力ならまぁ、良いかな、という話になり、作ることに。
次のようなスプレッドシートを用意する。
すなわち、日付、金額、項目、備考を入力する家計簿本体入力用シートと、項目の種類を一覧した項目一覧のシートである。項目一覧には使うことが決まっている項目を記入しておく。なお、内容は我が家で使っているものではない。夫婦共にソシャゲをやらずに「くまのプーさんのホームランダービー!」ばかりやっているからだ。
ドロップダウン入力を実現するには Data validation (日本語:データの入力規則) を使う。項目の入力セルを右クリックし、Data validation を選択する。
Data validation の設定画面が得られるので設定項目2つ目の Criteria を設定する。項目右側のテキスト入力欄右端の表をクリックするとセルを選択できるので、先に作った項目一覧の全項目をドラッグする。すると、次のようになる。
これで、項目欄はドロップダウンで入力ができるようになった。瞬時に入力できるので、あなたの夫ないし妻がズボラでも入力できるはずだ。
Google Spreadsheet には QUERY という関数がある (QUERY - ドキュメント エディタ ヘルプ) が、この使い方がかなり難しい。Google Visualization API のクエリ言語を記述する必要があるのだが、ふつうこんなの書けない。クエリ言語のヘルプ曰く The syntax of the query language is similar to SQL. Developers familiar with SQL should be able to quickly learn and use this query language.
だそうである。 Developers familiar with SQL
については全くもって同意なのだが、家計簿とかつけたいカジュアルなユーザには使いこなせない。つらい。
今回のサンプルでは次ようなクエリを書いてみた。=QUERY(B2:C22, "select C, SUM(B) where C<>'' group by C label C '項目', SUM(B) '金額'")
| B2:C22 | この範囲を集計対象にする |
|---|---|
| select | この範囲を対象に「見るよ」という宣言 |
| C, SUM(B) | どの列を表示するのか、の宣言。項目名の列と金額の列の合計を表示する |
| where C<>'' | C 列が空欄の場合は無視する、という宣言 |
| group by C | C 列 (つまり項目名の列) で一塊として扱う、という宣言 |
| label C '項目', SUM(B) '金額' | C 列については項目というタイトルを、 SUM(B) については金額というタイトルをつける、という宣言 |
次のような結果になる。
F2:G4 には特に何も入力していないのだが、QUERY 関数がこのように入力する。
長くなったので内容のまとめを先頭におく。北斗神拳は一子相伝でありトラック係数は1である。ケンシロウが無敵というわけではない以上危険な気がする。しかし、伝承者が許す限りにおいて北斗神拳は複数人が習得できるため、万が一の際の予備として機能する。実際のトラック係数は1ではないようだ。
最近、自分の中で北斗の拳が唐突に熱い。北斗の拳とは 核戦争によって文明と人々の秩序が失われ、水と食料といった残された資源をめぐって争いが繰り返されるという最終戦争後の199X年が舞台。暴力が支配する弱肉強食の世界に現れた、伝説の暗殺拳"北斗神拳"の伝承者・ケンシロウの生き様を描くハードボイルドアクションである。
(Wikipedia よりコピペ)
このケンシロウ、凄まじく強い。アニメの主題歌は 邪魔する奴は 指先ひとつでダウン
と歌っているがこれは別に誇張ではなく本当にこんな感じである。
じゃあ、ケンシロウは無敵なのか、というとそうでもない。漫画を読んでいてもザっと4回は負けており※1、大体はその状況から第三者の助けによって脱出している。まぁ、漫画だし、そうじゃないと面白くないよね、マジンガーZ だって苦戦を繰り返して徐々にパワーアップしていったんだし。
……いや。そうも言っていられないのである。北斗神拳はその凄絶な力と創始者の悲話ゆえに一子相伝とされて
(Wikipedia よりコピペ) いるからである。本編開始時点で先代伝承者は亡くなっているため、正規の伝承者は主人公であるケンシロウ一人となっている。ケンシロウ以前の伝承者は不敗だったらしいので問題ないだろう。しかし、先述の通りケンシロウはそうではなかった。ケンシロウが万が一にでも死ねば北斗神拳はその場で断絶するのでは。
北斗神拳のトラック係数※2は恐るべきことに1なのである。これは良くない。
しかし、実際に北斗の拳を読んでみると案外トラック係数が1ではないことが分かる。一子相伝、伝承できなかった伝承者候補は 拳を封じられ名乗ることも許さ
ない。そのためある者は拳をつぶされ
、ある者は記憶をうばわれ
るという (北斗の拳本編よりコピペ)。
しかし、実際にはケンシロウと競合していた伝承者候補3名はいずれも北斗神拳をその後も使っていたし、伝承者候補から他の人が北斗神拳を盗んだこともあった※3。実際にはトラック係数を大きめに取っているらしい。一子相伝という触れ込みとは矛盾するけれども……
なお、先述の伝承できなかった伝承者候補への仕打ちを確実にするための手段は別に用意されているようだ※4。相応しくない者は封じておくが、残りは予備として残しておく、という方針なのだろう。何が一子相伝だ、という気もするが現実問題断絶するわけにもいかないのでしょうがない。
しかし、この「確実に伝承者候補を封じる手段」を正規伝承者以外が知るのはまずい※5。この手段を知っている相手は確実に封じられる相手ではなくなるからだ。いかにして正規伝承者が断絶した場合の予備伝承者にこの手段を伝えるのか、という課題は残る。
※1 未読の人が読むことはないと思うが、一応隠しておく。反転でご覧ください。北斗神拳の伝承者として認められた後のみをカウントする。シン初回, ラオウ初回, サウザー初回, カイオウ初回。が、そもそも負けるとか以前に一話目からして行き倒れかけていたぞ。セキュリティ意識が低すぎると思う。
※2 トラック係数
※3 アミバとかバランとか。そもそも、見て盗めるようなものなのか、というのも疑問ではあるけれども。
※4 リュウケンがラオウを封じようとした際に用いた奥義、七星点心 (しちせいてんしん) をラオウは知らなかった。しかし、あのラオウをも封じる威力から最重要奥義の1つだと考えられる。カイオウもこの動きを知って対策 (北斗逆死葬) をしていた。七星点心を使えば、これを知らない相手であれば確実に拳を封じられるだけの威力があるのだろう。ジャギでも伝承者に力量的には充分なれたのでは?とすら思う。
※5 その割には※4の通りカイオウは知っていたし、リュウケンもラオウの前で見せたうえでやられる、という最悪のシナリオをやらかしている。このセキュリティも多分ガバガバな気がする。
jq コマンドが便利だ。日本語で解説している記事:jq コマンドを使う日常のご紹介 - Qiita
だが、見ての通りどこででも使えるコマンドではないのが最大の欠点である。使いたいのに使えない時、ひよこがよく使うコマンドをいくつか。
まずはこれで各要素を行に分割する。$ echo jsonfile.json | tr ',' '\n' とでもしてやればよい。
python が入っているならこっちを使った方が楽。$ echo jsonfile.json | python -m json.tool これで整形してもらえる。
これで必要なものだけを抜き出す。$ echo jsonfile.json | tr ',' '\n' | grep 'age' 等とすれば age だけ抜き出せる。重ねがけなどもできるのでうまく使う。
これでさらに必要なものだけを絞り込む。tail -200 catalina.out 等とやると末尾200行だけ抜き出せる。head -200 catalina.out だと逆に先頭200行だけ抜きだせる。json を力技で読み取る時以外にも利用できるのでおいしい。
8行目だけ欲しいの、という場合は head -8 catalina.out | tail -1 だ。
なお、このような小手先では解決できない場合、jq をインストールするなり、適当なブラウザの開発者ツールで読み解くなり、専用のパーサを頑張って作るなりした方が良いと思う。あくまで即興用。