けんぼうは留年生

ノンジャンルで何か書きたくなった時に書く感じ

Minecraftでサーバーやってるから我が家を紹介します

たまにはゲームの話でもしましょう。
MinecraftのMOD鯖建ててるんで今日は自宅とMODの紹介をしたいと思います。
入ってるMODはこんな感じです。
・Thermal Expansion
Redstone Arsenal
・Rail Craft
・黄昏の森
・Open Computers
・EnderIO
現在住人随時募集中なので興味あったらTwitter(@kembo_net)かコメント欄等で連絡くださいな。

続きを読む

Rubyでメソッドの引数の変数名をそのまま同名のインスタンス変数に代入したい

インスタンスを生成する時に引数が多くなることはぼちぼちあると思う。
んで、その引数を受け取るローカル変数の名前と代入したいインスタンス変数の名前が同じなこともよくあることだと思う。
でも、それをこんな風に書くのは何とも面倒。

class Hoge
  def hogehoge(var1, var2, var3, ……)
    @var1 = var1
    @var2 = var2h
    @var3 = var3
    ……
  end
end

こんなの書きたくないけど書かなければ代入できない。

てなわけでやりたいことを自動化してRuby自身にやってもらうことにした。

class Hoge
  def hogehoge(var1, var2, var3, ……)
    self.method(__method__).parameters.each do |arg_type, arg_name|
      instance_eval "@#{arg_name} = #{arg_name}"
    end
  end
end

これで解決した……のかな?

[追記]
RubyistたちのDRY症候群との戦い
これに書いてあるのも似たようなことをしている……のかな?

続・僕の考えた最強のパスワード

昨日こんな記事を書いたけど
僕の考えた最強のパスワード - けんぼーは留年生
今ひとつとっ散らかっているのでもう一度整理したい。
まずは当たり前の話から。

パスワードは何のためにあるか

これは個人を見分けるためだ。Aさんにだけ見せたい情報があったらAさんしか知らない合言葉を聞き出せば良い。それがパスワードだ。

パスワードは私しか知らない

個人を見分ける物なのだから他人も知っていたら意味が無い。例えばキーボードの配置とか恋人の名前とか車のナンバープレートとか、他人も知り得る情報をパスワードのヒントにするのは辞めるべきだ。あまり考えたくはないが、貴方の周囲に悪意を持つ人が現れないとも限らないし、パスワードを調べるために貴方の身辺調査をする人もいるかもしれない。最悪の場合を想定しよう。

パスワードは流出する

パスワードを照合するにはサービス提供側もパスワードを知る必要がある。尤も直接知っていたら先の「パスワードは私しか知らない」に反するので、良い感じに暗号化(ハッシュ化)して元のパスワードが分からないように保管している。これで万一パスワードが漏れても大丈夫……のはずだったが、実際にはパスワードのパターン数は有限なわけで片っ端から総当りをかけていけばいつかパスワードはバレてしまう。それにサービス提供者の中にはアホな人もいてパスワードを平文で保存しているかもしれない。パスワードが流出するような事態はそう頻繁に起こるわけではないが、それでも沢山のサービスを使用していればそのリスクは上がる。全てが流出する可能性は低いかもしれないが、1つ2つくらいなら流出してもおかしくないという心構えが必要だ。

だからパスワードは使い回し出来ない

パスワードは流出するのだからもし、同じパスワードや容易に類推出来るようなパスワードはNGだ。

単純な物もダメ

総当りで計算する場合、攻撃者はもちろん単純で組み合わせの少ないパスワードから試す。従ってパスワードは単純であればある程危険だ。なるべく大文字小文字数字記号を混ぜて複雑で意味不明で長い文字列にするべきだ。英単語やローマ字なんて論外だし、それを多少別の文字で置き換えたくらいでは安全とは言えない。

定期的に変えたい

パスワードが流出した際、即座にそれが感知出来るとは限らない。見つからないようにこっそり情報だけ取り出して監視している場合も考えられる。これを回避するには定期的なパスワードの更新が必要だ。

パスワードは覚えられない

さて、先述の三点を組み合わせると私たちはサービス毎に複雑なパスワードを覚えなければならない上に、それを定期的に変更する必要がある。そんなのは無茶な話だ。

解決策1:パスワード管理ソフト

ランダムパスワードを生成し、それを保管してくれるものだ。マスターパスワードを1つ覚えればそれだけで無数のランダムパスワードを管理することが出来る。例え1つが流出しても他のパスワードは無関係なので問題無い。変更も容易だ。定期的な変更を促すためにタイマー付の物もあるらしい。もちろんどのソフトにするかはしっかり考え選ばないといけない。物によってはパスワードの暗号が弱く解読されてしまうような物もあるかもしれないし、入力したパスワードを横流しする悪意のあるソフトもあるだろう。暗号方式の確認と出来ればオープンソースの物が良いだろう。自作するのが一番確実だ。ただし、保管しているデータ自体が破損すれば二度とパスワードは戻らない。

解決策2:僕の考えた最強のパスワード

ハッシュを介して単純なキーワードからパスワードを計算する。要するにパスワードの作り方とその種」を覚えておく方法だ。ハッシュ関数を使えばパスワードが漏れてもそこから元のパスワードの種を特定することは困難だ。種に日付や年を表す文字を追加すれば定期的に変更することも容易だ。見た目はランダムパスワードと変わらない。自分が種となるキーワードとパスワードの計算手順を忘れさえしなければ、例えパソコンが吹っ飛んでもパスワードは守られる。ただ、パスワードが逆算されるリスクは排除出来ないしそう考えると前述の管理ソフトの方がセキュリティ性は高い気がする。

わざわざソフト作る・探す・使うの面倒くさいんだけど

別にパスワード流出しても構わないと言うのであればどうぞ。と言いたいところだけど場合によっては他人の情報も巻き添え食って流出するリスクあるので手間かけてください。パスワード管理ソフトなら自動入力してくれる物あります。むしろ自分で入力するより楽なはずです。


結論:パスワードは大切にね

僕の考えた最強のパスワード

パスワードに欲しい要件を考えた。

  1. 無意味な文字列であること。
  2. 十分長い。
  3. サービスによって違うものを使い分ける。
  4. 特に重要な物については定期的に変更する

これらをすべて満たしたパスワードをサービスの数だけ作り覚えていく……無理だろ。
勿論世の中にはパスワードを保存して管理してくれるソフトなんかもあるようだが、

  • いつでも自分の環境というわけではない。
  • 保存したパスワードが流出、あるいは破損するリスク。

ということを考えるとイマイチ安心して使えない。
パスワードを保存せず、そして沢山覚えなくて良い方法は無いものか。
最初に思いついたのは「同じパスワード+サービス名」という方法だが、
普通に考えてパスワードが流出したら他の物も類推出来てしまうので意味が無い。

そして僕は思いついた。
ハッシュ値をパスワードにすれば良いじゃん。

ハッシュ値とはハッシュ関数によって得られる値だ。
例えばあるハッシュ関数にAという値を入れてBというハッシュ値が得られたとする。
AからBを計算することは容易だが、BからAを逆算することは非常に困難。
これがハッシュの性質だ。
「同じキーワード+サービス名」からハッシュ値を取ってそれをパスワードにすれば

  • 無意味な文字列
  • 長い
  • サービスによって違う

の全てを満たすことが出来る。
ついでに2014とか付加すれば毎年違うパスワードだって可能だ。
そして、もしパソコンのデータが全て吹っ飛ぶみたいな不幸な事故が起こっても
この方法ならキーワードとパスワードの計算方法を覚えている限りいつでもパスワードを復元できる。
ちょっと特異な環境でもちゃちゃっとパスワードを計算するスクリプトを書けば
いつでもどこでもパスワード生成器が作れる。
例えばjavascriptとかで実装すればブラウザでアクセスするだけで実行可能だ。*1

もちろんハッシュ値と言えど完全に逆算が出来ないわけではなくて、
例えば総当りすれば答えは出るし時間をかければ特定することは可能だ。
だが、パッと見はランダムな文字列と変わらないし、
わざわざ一手間かける人はいないと期待したい。
仮にいたとしても同じハッシュ値が得られる候補は複数存在する。
入力するキーワードが長ければ長いほど攻撃者は面倒を強いられる。

というわけで実際にHSPでサクッと作ってみた。*2
http://www.kembo.org/password_generator.zip

ハッシュ関数にはMD5を使ってみた。理由は特に無い。
安全性がどうのと言われるが、それは大体衝突性の問題なので
逆算が困難なのは多分どのハッシュ関数でも同じはず……だよね?

返ってくるハッシュ値は16進数だったので
それを2^n種類ではない記号列に集約するのにすごろくみたいな方式にした。
例えばa1,a2,a3,……という値をn種類の記号列に変換する時は
(a1)%n, (a1+a2)%n, (a1+a2+a3)%n, ……
と言った具合に。
これでまぁ大体の文字の偏りも軽減されてると思う。多分。



で、ここまでやっといて気が付いたんだけど
普通パスワードって平文じゃなくハッシュで保存してるんだよなぁ。
ハッシュがただ二重になっただけだなぁ。
普通に暗号化したパスワードをクラウドに保管してるのでも
大して変わらないんじゃないだろうか……。

もう寝よう。


追記

この方法同じキーワードを何度も入力するから
ショルダーハッキングのリスクは大きいなと思った。

追記2

↑じゃあキーワード入力BOXを複数用意して、
片方の入力値は一度入力したら終了するまで保管するようにすればええやん。
パスワードの作り方の問題とは関係無かった。

*1:尤もその場合はページが改竄されているリスクに注意を払うべきだ。

*2:僕としてはこれをそのまま使うのではなく、各自がこれを参考に適当に実装して使うことを想定している。

投票なんて行きたくなきゃ行かなくても良いじゃんよ

センセーショナルなタイトル付ければ読まれやすいってばっちゃが言ってた

 という冗談は置いといてさくさく本題へ入りましょうね。さて、現在日本を含め主要な国々では間接民主制を取り入れていることが多いですね。市民は投票等によって代表者を選出し、その代表者が政治を行う、というものです。間接民主制は皆が投票へ行くことで始めて成り立つ制度なのですが、その投票率が最近下がっていることが問題になっているそうです。

 じゃあそもそも何で民主制なんて始めたんだってところからざっくりお話しましょう。社会には大体リーダーが必要です。色んな社会制度があるけど昔はやっぱり王様とかそれに類する物が多かったようですね。貴族とか宗教とか何かその辺に安定した権力ピラミッド作ってその天辺に誰かを据えるわけです。でもって天辺を決めるのはピラミッドの上位にいる人たちだけで大半の人たちはそこに関わることすら出来なかったわけです。

 しかし、時代が進むに連れて世界が進歩して豊かになってくると今まで黙ってた最下層の愚民共が段々生活に余裕出て来て増長してきて王たちにやいのやいのと文句を言うようになってくるわけです。他にも産業革命とか思想的に色々あったり資本主義だのなんだので「適当に世襲や一部の人の意見だけでリーダーを決める」って方法じゃ収まりがつかなくなってきたわけです。そこで登場したのが民主制です。

「全員で話し合って決める。その代わり全員で決めたんだから文句は言わせん。」

ということにしたのですよ。つまり、民主制ってのは

文句を言わせないためのシステムであって、賢い意思決定をするためのシステムではない

のですよ。責任の問題であって結果には何の配慮もされてないわけです。

 さて、ここから今の民主制disりタイムに突入しましょうか。そもそも選挙って言うのは学校で言うところの定期テストみたいな物で、普段の政治活動があって、それで支持勢力の力関係が変わり、それを選挙と言う名のテストで数値化して政治に反映させるというのが本来のあり方です。つまり、個人の意思決定はあんまり関係無いというのは事実なんです。それにほとんどの人は日々の生活で既に忙しいです。毎日仕事をしてその上で家族がいたり趣味があったり。政治についてリソースを割く余裕なんてそんなに無いのが本音です。そもそも全員が同じこと考えなければならないなんてナンセンスじゃないですか。

まとめましょう。

  • 民主主義は"正しい選択"をすることは目的でない。
  • 市民には市民各々の生活があるため"正しい選択"についてじっくり考えている時間は無い。
  • 仮にじっくり考えた人がいてもじっくり考えない人が多ければ意味が無い。
  • 従って今の民主制は"正しい選択"からは離れやすい。

 そこで本日ご紹介する方法がこちら。
議員を選ぶ投票に行く人を、くじ引きで選ぶ
具体的にはこんな感じ。

  1. 投票権を持つ人の中から無作為に選ばれた何人かだけに手紙を送る。
  2. 手紙には今配られている物よりもっと詳細な候補者についての資料を添付する。
  3. 選ばれた人は仕事等を一日休ませる。そのための金銭の補填や予備日の設定は十分に。
  4. その選ばれた人たちに熟考させた上で投票させる。

 従来の方法では市民全員のリソースを要求しましたが、これを少人数に集約させることで効率化を図ります。一万人がそれぞれ1分考えるより、百人が100分考えた方が冷静な結論を下せるという考え方です。選ぶ人自体は偏りの無い方法で選ばれますから、統計的には『皆の意見を聞いた』ということになります。他にも明確に"役割"を与えられるため権利を放棄する人の割合が減るみたいなメリットも想定できますね。

 まぁこの方法で万事うまくいくほど世の中甘かないだろうってことは百も承知なんだけど、僕が一番言いたかったのは

民主主義なんて信奉するほど偉い絶対正義なんかじゃなくて、クソみたいなシステムだけど他に選択肢がないから仕方なくクソに甘んじてるんだ

ってことです。

 ちなみにこの仕組僕のアイディアではなくだいぶ前にどこかのサイトで見かけた欧米の学者さんが考えた方法だったと思うんだけど、このアイディアだけ覚えてて制度の名前とか周りの情報を忘れてしまったため元ネタにたどり着けなくなってしまった。誰か分かる人がいたら教えて欲しい。


ところでスペース☆ダンディ、良いよね。

"愛"と"金"の話

お金は好きですか?私は好きです。

 好きな人も嫌いな人も色々信念なり哲学なりがあるんでしょうが、まぁお金無いと生きるのに困るという点では大体一致すると思います。それはそうと世の中にはお金を嫌う価値観が確かに存在します。例えばお金を沢山稼いで上流階級と肩を並べるようになった人を「成金」と呼びます。大抵は悪いニュアンスです。それに金貸しは歴史上最も嫌われている職業の1つと言えるでしょう。プレゼントに現金を渡す人ってのもあまり無い。

 じゃあどうしてそんなにお金が嫌われるんでしょうね?という話を今日はしたいと思います。

続きを読む