レビュー:アラン 幸福論【哲学】
- 作者: アラン,Alain,神谷幹夫
- 出版社/メーカー: 岩波書店
- 発売日: 1998/01/16
- メディア: 文庫
- 購入: 12人 クリック: 79回
- この商品を含むブログ (103件) を見る
意識しないと人間は悲観的になってしまい、無駄に不幸となってしまう。
幸福になろうという意志をもって生きなければ幸福になれないというのが、アランの幸福論全体を通しての主張だと解釈しました。
本書は「三大幸福論」の一つで、ラッセルの幸福論を読んだ後に読みました。
本書はラッセルの論理的な展開とは異なり、93の「プロポ(哲学断章)」という3~5Pの文章の集合から成り、その中に様々な気づきを与えてくれる文が散らばっています。
ただ、本書もラッセルのものと同じく、前半は不幸になってしまう原因について多く語り、後半は幸福になるための姿勢について多く語っていたように感じます。
本書の特徴として、たくさんのプロポのどれか一つを度々読み返すことで、いつもいろんな気づきがあるのではないかと思います。それぐらい本書にはいろんな思いが詰まっているように感じました。不安な気持ちが大きくなったときに読み返すと良いかもしれません。
以下、まとめです。
7:恐れは病気だ
- 心が健康にふさわしい動作をすること、それが健康のしるしである、という一種の定理による。
9:想像上の苦痛
- 死をうけとめることができるのは生きている人だけである。悲運の重圧をうけとめることができるのは幸福な人だけである。つまり、言ってしまえば、人間は自分の苦悩よりも他人の苦悩に対して敏感になっている。それは欺瞞でもなんでもないのだ。そこから人生についてまちがった判断を下してしまう。よく注意しないと、一生を台なしにしかねない。全力をもって、真の叡智をはたらかせて、実際の現実を考えねばならない。悲劇を演じようとしないで。
42:行動すること
- 人間は自分からやりたいのだ、外からの力でされるのは欲しない。
44:ディオゲネス
- 人間が幸福であるといえるのは、何かを欲する時と、つくり出す時だけである。
63:雨の中で
- どうして君は、自分自身に対してもかけがえのない友となってやらないのか。
64:興奮
- 幸福は平和がもたらす結果ではない。幸福とは平和そのものであるから。
73:上機嫌
- 死者たちのことを、できるかぎり友情とよろこびをもって語ることである。親切とはよろこびにほかならない。愛(アムール)とはよころびにほかならない。
77:友情
- 友情のなかにはすばらしいよろこびがある。
87:克服
- 期待を抱くこと、それはつまり幸福であるということなのだ。仕事を規則正しくすること、そして困難を、さらなる困難を乗り越えること、これがおそらく幸福に至る正道である。
88:詩人たち
- 相違は美しいものだ
89:幸福は徳である
- 人に幸福を与えるためには自分自身のうちに幸福をもっていなければならない。
91:幸福になる方法
- 自分の不幸は、現在のものも過去のものも、絶対他人に言わないことである
93:誓わねばならない
- 悲観主義は気分によるものであり、楽観主義(オプティミスム)は意志によるものである。
8 Queens Problem
再帰処理を利用してエイトクイーン問題を解きます。
エイトクイーン問題とは
チェスの盤上に、8個のクイーンを配置する。 このとき、どの駒も他の駒に取られるような位置においてはいけない。 クイーンの動きは、上下左右斜めの8方向に、 遮る物がない限り進める。将棋の飛車と角行を合わせた動きである。
というものです。
8queens.rb
$SIZE = 7 $pos = [] $flag_a = [] $flag_b = [] $flag_c = [] def print_pos board = Array.new($SIZE+1).map{Array.new($SIZE+1," ")} $pos.each_with_index {|q,column| board[q][column] = "q" } board.each{ |elem| p elem } puts "\n" end def set(i) (0..$SIZE).each { |x| if($flag_a[x]==0 && $flag_b[i+x]==0 && $flag_c[i-x+7]==0) then $pos[i] = x if i == $SIZE then print_pos() else $flag_a[x] = $flag_b[i+x] = $flag_c[i-x+$SIZE] = 1 set(i+1) $flag_a[x] = $flag_b[i+x] = $flag_c[i-x+$SIZE] = 0 end end } end $pos.fill(0,0..$SIZE) $flag_a.fill(0,0..$SIZE) $flag_b.fill(0,0..$SIZE*2) $flag_c.fill(0,0..$SIZE*2) set(0)
実行結果のうち二つ(全92通り)
[" ", " ", "q", " ", " ", " ", " ", " "] [" ", " ", " ", " ", "q", " ", " ", " "] [" ", "q", " ", " ", " ", " ", " ", " "] [" ", " ", " ", " ", " ", " ", " ", "q"] [" ", " ", " ", " ", " ", "q", " ", " "] [" ", " ", " ", "q", " ", " ", " ", " "] [" ", " ", " ", " ", " ", " ", "q", " "] ["q", " ", " ", " ", " ", " ", " ", " "] [" ", " ", "q", " ", " ", " ", " ", " "] [" ", " ", " ", " ", " ", "q", " ", " "] [" ", " ", " ", "q", " ", " ", " ", " "] [" ", "q", " ", " ", " ", " ", " ", " "] [" ", " ", " ", " ", " ", " ", " ", "q"] [" ", " ", " ", " ", "q", " ", " ", " "] [" ", " ", " ", " ", " ", " ", "q", " "] ["q", " ", " ", " ", " ", " ", " ", " "]
rubyをもっと知っていれば、もっとかっこよく書けそうなのですが、
私にはこれが限界です。これもこちらを参考にさせてもらっています。
さて、エイトクイーン問題は初めて実装したのですが、
考え方は結構単純です。
すべての場合を列挙し、そこから条件を絞っていくという流れです。
下記の部分で条件判定をしています。
if($flag_a[x]==0 && $flag_b[i+x]==0 && $flag_c[i-x+$SIZE]==0) then
書籍で紹介されていて自分もすぐにこういう法則を
発見できるように精進していきたいです。
- 作者: 柴田望洋,辻亮介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/09/01
- メディア: 単行本
- 購入: 3人 クリック: 37回
- この商品を含むブログ (7件) を見る
組み合わせの列挙~再帰~
再帰処理を利用して組み合わせ(3桁の3進数の取りうる値)の列挙をします。
$SIZE = 3 $pos = [] def print_pos print "#{$pos}\n" end def set(i) (0..$SIZE).each { |x| $pos[i] = x if i == $SIZE -1 then print_pos() else set(i+1) end } end set(0)
実行結果です
[0, 0, 0] [0, 0, 1] [0, 0, 2] ~中略~ [3, 3, 2] [3, 3, 3]
繰り返し文で実現することもできますが、再帰で実装しました。
私は、再帰処理はなんとなく頭で理解していても
細かい動きまでイメージできない場合があります。
なので機会があったので実装しました。
再帰は重いから嫌われますが、コードとして美しいなと改めて感じました。
ダイクストラ法~線形探索~
Rubyでダイクストラ法の実装を行います。
探索済みとなる要素は線形探索しています。
(こちらのコードをrubyコードに変換することで実装させてもらいました。)
$MAX_V = 6 $INF = 100000 def dijkstra(s) cost = [ [$INF, 2, 5, $INF, $INF, $INF, $INF], [2, $INF, 4, 6, 10, $INF, $INF], [5, 4, $INF, 2, $INF, $INF, $INF], [$INF, 6, 2, $INF, $INF, 1, $INF], [$INF, 10, $INF, $INF, $INF, 3, 5], [$INF, $INF, $INF, 1, 3, $INF, 9], [$INF, $INF, $INF, $INF, 5, 9, $INF]] d = [] used = [] d.fill($INF,0..$MAX_V) used.fill(false,0..$MAX_V) d[s] = 0 while(1) v = -1 for u in 0..$MAX_V do if !used[u] && (v == -1 || d[u] < d[v]) then v = u end end if v == -1 then break end used[v] = true for u in 0..$MAX_V do d[u] = d[u] < (d[v] + cost[v][u]) ? d[u] : (d[v] + cost[v][u]) end end return d end print dijkstra(0)
実行結果です。途中のノード番号などを出力はしていません。
[0, 2, 5, 7, 11, 8, 16] Complete(0)
線形探索部分が下記の部分です。
条件文は(ノードが確定しているかのフラグ && 未訪問 || 現在値よりも小さい)
と読めます。
for u in 0..$MAX_V do if !used[u] && (v == -1 || d[u] < d[v]) then v = u end end
経路更新は下記の部分です。
対象すると経路(d[u])に対して、新規経路(d[v] + cost[v][u])の方が短いかどうか
を判定し、その結果を代入しています。
途中のノード番号を保持するならばここに追加コードが必要です。
for u in 0..$MAX_V do d[u] = d[u] < (d[v] + cost[v][u]) ? d[u] : (d[v] + cost[v][u]) end
今回は線形探索で実装しましたが、次はプライオリティキューを用いて実装したいです。
配列におけるマイナスの添え字
Rubyで配列においてマイナスの添え字を与えた場合の結果です。
サンプルコード
array = [1,2,3,4,5] puts array[4] puts array[3] puts array[2] puts array[1] puts array[0] puts array[-1] puts array[-2] puts array[-3] puts array[-4] puts array[-5]
実行結果
5 4 3 2 1 5 4 3 2 1 Complete(0)
今まで知らなかったので気づいて面白かったです。
nilなどが返ってくるのではなく、格納されている値が返ってくるので場合によっては注意が必要だと思います。
また、範囲外を指定するとnilが返ってきます。
要素数を数える3つの手段(size, length, count)
Rubyで配列などの要素数を数えるメソッドであるsize, length, countの違いです。
サンプルコード
array= [0,1,2,3,4,5,6,7,8,9] print "size = #{array.size}\n" print "length = #{array.length}\n" print "count = #{array.count}\n" print "count(2) = #{array.count(2)}\n" print "count(%2) = #{array.count{|x| x%2 == 0}}\n"
実行結果
size = 10 length = 10 count = 10 count(2) = 1 count(%2) = 5
となります。
まとめると
size, length:同様の動作を行う。
count:size, lengthと同様の動作をさせることが可能。
条件やブロックを与えることで任意の要素数を数えることも可能。
と言えます。
こちらのサイトの情報と同じですが、自分でまとめておきたかったので書きました。
EvernoteAPIを利用したEvernoteのノート検索
evernote_oauthパッケージを用いたEvernoteAPIの初歩的な利用について紹介します。
EvernoteAPIではNoteStoreを取得し、
そのNoteStoreに実装されているメソッドを利用することで
対象とするEverenoteアカウントの情報(ノートブック、ノート、ノート本文など)
を取得することができます。
さらに、検索フィルターを設定することで
条件に合致する情報に絞って取得することも可能です。
なお、EvernoteAPIの仕様はこちらのWebページにまとめられています。
下記のサンプルコードは
1:対象とするノートブック名を入力し、
2:そのノートブック内のノートの一覧から任意のノート名(またはその一部)を入力し、
3:そのノートの本文を取得する
というものです。
なお、トークン取得はこちらのblogを参考にさせていただきました。
# -*- coding: utf-8 -*- require "evernote_oauth" #NoteStore取得 クライアントはsandboxアカウントを利用 token = "ここはトークンIDを記述する" client = EvernoteOAuth::Client.new(:token => token, :sandbox => true) note_store = client.note_store #ノートブック取得 notebooks = note_store.listNotebooks(token) puts "ノートブック一覧" notebooks.each { |notebook| puts " * #{notebook.name}"} notebooksguid = 0 begin print "利用するノートブックの名前を入力してください:" notebook_name = gets.chomp # GUIDをとりたいノートブックの名前 note_store.listNotebooks.select do |notebook| if notebook.name == notebook_name then notebooksguid = notebook.guid end end rescue Exception => e puts e.message print notebook_name + "を含むノートは見つかりませんでした\n" retry end # 検索条件として、検索語なし、指定したノートブック、更新日順ソートを指定 filter = Evernote::EDAM::NoteStore::NoteFilter.new filter.notebookGuid = notebooksguid filter.order = Evernote::EDAM::Type::NoteSortOrder::UPDATED # 検索結果として、タイトル名のみを指定 resultSpec = Evernote::EDAM::NoteStore::NotesMetadataResultSpec.new # noteList にノート 10 件のタイトルを取得 noteMetaList = note_store.findNotesMetadata(token,filter,0,10,resultSpec) #各ノートのタイトルを表示 noteMetaList.notes.each { | note | noteEdam = note_store.getNote(token, note.guid, 1,0,0,0) puts noteEdam.title } #対象ノートブックの中から任意の検索語によるノートを検索 print "ノートブック:" + notebook_name + "\n" print "ノート検索(end=>fin):" spec = Evernote::EDAM::NoteStore::NotesMetadataResultSpec.new filter.words = "" while (1) #見つからなかった時の例外処理 begin if (filter.words = gets.chomp) == "end" then break end guid = note_store.findNotesMetadata(token, filter, 0, 1,spec).notes[0].guid noteEdam = note_store.getNote(token, guid, 1,0,0,0) content = noteEdam.content bodyHead = "<en-note>" bodyEnd = "</en-note>" body = content[ content.index(bodyHead)+bodyHead.length .. content.index(bodyEnd)-1 ] rescue Exception => e print filter.words + "を含むノートは見つかりませんでした\n" print "ノート検索(end=>fin):" retry end brTag = '<br clear="none"/>' body.gsub!(brTag,"\n") body.gsub!("<div>","") body.gsub!("</div>","") body.gsub!(""",'"') body.gsub!("<","<") body.gsub!(">",">") print "タイトル:" + noteEdam.title + "\n" puts body print "\nノート検索(end=>fin):" end