レビュー:アラン 幸福論【哲学】

幸福論 (岩波文庫)

幸福論 (岩波文庫)

意識しないと人間は悲観的になってしまい、無駄に不幸となってしまう。

幸福になろうという意志をもって生きなければ幸福になれないというのが、アランの幸福論全体を通しての主張だと解釈しました。

本書は「三大幸福論」の一つで、ラッセルの幸福論を読んだ後に読みました。

本書はラッセルの論理的な展開とは異なり、93の「プロポ(哲学断章)」という3~5Pの文章の集合から成り、その中に様々な気づきを与えてくれる文が散らばっています。

ただ、本書もラッセルのものと同じく、前半は不幸になってしまう原因について多く語り、後半は幸福になるための姿勢について多く語っていたように感じます。

本書の特徴として、たくさんのプロポのどれか一つを度々読み返すことで、いつもいろんな気づきがあるのではないかと思います。それぐらい本書にはいろんな思いが詰まっているように感じました。不安な気持ちが大きくなったときに読み返すと良いかもしれません。

以下、まとめです。

1:名馬ブケファラス

  • こうして、アリストテレスの教え子はすでに、ほんとうの原因を知らないかぎり、情念を癒すことができないのを知っていた。
  • ピンをさがしたまえ。

7:恐れは病気だ

  • 心が健康にふさわしい動作をすること、それが健康のしるしである、という一種の定理による。

9:想像上の苦痛

  • 死をうけとめることができるのは生きている人だけである。悲運の重圧をうけとめることができるのは幸福な人だけである。つまり、言ってしまえば、人間は自分の苦悩よりも他人の苦悩に対して敏感になっている。それは欺瞞でもなんでもないのだ。そこから人生についてまちがった判断を下してしまう。よく注意しないと、一生を台なしにしかねない。全力をもって、真の叡智をはたらかせて、実際の現実を考えねばならない。悲劇を演じようとしないで

42:行動すること

  • 人間は自分からやりたいのだ、外からの力でされるのは欲しない。

44:ディオゲネス

  • 人間が幸福であるといえるのは、何かを欲する時と、つくり出す時だけである。

47:アリストテレス

  • 真の音楽家とは音楽を楽しむ者のことであり、真の政治家とは政治を楽しむ者のことである。(アリストテレス

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

書籍で紹介されていて自分もすぐにこういう法則を
発見できるように精進していきたいです。


新・明解C言語によるアルゴリズムとデータ構造

新・明解C言語によるアルゴリズムとデータ構造

組み合わせの列挙~再帰~

再帰処理を利用して組み合わせ(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!("&quot;",'"')
    body.gsub!("&lt;","<")
    body.gsub!("&gt;",">")

    print  "タイトル:" + noteEdam.title + "\n"
    puts   body
    print   "\nノート検索(end=>fin):"

end