Lahの部屋

落書き帳です。見たい人は見てください。

思考の切実さ

自分は頭が悪くなったなあと思う。

大学生のときは物事をもっと精緻に捉えていたし、起きているときは常に考え事をする習慣があった。社会人になってそれは明らかに失われてきている。内省力ないし思考力は僕が矜持をもっているところでもあったから、少し悲しい。

対処すべき問題が少なくなった、というのが原因としてあると思う。もちろん仕事や家庭で考えなくてはいけないことはあるが、そこでは自分の内に向かう思考が求められる機会は少ない。

学生時代には、精神的に自立が求められながら家庭に従属するという宙吊り状態にある。親族内で流通する倫理にも対処しなくてはいけない。

また、家庭や義務教育などのように自らの意思によらない所属をもつことになる。存在の仕方がすでに不安定だったのだ。

日常が、トピックに恵まれていた。

やはり結局、個人が熱心に回す内省的思考というのは、各人の抱える切実な問題に対する直接的あるいは間接的な対処の域を出ないのではないか。それ自身で完結する純粋な思考などなく、思考は常に何らかに対する応答なのかもしれない。

倫理学に励む気持ちなどが典型的だ。現実世界で自分が直面あるいは見聞きした倫理的理不尽への抵抗が、そのエネルギー源になったりする。

僕の思考は、そんな捻じ曲がった切実さを駆動力としていたんだと、最近になって気付かされた。

しかしながら、思考を回さなくても幸せに生きられるようになったというのは、考え事に暮れて必死に境遇を受容していた頃の自分がまさに求めていたものだ。ただ、なんというか、満足な豚になることをよしとしている自分がいて、旧友に見放されたような寂しさがある。次に不幸が訪れるまでの間、この形容し難い感覚と付き合っていくんだろう。

Nobles Obligeと偶然性

 Nobles Obligeというのは素敵な倫理だなあと思う。これは端的にいえば、強者が弱者に施すべきだという原理だ。メリトクラシーの荒波に揉まれる今日この頃、このNobles Obligeの倫理をより原理から考えていきたい。


 僕がNobles Obligeを支持するのは、偶然性を日常的に感じているからだ。


 成功者が成功者であることができたのには、幾分かの偶然性が必ず寄与している。具体的には、生まれた家がもつ富や文化資本、特定の才能、そして、その能力が認められる社会にたまたま誕生できたこと、などだ。この世に成功というものがあるとして、そこに偶然性が多大に絡むことには疑いの余地がない。


 そして、それら偶然的なもの(coincidence)によって金銭などの意味で利益を得ることができるのには、十分な「試行回数」が必要である。
ここでいう「試行回数」とは、この世界に沢山の人間が生まれているということである。すなわち、ある人が利益を上げているとき、その人は利益を得ていない全ての人間に対して借りがある状態だといえる。


 その借りを返すべし、という倫理こそがNoblesse Obligeだと僕は思う。


 もちろん政府が貧富や特性などの偶然性による格差を埋めるべく活動しているけれど、それだけに頼ることはできない。なぜなら、支援される者と支援されないものとの境界で常に問題が発生するからだ。政府のような厳密な存在はあらゆる種の不遇さを漏れなく想定することはできないし、必要な施しを精密に見定めることもできない。


 では、Noblesse Obligeの倫理に従えば、恵まれない者への施しが正確に行われるのだろうか?


 それもおそらくNoだろう。重要なのは、その点を曖昧にしてしまうことだ。
 富める者が他者の様々な恵まれなさを感じ取り、そこに都度施しを行うことで、引き換えに道徳的利益を得る。この営みが社会に根付くことにより、「恵まれること」と「恵まれないこと」とを貫く基軸が多元化し、利益の概念が交錯する。こうして全てを有耶無耶にすることが、絶対的な不遇さの解消につながる気がしている。


 すごく曖昧な展望だが、これからの世の中はこういう徳によって良くなってほしいなあと思う。

ファイル暗号化ソフトを自作してみた

 ファイルをパスワードで暗号化するデスクトップアプリを作ってみた。画面はこんな感じ。


 ソフト本体(JARファイル)は以下で公開したよ。Macで作成したけど、JARなのでOSに依存せず動作するはず。
github.com

暗号化アルゴリズム

  1. 入力したパスワードをSHA-1でハッシュ化する
  2. ファイルをbyte列として読み込む
  3. パスワードハッシュとファイル内容を1 byteずつ突合し、XOR演算をする
  4. 新しいファイルとして出力する

ソース

 アプリの核となる暗号化処理をする部分のソースはこんな感じ。BufferedStreamを使った方が処理は速くなると思うけど、ロジックがややこしくなるので使わなかった。

// 本処理
byte[] pw_hash = sha1(pw);
int index = 0;
FileInputStream fis = new FileInputStream(inputFile);
FileOutputStream fos = new FileOutputStream(outputFile);
byte[] data = new byte[1];
// ファイルから1バイトずつ読み込み、ハッシュとXOR演算する。
while ((fis.read(data, 0, 1)) != -1) {
	data[0] = (byte) (data[0] ^ pw_hash[index]);
	fos.write(data, 0, 1);
	// 演算用バイト列の中身は一回ごとにクリアする。
	data[0] = 0;
	// ハッシュ値の項目番号は周期20でリセットする。
	switch (index) {
	case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18:
		index++;
		break;
	case 19:
		index = 0;
		break;
	}
}
fis.close();
fos.close();

// パスワードからSHA-1のハッシュ値を算出するメソッド
private static byte[] sha1(String pw) throws NoSuchAlgorithmException {
	MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
	byte[] result = sha1.digest(pw.getBytes());
	return result;
}

セキュリティについて

 暗号化セキュリティはそこまで強固ではないと思う。
 共通鍵暗号だと見たとき、セキュリティに関してはハッシュ化アルゴリズムSHA-1の強度に依存していることになる。その点はSHA-256などにすれば多少マシにはなるだろう。
 弱点になりそうなのは暗号の周期性だ。パスワードから生成された20 byteのハッシュをそのままXOR演算に使用しているため、ファイル内容に対して20 byteおきに同じ演算がなされることになる。それがファイル内容の周期性と噛み合ってしまったら、暗号として意味をなさなくなるかもしれない。
 色々な暗号化システムで採用されている通り、やはり並び替え処理は必要なのだと思う。

まとめ

 楽しかった。byteレベルでファイルを操作できることがわかったので、今後はそういう処理を使って便利な機能を有する何かを作りたい。面倒臭くない範囲で。

自由意志って何?

 自由意志とは、人間が自発的に行為できる能力のことだ。自由意志が存在するのか否かという問題は、人に行為責任を負わせるときの合理性を支えるからというのもあって、重要な哲学的問題のひとつとされている。

 この掴みどころのない概念について、今のところの自分の意見をまとめた。

両立論

 自由意志をどんなものだと考えるかについての立場は、まず大きく二分される。両立論(決定論と両立するという立場)と非両立論(決定論と両立しないという立場)だ。

 これらは、すでに意味内容が確立された自由意志なるものがどんな属性をもつか、についてではなく、自由意志というのをどう定義するのかという決定についての二つの立場だ。したがって、説Aと説Bとの間の排他的論争とは異なり、自由意志についての異なる言明として互いに両立しうる。

 もっとも、僕はかなり経験論に傾倒しているので決定論をナンセンスだと思っている。なので厳密には両立論者ではないのだが、一般には両立論に含まれる立場をとっていると思う。

 

自己制御感

 非両立論の立場をとるひとは、要するに「物理世界の将来は決まっているんだから、我々は自由でない!」みたいなことを言っているわけだ。言いたいことはわかる。因果の鎖が物理世界の中だけで閉じているのだとしたら、我々の心とか精神が「自由による因果性」を追加するすべはない。

 しかし、仮に決定論を受け入れたとしても、「そうは言っても我々は自由に行動できるじゃん?」という主張ができる。

 そういう、自己制御感とでもいうべき感覚を頼りに、両立論を推したい。未来が決まっていても自由な選択ができる、という感じ。

 感覚だけで主張をするのも格好悪いので、もうすこし理論的に整理したい。

 

経験論的なアプローチ

 記事の冒頭で、自由意志は人に行為責任を負わせる合理性に関係するので大事だと言った。ということは、後者から前者の輪郭を掴もうというアプローチができる。

 わかりにくいので言い換える。「自由意志」という言葉はちょっと抽象的で捉えどころが難しい。そこで、「自由意志があると、自分が行為責任を負わされることが理不尽なことではなくなる」という、自由意志がもたらす実際的な効果に着目する。「行為責任を負わされることが理不尽ではなくなる」という性質が、自由意志が何たるかを規定している、と捉えられる。したがって、「行為責任を負わされることが理不尽ではなくなる」条件が、そのまま自由意志の成立条件として挙げられる。

 それは以下のふたつではないかと思う。

  1. 自分の身体が行為Aをしたという記憶
  2. 自分が行為Aを意図したという記憶

 これらふたつを照合することによって反省的に確証されるのが「自由意志」なのだと思っている。

 

締め

 おわり。形而上学的な概念を解体するのは結構好きだ。またもう一歩考えが進んだら記事として残そうと思う。

 

jsで端末情報を抜き取ってみる

概要

 ネットを渡り歩いていると、ときどき有害そうなサイトにあたることがある。「会員登録が完了しました。お金を払ってください。」という警告じみたサイトだ。そんなサイトには「あなたのIPアドレスは〇〇で、PCの機種は〇〇ですね?」みたいな文言がついていることが多い。初めて見ると少しびっくりする。

 今回はそれを再現したい。とはいっても詐欺に手を染めるわけじゃない。端末の情報を取得するという技術的な部分だけ。

 先にお断りしておくと、本記事で紹介・実装した機能はあくまでも利用者の端末上で動作し、利用者に対して情報を表示させているだけだ。


ブラウザ情報を抜き取る

 まずは、以下のような情報を抜き出してみる。ボタンを押してみてほしい。

 

ブラウザ情報:

言語設定:

 上のような情報は特に工夫をしなくとも簡単に表示できる。JavaScriptにあるwindowという最上位のオブジェクトから、それぞれ以下のプロパティを抜き出しているだけ。

// ブラウザなどの情報
window.navigator.userAgent;

// 言語設定
window.navigator.language;


IPアドレスを抜き取る

 IPアドレスを表示すると、「あなたを特定しましたよ」感が出る。しかし、JavaScriptのプログラムだけではIPアドレスは取得できない。なぜなら、JavaScriptはユーザがHTTPで取得したHTML内に埋め込まれているからだ。ネットワーク層で用いられるIPアドレスの情報には触れようがない。

 とはいえ、少し工夫すると可能だ。

 

あなたのIPアドレス

 以下のサイトで公開されているAPIjQueryを使って下のような感じで実装した。

ipinfo.io

$.get("https://ipinfo.io", function(res) {
document.getElementById("ip_address").innerHTML = "あなたのIPアドレス:" + res.ip;
}, "jsonp");

 確かに、JavaScriptはHTMLに埋め込まれているため通信過程には関与できない。しかし、埋め込んだスクリプトを使ってネット上のAPIにアクセスさせれば、別途IPアドレスを取得させることができる。

 なお、家のルータやプロキシなどを経由して(NAPTを使って)通信している場合には、使用している端末にかかわらず、それら中継機器のグローバルIPアドレスが表示されるはずだ。だから基本的には、同じルータに繋がっているPCとスマホでは同じIPアドレスが表示される。


まとめ

 これらは、端末から引き出せる情報のごく一部だ。調べていくと、他にもバッテリーの充電状態や、直前に訪問したサイトなんかも表示することができるみたいだ。このように、偽サイトに自分の端末の情報が表示されたとしても、大抵は本記事のように無害なので安心してほしい。

【自分用】記事の書き方

 「記事の書き方」と題したが、人に伝わりやすい文章の書き方について語るわけではない。目指すのは、本ブログのように自己満足を目的にしたような記事だ。今考える文章構築メソッドをまとめておくことで、今後このブログに記事を書くときの参考にしたい。

 

 以下のような記事を目指している。

  1. 書きたいことを好きな言い回しで書く
  2. 言いたいことは余すことなく言う
  3. 人に内容を理解してもらうための具体例を無理に入れない
  4. 最低限の体裁は整える

 

 まずは、トピックを決める。日常を生きていたら何かしら湧いてくるものだ。最近勉強している分野、日頃の理不尽、社会情勢。なんでもよい。トピック名として言語化するのが難しいようなテーマもある。そういうときにはこの工程をスキップする。記事のタイトルをつけるときに考えればいい。

 

 次に、内容として盛り込みたいことを挙げる。こういうことを言いたい、こういう言い回しをしたい、みたいなのをひたすら書き殴る。それらは脳内で発火のごとくランダムに湧いてくる。無秩序な言葉の羅列。ブレインストーム。タイピング楽しい。かたかた。トピックにもよるが、お酒を飲むと捗る。

 

 酔いが醒めたら、全体の構成を考える。ただし大雑把でよい。序論、本論、結論。うーん、この文はこのへん。かなりラフに配置する。

 

 「つかみ」を書く。最難関の作業だ。そもそも、好きなものを並べた文章には「つかみ」など存在していない。しかしながら、こういう「序論」のようなパートがないと全体構造がまとまらないものなのだ。仕方がないので、論文のabstractみたいなものを書く。もちろん、「つかみ」と呼ぶほど読者を掴む力はない。握力はUFOキャッチャー以下。

 

 以上の工程を経ることで、読むに堪えない文章が完成する。ここからは文章を慎重に点検する。

 

 まずは全体構成をチェックする。同じ主張が文章内の複数箇所で繰り返されていないか。同じ言葉を目的なしに繰り返していないか。この主張はこっちの段落で述べたほうがシンプルではないか。僕は完璧な文章を組むのには時間がかかるくせに、すでにある文章の不備を指摘するのは得意だ。激しく添削する。文法のねじれが湯水のように見つかるが、淡々と修正する。気にすることはない。もともと雑に書いたものなんだから。

 

 次に、読みやすさを点検する。内容的な読みやすさは度外視して、読んでいるときのリズムがまともであることを確認する。読者が僕の思いを理解してくれなくても、せめて音韻が整っていれば暇つぶしにはなるだろう。

 

 最後に、字数チェック。文字数がある値を超えていないものは、「下書き」に眠らせておく。文字数の少ない文章の投稿を許してしまったら、10年後にはツイートと大差なくなってしまいそうだからだ。文字数が少ない記事には、気が向いたときに加筆する。そこそこ長くなったタイミングで投稿する。

 

 おわり。この文章も以上のようなプロセスで書いた。元気があれば、最後に「まとめ」を書く。

決定論とその周辺の話

 決定論まわりの議論についての今の見解をメモとして残したいなと思って書いた。自分の中でだいたい結論は出ているものの、他者に説明するときに上手く言葉が出てこなくて困ることが多いからだ。

決定論の主張

 まず、決定論の主張内容を確認したい。日本大百科全書の「決定論」の項目には、下のように書いてあった。

世の中でどういうことが起こるかは、未来永劫にわたってすべてあらかじめ決定されている、と主張する立場。

 要するに、決定論の意義と真偽を考えるためには、この「あらかじめ決定されている」が何を意味するのかを考えればいいわけだ。

 

実証学的プラグマティズム

 決定論の主張を分析するにあたって、実証学的プラグマティズムの理論を基軸にして考えたい。これは、一言でいえば「観念の意味は、それがもたらす具体的な結果にある」という主張だ。僕がいつも無意識に使ってしまってる主張のひとつなので、ここで明示しておく。

 これを採用することによって、議論が過度に抽象化されるのを防ぐことができる。思惟経済にかなう、なんて言い方もする。

 次の節では、これに基づいて決定論の主張を見てみる。

 

出来事の記録

 結論から言ってしまえば、「あらかじめ決定されている」という主張は無内容だ。

 一般に、何かの出来事の発生が「あらかじめ決定されている」というのは、未来にその出来事が発生することが、現在どこかの装置に記録されているということを指す。「装置」というのは、例えば、メモ帳、電子媒体、記憶などのことだ。

 ここでさらにプラグマティックに分析する。「記録されている」ということは、それが読み取り可能であるということでもある。解読できない文章をメモとは呼ばないし、絶対に思い出せないものを記憶とは呼ばない。再生可能性は記録の定義だ。

 しかしながら、未来の出来事は読み取り可能な形で記録されてはいない。すなわち、決定論の言う「決定されている」は、プラグマティックな「決定されている」の条件を満たさない。したがって、決定論は誤りないしナンセンスだということができる。

 

もっとそもそも

 そもそも、決定論問題の是非をプラグマティックに問いたいのなら、「決定論が成り立った場合と成り立たなかった場合とで、我々の実際的な経験はどのように異なるか」を考えればいい。

 もちろん、両者では何も異ならない。決定論と非決定論のどっちを採用したとしても、我々の経験を説明できるからだ。そう考えると、決定論の真偽を問うこと自体が、経験論的にナンセンスだといえる。

 

量子力学決定論

 決定論を否定する意見として、量子力学を援用するものがある。粒子Aが地点Xに見出される出来事は確率的にしか議論できないものだから、決定論は誤りだ、という主張だ。

 これはなかなかもっともらしいが、形而上学的な主張の前にはちょっと弱いと思う。

 決定論者の立場からすれば、「粒子Aが地点Xに見出されることを我々は確率的にしか予測できないものの、粒子Aが地点Xに見出されることは別途あらかじめ決定されていた」と反論すればいいだけだからだ。サイコロの出目と同様に、「発生確率についてしか議論ができないのは我々の無知ゆえである」という反論をされてしまうと、言い返しにくい。

 そもそもシュレディンガー方程式は経験則だし、コペンハーゲン解釈は現実の解釈のひとつにすぎない。そのままの形では、こういう形而上学的な主張の打破には向かないと思う。

 

運命論と決定論

 決定論と近しい主張として運命論がある。運命論は、未来が「あらかじめ決定されている」のだという主張において決定論と似ているが、決定論ほど強固な言明ではない(「運命は変えられる」とされる場合がある)。また、単なる決定論的方向性に加えてロマンティシズムのような側面を持つ(「まさに運命」などのニュアンスによく表れている)。

 そう考えると、「運命はあるか?」という議論は全く違った形をとりそうだ。これの説明には現象学あたりが役立つのではないだろうか。面白そう。