method_missing [ruby]

method_missing

Module#undef_methodとModule#remove_method

リファクタリング

 #元のコード。data_sourceにある機器情報を取得し、出力するクラス
class Computer
  def intialize(computer_id, data_source)
    @id = computer_id
    @data_source = data_source
  end

  def mosce
    info = data_source.get_mouse_info(@id)
    price = data_source.get_mouse_price(@id)
    result = "Mouse : #{info}, #{price}"
  end

  def display
    info = data_source.get_display_info(@id)
    price = data_source.get_mouse_price(@id)
    result = "Display : #{info}, #{price}"
  end

  #以下同様のコードが続く
end


#リファクタリング
class Computer
  #今回method_missingで呼び出したいメソッドが親クラスなどに定義されていると困るので、それに対応
  instance_methods.each do |method|
    undef_method method unless method.to_s =~ /method_missing|respond_to¥?|^__.+__$/
  end

  def intialize(computer_id, data_source)
    @id = computer_id
    @data_source = data_source
  end

  def respond_to?(method)
    @data_source.respond_to?("get_#{method}_info") || super
  end

  def method_missing(name, *args)
    super unless @data_source.renspond_to?("get_#{name}_info)

    info = @data_source.__send__("get_#{name}_info", @id)
    price = @data_source.__send__("get_#{name}_price", @id)
    result = "#{name.capitalize} : #{info}, #{price}"
    end
  end

参照:メタプログラミングRuby

メタプログラミングRuby

メタプログラミングRuby

動的メソッドと動的ディスパッチ [ruby]

動的ディスパッチとは

動的メソッドとは

  • メソッドを動的に定義すること。
  • 具体的には、define_methodを使う。

上記2つを活用したリファクタリング

 #元のコード。data_sourceにある機器情報を取得し、出力するクラス
class Computer
  def intialize(computer_id, data_source)
    @id = computer_id
    @data_source = data_source
  end

  def mosce
    info = data_source.get_mouse_info(@id)
    price = data_source.get_mouse_price(@id)
    result = "Mouse : #{info}, #{price}"
  end

  def display
    info = data_source.get_display_info(@id)
    price = data_source.get_mouse_price(@id)
    result = "Display : #{info}, #{price}"
  end

  #以下同様のコードが続く
end

#リファクタリング
class Computer
  def intialize(computer_id, data_source)
    @id = computer_id
    @data_source = data_source
   
    @data_source.methods.grep(/^get_(.+)_info$/){|item| Computer.define_component(item)}
  end

  def self.define_component(name)
    define_method(name) do #動的メソッド
      info = data_source.__send__("get_#{name}_info", @id) #動的ディスパッチ
      price = data_source.__send__("get_#{name}_price", @id)
      result = "#{name.capitalize} : #{info}, #{price}"
    end
  end
end

参照:メタプログラミングRuby

メタプログラミングRuby

メタプログラミングRuby

インターネットにより、情報が偏り、人々が分断される危険性について

グーグルの検索結果は人によって変わる Yes or No

 

という問いに対して、即答できる人は少ないと思います。

 

情報にアクセスできる幅が広がり、より多くのことを考える自由度が増した、インターネットのおかげで。。

と一般的に考えられることが多いが、そうでないのではないかもしれないという話。

 

 

冒頭の答えとその背景

まず、冒頭の答えはYesです。

グーグル、Facebookなどの企業は、個々人を特定し、できる限りその人に興味に合ったものを表示しようとする。

 

しかし、これらは企業側の利益に見合っているから、そうしているというだけです。

グーグルやFacebookは広告によってお金を稼いでいます。

ユーザーの興味を知り、ユーザーが知りたいと思うものを沢山表示させることができれば、ユーザーはその企業のサイトを頻繁に利用するようになります。

そして、ユーザーの興味を知っている企業は、それに合わせて広告を表示できる。

 

自分が知りたいことを知れる、興味のあるものの広告が出てくる。

非常に便利でメリットが見えやすい一方で、このパーソナライズ化(個々人を特定し、最適なものを表示すること)のデメリットは見えてきにくいです。

 

少なくなる未知との出会い

人は全く未知のものに出会うことで、好奇心が刺激され、成長する。

また、多くのイノベーションは一般的に、全く異なる分野同士を掛け合わせることで生まれる。

パーソナライズ化が進むということは、自分が知りたいと思うことだけを表示する、つまり、未知との出会いが薄れるということになる。

更に怖いことが、パーソナライズ化は、個々人が知らないところで行われるため、自分に未知のものがあるということに気付くことはできない。

例えば、セパタクローというスポーツを知らない人は、セパタクローに興味を持つことはできない。

 

一方で、例えば新聞だった場合、(もちろん新聞にも多くのバイアスはかかっているが)新聞を開くことで、自分に興味のない様々なニュースがあるということには気付ける。

 

インターネットのみに頼った情報収集を行うことで、無知の無知、知らないということを知らないという状況に陥りやすくなるかと思います。

 

強化される志向性

フィルタリングされた情報は、人の志向性を強化する。

例えば、保守政党が好きな人には、保守政党を賛美するような記事ばかりが表示されるようになり、更に保守政党が好きになる。

保守政党がより好きになると、以前にも増して、更に保守政党を賛美する記事が表示される。

こうして、フィルタリングによって、自分の志向性が強化されていってしまう。

 

危うくなる民主主義

インターネットの世界がパーソナライズ化によって細分化されてしまうと、この民主主義の土台が危うくなる。

保守政党を支持する人には、保守政党の記事が流れ、革新政党を支持する人には革新政党の記事が流れる。

こういったことが起きると、共通の議論の土台がなくなってしまう。

また、保守政党の議員も、わざわざ革新政党の人に意見を伝えようとしても、批判されるだけで、効率が悪いので、意見を伝えるのは、保守政党を支持する人、もしくは中立の人になる。(そのようにセグメントをわけてPRすることも可能になる。)

 

更に怖いのが、グーグルやFBがフィルターを調整できる権限を持っていることだ。

フィルタリングで、人の志向性を強化することが可能だと書いたが、変化させることも可能だ。

(例えば、あなたが新卒の保守派の人間だとして、入った会社の人が全員革新派の人だった場合、徐々に革新派の考えに染まっていく可能性は非常に高い)

 

問題は何か

今あげたようなことは、必ずしもインターネットの世界だけにとどまるものではない。

例えば、テレビ、新聞にもバイアスはかかっており、世論を形成するのに非常に大きな力を発揮する。

しかし、テレビや新聞には、報道倫理などがあり、あまり無茶なバイアスをかけると大きな批判にあう。

一方で、インターネット企業のフィルタリングは、非常に気付かれにくく、そのような批判がおきにくい。

また、SNS(Facebookなど)は特にそうだが、皆が使っているということが大きな力になるため、一つの企業に力が集中してしまうことが多いため、そのような企業が暴走した時、手が付けくい。

そして、インターネットのフィルタリングは○○新聞を読んでいる人という分け方をするのではなく、個人個人を分断できます。

 

個々人で何をすべきか

まず、このようなフィルタリングのある世界で過ごしているということに自覚的になることは大切です。

そして、意図的に自分と関係のない世界の情報を取りにいく姿勢、情報の収集をインターネットばかりに頼らず、自分と異なる世界の人に話を聞くなどの姿勢が大切になるかと思います。

 

 

「閉じこもるインターネット」という本を参考に書きました。

 

 

閉じこもるインターネット――グーグル・パーソナライズ・民主主義

閉じこもるインターネット――グーグル・パーソナライズ・民主主義