[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ハッシュ関数とは一定のデータを与えると以下の特徴を持つデータに変換してくれる関数。
例えばだが、一定のデータを与えると特定のデータに変換してくれる関数 (ハッシュ関数) の例として
任意のポケモンを与えるとそのタイプに変換してくれる関数が考えられる。
何度やってもピカチュウを与えるとでんきに変換してくれる。しかし、結果であるでんきから「元の値はピカチュウだ」と確定させることはできない。
暗号学的ハッシュ関数には先のハッシュ関数に加えて以下の特性が求められる。
暗号学的ハッシュ関数として SHA-256 や SHA-512 などといったものが有名である。かつては SHA-1 や MD5 等があったが、これらは後に上述の特徴が失われた (弱点が見つかった) ため、もはや暗号学的ハッシュ関数としては使われない。この記事を書いている時点では暗号学的ハッシュ関数として扱われるハッシュ関数ももしかしたらもはや扱われなくなるかもしれない。
ハッシュ関数はデータの検索高速化に便利だ。例えばポケモンを検索するとしよう。何も考えずにピカチュウを検索するには 802 件のデータ全部を検索する必要がある。これに対して、「ピカチュウはでんきタイプだから」とハッシュ値が「でんき」のポケモンだけを集めた一覧だけを検索したら検索すべきデータの数はかなり減る。
暗号学的ハッシュ関数は「元のデータは知られたくない/知りたくない/知らないけど元のデータと照合したい」といったわがままな要求への対処に有効だ。例えば、ユーザが入力したパスワードを暗号学的ハッシュ関数で変換して保存する。するとパスワードを保管している人は「出力から入力を推測できない」特性のためにユーザのパスワードを知ることがない。ユーザがパスワードをログインなどのために再度入力した際は入力をすぐに暗号学的ハッシュ関数にかけて、出力された値を先に保存した値と比較すればよい。
ただし、同じパスワードからは同じ値が出力される点には注意が必要だ。これを解決するための技術としてソルトなどがある。
$ hiyoko@hiyoko-server: su hitsuji
と打てば hitsuji になれるはずだった。しかし、
$ hiyoko@hiyoko-server: 特にエラーなど出ず hiyoko に戻っている。こういう現象に見舞われた。
このせいだと思うのだが、外のサーバから ssh で hitsuji として繋ごうとしてもすぐに切断されてしまう。接続まではできるのだが、即切断だ。
そんなこんなで OpenStack からインスタンスのリサイズができなくてつらい思いをしていた。
ERROR oslo_messaging.rpc.dispatcher [req-599bf23b-2f0f-4eb5-8496-b0ca8edbd865 4f525d938c244788b6bb44f5ee3b5f8c c7e5e14e38e9438da15ea276c1a04798 - - -] Exception during message handling: Resize error: not able to execute ssh command: Unexpected error while running command. ERROR oslo_messaging.rpc.dispatcher Traceback (most recent call last): ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 142, in _dispatch_and_reply ERROR oslo_messaging.rpc.dispatcher executor_callback)) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 186, in _dispatch ERROR oslo_messaging.rpc.dispatcher executor_callback) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 129, in _do_dispatch ERROR oslo_messaging.rpc.dispatcher result = func(ctxt, **new_args) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 89, in wrapped ERROR oslo_messaging.rpc.dispatcher payload) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_utils/excutils.py", line 195, in __exit__ ERROR oslo_messaging.rpc.dispatcher six.reraise(self.type_, self.value, self.tb) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/exception.py", line 72, in wrapped ERROR oslo_messaging.rpc.dispatcher return f(self, context, *args, **kw) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 350, in decorated_function ERROR oslo_messaging.rpc.dispatcher LOG.warning(msg, e, instance=instance) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_utils/excutils.py", line 195, in __exit__ ERROR oslo_messaging.rpc.dispatcher six.reraise(self.type_, self.value, self.tb) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 323, in decorated_function ERROR oslo_messaging.rpc.dispatcher return function(self, context, *args, **kwargs) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 400, in decorated_function ERROR oslo_messaging.rpc.dispatcher return function(self, context, *args, **kwargs) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 311, in decorated_function ERROR oslo_messaging.rpc.dispatcher migration.instance_uuid, exc_info=True) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_utils/excutils.py", line 195, in __exit__ ERROR oslo_messaging.rpc.dispatcher six.reraise(self.type_, self.value, self.tb) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 288, in decorated_function ERROR oslo_messaging.rpc.dispatcher return function(self, context, *args, **kwargs) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 378, in decorated_function ERROR oslo_messaging.rpc.dispatcher kwargs['instance'], e, sys.exc_info()) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/oslo_utils/excutils.py", line 195, in __exit__ ERROR oslo_messaging.rpc.dispatcher six.reraise(self.type_, self.value, self.tb) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 366, in decorated_function ERROR oslo_messaging.rpc.dispatcher return function(self, context, *args, **kwargs) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 3852, in resize_instance ERROR oslo_messaging.rpc.dispatcher self.instance_events.clear_events_for_instance(instance) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__ ERROR oslo_messaging.rpc.dispatcher self.gen.throw(type, value, traceback) ERROR oslo_messaging.rpc.dispatcher File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 6429, in _error_out_instance_on_exception ERROR oslo_messaging.rpc.dispatcher raise error.inner_exception ERROR oslo_messaging.rpc.dispatcher ResizeError: Resize error: not able to execute ssh command: Unexpected error while running command. ERROR oslo_messaging.rpc.dispatcher Command: ssh 192.168.2.8 mkdir -p /var/lib/nova/instances/ab6bed88-ba1d-45d8-8bc1-ce4dee9c2a4b ERROR oslo_messaging.rpc.dispatcher Exit code: 1 ERROR oslo_messaging.rpc.dispatcher Stdout: u'' ERROR oslo_messaging.rpc.dispatcher Stderr: u"Warning: Permanently added '192.168.2.7' (ECDSA) to the list of known hosts.\r\n"
このような場合は cat /etc/passwdする。するとユーザ情報がおかしいことに気付く。
ユーザの色々な情報が詰まっているが、使いたいユーザの行末に /bin/false とあった。行末にはログインしたときに起動するシェル (ログインシェル) の情報がある。/bin/false は「何もせずに終了する」だ。su できたり ssh できたりするのに即座に絶たれるのはこれが理由だったのだ。
なんとかするには chsh コマンドを使ってログインシェルを変更してやればいい。/bin/bashとかにしておけばよい。ただ、こういうことをすれば使えるユーザがそれだけ増え、色々と面倒ごとも起こるかもしれない。よくよく考えてからすること。
Recovery Point Objective は目標復旧地点である。あくまで目標値 (Objective) である。
例えば、とあるソシャゲが3日に1回バックアップをとっているとしよう。もしもこのゲームがトラブルで停止し、データがすべて吹き飛び復旧不能になったとする。その場合、バックアップからの復旧となる。最悪の場合、3日分の巻き戻しが発生する。この場合、 RPO は3日となる。
この3日間に☆5やら SSR やらをガチャで引いていたとしてもそれらは消し飛ぶ。残念なことだが。RPO は短ければ短いほど良い。
Recovery Time Objective は目標復旧時間である。あくまで目標値 (Objective) である。サービスがトラブルで停止した場合に回復するまでにかかる時間の目標値 (Objective) だ。
SLA (Service Level Agreement) はサービスの品質に関する約束 (Agreement) だ。約束だから破ったらペナルティがある。ペナルティを含めての約束である。
Amazon EC2 サービスレベルアグリーメント に AWS の SLA に関して記述がある。超単純化して書くと、この記事を書いている時点では「月間の 0.05% 停止時間があったら1割お金を返す。1% 以上の停止時間があったら3割を返す」ということをうたっている。
RTO は SLA のペナルティを回避できるような数字である必要がある。AWS であれば月間1296秒 (月30日として0.05%。大体21分半) 止まったら返金が発生してしまう。最低でも RTO はこれよりも短くしないといけない。
Recovery Time Capability。最近知った概念である。実際に回復にかかる時間であり、RTO とは対照的な概念ともいえるだろうか。
RTO が SLA やその他の要請から定められるのに対し、RTC はリアルにかかる時間である。計測したりするのは難しいが、想定はしておかなければならない。さらに言えば RTC は RTO 以内の時間であるべきである。
とはいえ、実際のところビジネス上の要求は実際に可能なそれよりも厳しいことがほとんどだろうから、RTC の方が大きいケースの方が多いのだろうが……
Closing the Delta Between RTO and RTC - Disaster Recovery Journal
request をどう使えばよいのか分からなかったのでメモ。
const REQUEST = require('request');
const PROMISE = require('promise');
function getToken(user, password, tenant) {
return new PROMISE(function(resolve, reject){
REQUEST({
method: 'post',
uri: 'http://keystone.hiyoko.example.com:5000/v2.0/tokens',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({auth:{tenantName:tenant ,passwordCredentials:{username: user,password: tenant}}})
},
function(err, httpResponse, body) {
if(err) {
reject(JSON.parse(err));
} else {
body = JSON.parse(body);
if(body.error) {reject(body.error);} else {resolve(body);}
}
}
);
});
};
// 他の keystone へのリクエストは以下の感じで行けた
// REQUEST({uri: url, headers: {'X-Auth-Token': token}}, function(err, res, body){});
「プログラミングを始めたいのですが、最初にどんな本から学び始めると良いですか?」という質問をちょこちょこ頂く。その質問に私はとりあえず「プログラマの数学」を読め、ということにしている。
|
プログラマの数学 [ 結城浩 ] |
この本、プログラミングの具体的な話は全然載ってないのだが、プログラミングの考え方が色々と載っている。プログラミングの具体的な技……for とか if とかは言語によって違うが、考え方は大体同じである。今後何をやるのかも分からないのであれば、まずはこの本を読むのが一番良い、と私は考えるのである。