2011/12/15

FRYING DUTCHMAN humanERROR

# タイトルと記事内容が不一致なのはミスじゃありません。*1

電力不足だから、原発は必要だとか、
放射性物質ってのはもともと自然界に存在していたから大丈夫!だとか
日本の技術力はすごいのだ。原発売って何が悪いかとか。
このように考える方は少なからずいらっしゃるでしょう。

または、
セシウム137 だけじゃない、学問的プロパガンダにも汚染されてしまったのに
その自覚が全くない理系出身の方々や、

内部被曝による健康被害は科学的には立証されていないらしい...
すなわち、人体に影響はなーい。
このようなおとぎ話を「まるで宗教のように信じ込み」
懐疑的視点を持たない己の『非』科学的態度を省みず、
Web を探せばどこにでも転がっているチェルノブイリの汚染地図も、
チェルノブイリ周辺の子供たちのガンはどのようなものかも、
自ら自発的に「調べようとしたことがなく」
内部被曝について検索したこともないことを、
すっかり棚に上げきったあげく...

騒ぎ過ぎ。と言い放つ俺様の方々。

このような人々にとっての『科学的』とは一体何なのでしょうか?

下記のサイトは、福島原発が放出した放射性物質について、
一般市民が科学的に理解する上で欠かせない重要なことを示唆していると思います。
./note008.html

-- その他関連

放射線と健康

「情報を開示し子供と妊産婦を守れ」チェルノブイリ周辺で甲状腺癌治療に従事した松本市長 菅谷昭氏 | SAVE CHILD

被曝と健康被害との関係については、議論の余地があるが、
『法的』な面から捉えた場合は、あまり議論の余地はないのでは?
という東京大学の先生の意見もあります。
事故で放射能汚染があったため、放射線管理区域(一時管理区域)を設定していた実例

この法律が制定された当時の研究者や原発を推進した政治家たちでさえ、
人口的な放射性物質と健康との関係において科学的に未解明なことがあるから
といってそれを「根拠」に法律を「制定しない」という判断は下しませんでした。
なぜでしょう?
法律自体の必要性や、そこに定められた線量は科学的根拠を持ったものか?
や、なぜこの法律の中で飲食や睡眠を禁止しているのかについて、
是非ご一考いただければと思います。

もし仮に、この法律が存在しなかったら....
全国あちこちにある
大学内、企業内、実験所内などの放射線管理区域に日々出入りする人々は
仕事をしながら、無制限に外部被曝、内部被曝してよし、
とされてしまいます。
被曝と健康との関係が立証されようが、されまいが
自らの健康を保護することができない環境下におかれてしまう訳です。
もし、法律がなかったら現実におこっていたことでしょう。
この法律によって命びろいした人や、事故を未然に防止できたケースも
あったであろうと推測できます。

そして、なにより重要なことは、福島原発事故によって、
放射線管理区域に相当する地域になってしまった場所で、
居住する一般市民が存在していることです。

*1
限られた日本人たちの間で蔓延する『空気』とやらを重んじるならば、
『決して』口にしてはいけないであろう詩を素晴らしく歌う Artist 。

YouTube - Broadcast Yourself
http://www.youtube.com/watch?v=ENBV0oUjvs0

# Google 動画検索 で FRYING DUTCHMAN humanERROR
# を検索すると Flash なしで聞くことのできるサイトもいくつかありました。

2011/11/22

iTunes: MacRuby で重複する曲を削除

先日
MacRuby で iTunes から重複する曲を削除するものを作りました。
https://gist.github.com/1382271
(OS X 10.7.2 限定)

-- 参考にさせていただいたサイト

# ファイルを移動させる際の条件など大変参考になりましたし、
# MacRuby についての情報もいろいろありました。
iTunesに重複登録されている音楽ファイルを削除する - Watsonのメモ

# iTunes.app に下記のような機能があったことをこれまで知りませんでした。
iTunes ライブラリで重複した項目を検索し、削除する方法

-- 当初、最も悩んだこと

track.delete
を実行すると なぜか MacRuby がクラッシュしました。
MacRuby バージョンは

% macruby -v
MacRuby 0.11 (ruby 1.9.2) [universal-darwin11.0, x86_64]


重複する曲が 20 個以上あるとき
playlist.tracks の曲を each でまわし一定の条件を満たしたタイミングで
track.delete するとクラッシュしました。
こんな感じ。

myplaylist.tracks.each{|x|
  if ...
  # x がなにかの条件をみたしたら
  x.delete
  # この瞬間にクラーッシュ!
}


それで、オブジェクトを探ってみることに...

test.rb

framework "ScriptingBridge"

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
a = i.sources[0].userPlaylists.find{|x| x.name ==  "ミュージック"}.tracks
p b = a[0]
p c = a[0]
p b.equal?(c)

#=>

% macruby test.rb
false

なんと false がかえってきました。
b, c は object としてはイコールでは『ない』とのこと。
a は1度しか定義していないにもかかわらず...。

例えば、Ruby 1.9 では

a = ["a","b","c"]
b = a[0]
c = a[0]
p b.equal?(c)

#=>

% ruby193 -v aaa.rb
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0]
true

true がかえってきます。

MacRuby のこの件について理解できておりませんが、ともかく
この事が原因でクラッシュをひきおこしているのかも? と考え
一意の曲オブジェクトを「確実」に指名する方法をとることにしました。
要は

track.databaseID

を使うことにしました。

こんな感じです。

条件をみたした 曲オブジェクトの databaseID を hash に溜め込んでから、
hash を each でまわしつつ
その都度 fileTracks から 指定した databaseID に基づいて曲オブジェクトを検索し
検出できたら
.delete
を実行...

      @h.each{|k,v|
        t = @filetracks.find{|x| x.databaseID == k}
        next unless t
        t.delete
      }


このようにしてみたところ .delete を実行しても
クラッシュしなくなりました。
# あくまでも私の環境下においてでは!です。

# ちなみに .fileTracks と .tracks の 2 種類ありますが
# 上記では .fileTracks を対象にしています。

2011/11/12

Tutorial MacRuby

Tutorial: OS X automation with MacRuby and the Scripting Bridge

One more for the road

以降にある iTunes のサンプルを実行すると

... `<main>': undefined method `playlists' for nil:NilClass (NoMethodError)


playlists がない?
なーんてことはなくて単に日本語システムだからだった。
要素名を日本語に変えればよいのだった。

...
  .find {|s| s.name == "ライブラリ"}
  .playlists.find {|p| p.name == "トップ 25"} #Top 25 Most Played"}
...


この内容を理解する為、基本的な AppleScript を動かす。

 tell application "iTunes"
  repeat with i in playlists
    if name of i is "ミュージック" then
      get tracks
    end if
  end repeat
end tell

AppleScript Editor.app のイベントログで
playlists の要素や tracks の属性を確認できた。
sources にアクセスしなくても、playlists を獲得できた。

MacRuby でも playlists 要素を目視したい為...

framework "ScriptingBridge"

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
i.sources.select{|x|
  x.playlists.each{|y|
    puts y.name
    if y.name ==  "トップ 25" # "トップレート", "ミュージック"
      songs = y.tracks.sort{|t1,t2| t2.playedCount <=> t1.playedCount}
      # songs[0..2].map{|t| puts "#{t.artist} - #{t.name} (#{t.playedCount})"}
    end
  }
}

puts y.name でプレイリスト名一覧を確認できた。

ライブラリ
ミュージック
ムービー
テレビ番組
Podcast
iTunes U
ブック
iTunes DJ
90 年代ミュージック
クラシック音楽
トップ 25
トップレート
ミュージックビデオ
最近再生した項目
最近追加した項目
ラジオ


書き換えながらいろいろ試す。

framework "ScriptingBridge"

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
ary = i.sources.map{|x| x.playlists}.flatten
top25 = ary.find{|i| i.name == "トップ 25"}
songs = top25.tracks.sort{|t1,t2| t2.playedCount <=> t1.playedCount}
songs.find_all{|t| t.rating > 2}.map{|t| puts "#{t.artist} - #{t.name} (#{t.playedCount})"}


Ruby らしい(つもりの)書き方へ。

framework "ScriptingBridge"

class MyiTunes
  def initialize(str)
    exit if (str.empty? or str.nil?)
    @str = str
    # iTunes Object
    i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
    # playlist Object
    @ary = i.sources.map{|x| x.playlists}.flatten
    @songs = @ary.find{|i| i.name == @str}.tracks
  end

  def debug
    @ary.each{|x| puts x.name}
  end

  def view
    print "-- #{@str}\n"
    find_all
    count_sort
    to_s
  end

  private
  def count_sort
    @songs = @songs.sort {|t1,t2| t2.playedCount <=> t1.playedCount}
  end

  def find_all
    @songs = @songs.find_all{|t| t.rating > 60}
  end

  def to_s
    @songs.each_with_index{|x,n|
      break if n > 2
      puts "#{x.artist} - #{x.name} (#{x.playedCount}) [#{x.rating}]"
    }
  end
end

MyiTunes.new("トップ 25").view
# MyiTunes.new("トップ 25").debug

実行結果

-- トップ 25
Glenn Gould - Bach: Goldberg Variations, BWV 988 - Aria (5) [100]
Glenn Gould - Bach: Goldberg Variations, BWV 988 - Var. 7 (5) [60]
Glenn Gould - Bach: Goldberg Variations, BWV 988 - Var. 5 (4) [80]
% 


MyiTunes クラスは
"トップ25" から、
星が3つ以上の曲を抽出し、
再生回数順にソートし
3行出力したら終わる。

.rating
に注意を払っていなかった。
puts 表示させてよくみてみると
星が 5つだと 100で、
星が 4つだと 80 で、
星が 3つだと 60 に、
なっていた。
星が3つ以上( > 60 )に変えた。
# t.rating > 60

iTunes.app 環境設定で表示する項目を減らして
MyiTunes.new("トップ 25").debug
を実行すると...正しく捕獲できた。

ライブラリ
ミュージック
ブック
90 年代ミュージック
クラシック音楽
トップ 25
トップレート
ミュージックビデオ
最近再生した項目
最近追加した項目
% 

MyiTunes.new("ミュージック")
でも OK だった。

-- 追記
OS X 10.7.2 で自力で MacRuby をインストールしていない為
/System/Library/PrivateFrameworks/MacRuby.framework/Versions/A/usr/bin/macruby
を使った。

最後に、~/Library/Logs/CrashReporter で
MacRuby がクラッシュしていないかみてみたが
大丈夫だった。

[2011-11-12]
最短?

i = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")
top25 = i.sources.flat_map{|x| x.playlists}.find{|t| t.name == "トップ 25"}
p top25.name
songs = top25.tracks
p songs.size
=>
"トップ 25"
25


[2011-11-22]
続き