エロと研究と日々の徒然

図書館総合展に行ってきた。

こんばんは、プルさわです。

本当は「日本のAVはなぜモザイクが必要なのか」という表現の自由と検閲に関する内容にしようと思ったのですが、書いてる途中で俺の趣味がばれそうになったので無難な内容に書きなおしてたらギリギリになってしまいました。*1

ということで、図書館総合展で出展しようかなと思ってる人の背中を押すような記事を書くことにしました。

この記事はklis Advent Calendar 2015 - Adventarの22日目です。

www.adventar.org

 このAdvent Calenderは知識情報・図書館学類(klis)という、とある大学の学類(いわゆる学科)に関係する記事を書こう、という趣旨のようです。

拙者も昔、在籍していたのでなんか書こうと思います。

ということで、記事スタートです。

 

忙しい人向け、この記事の内容

簡単にまとめると、

という感じです。

 

図書館総合展とは?

www.libraryfair.jp

図書館総合展は図書館の関係者・関係業者などが一同に集まるイベントです。
個人的には東京ゲームショウの図書館バージョンみたいなものと思ってます。

klisの学生は図書館LOVERが多いので、参加者が多いのです。

今回2回目の参加ですが、結構活気のあるイベントです。

  • 図書館大好き!
  • 図書館について学んでるけど、最近図書館への愛が薄れている
  • 図書館ちょと興味あります
  • 出版と図書館の関係に知りたい

といった方々におすすめでございます。

 

とりあえず図書館総合展に行ってみよう

図書館総合展参加による一番の収穫は図書館に関する人や技術、商品といった様々なものとの出会いだと思う訳ですが、これは何度行ってもそう思います。

始めて図書館総合展に行ったときは「図書館業界がこんなに活気あるとは何事だ!」と思いました。びっくりしました。

図書館の活気をかなり感じることができる空間となっています。

 

とにかく、図書館業界で働いていこうかなと考えている人は一度見学に行くと良いでしょう。

さらに関連企業による出展ブースもたくさんあるので、図書館(情報)学を学ぶ学生にとっては隠れ就職活動の場として有効活用できます。

 

出展せよ、さすれば与えられん

はい。この記事のメインテーマです。

図書館総合展には企業の出典ブース以外にも研究やその他の活動などを発表することができるポスター発表ブースがあります。

このブース、出展料が比較的低価格と貧乏人にも優しい設定になっています。

ということで、ちょっと手をつけている自由研究があったので、その内容に関して自費でポスター発表をしてきました。*2

内容についてはまたの機会にでも。

 

発表したら色々といいことがあったので、その話でもしようかと思います。

 

色々な人と会える

いくつか驚いたことはあったのですが、ひとつは参加者層の厚さです。

お話した人には

  • ばりばりのエンジニア
  • 出版の営業マン
  • 大手メーカーのエライ人
  • 図書館員(司書さん)
  • 研究者
  • 大学生
  • 高校生

といった方がいらっしゃいました。名刺もいっぱい交換できます。

図書館に関係する色々に人に会えるというのがいいところでありますね。

出展側としては予想以上にフィードバックが多くて大変勉強になりました。

現場の声を聞きながら、専門家の声も聞きながら、女子高生の声も聞けます。

 

発表はモチベーションのアップにつながる

これは図書館総合展に限った話ではないですが、何かしらのプロジェクトを抱えている人は定期的に発表しましょう。

ここのポスター発表は事前審査がないので、結構ショボクテも文句言われません、たぶん。いや、クオリティーを高めましょう。

ということで、とりあえず発表してみて、周りの反応を見るのもいいかと思います。

 

自分の場合は、私の研究内容に興味を持ってくれている人が以外と多かったのが嬉しかったです。

  • 「君と話せるのを楽しみにしていた。」⇒事前にホームページでチェックしていたらしい
  • 現場の人「このシステム、ぜひ実現させてくれ。」
  • 研究者「かくかくしかじかしたら良い精度出ると思うよ。」
  • 現場の人「ここは図書館の利用者も困るからね~。」
  • 会社の人「うちの会社で働かない?

 

 

などなど。

配布資料についても、なんかめっちゃ余ったら悲しいから、そんなに多く刷って行かなかったのですが完売してやる気がアップしました。

まとめ

ということで、図書館総合展は面白いので参加してみることをおすすめします。

来年も参加する予定なので、図書館総合展で会いましょう!

*1:最近は着エロと百合が好きです。

*2:稼いだお金は研究資金に突っ込みましょう

淫夢語でプログラミング

こんにちは。プルさわです。

最近私の周りに淫夢好きなよく分からない人が目に着くようになりました。たまげたなあ。
私は正直淫夢のことは良くわからないのですが、最近ハマってる変なプログラミング言語シリーズと絡めてなんかしてみようということで、今回新しいプログラミング言語を作ってみました。

ということで、できたのがIceTea(アイスティー)という言語です。

Rubyで作りました。

命令とか使い方とか

とは言っても内容はBrainf_ckに毛が生えた程度のものなので、とりあえず知らない人は↓の記事でも読んでいただけると良いかと思います。

Brainfuck - Wikipedia

以下のように使ってください。

命令文字列 機能
n回だよ、n回あくしろよ ポインタの指す値をn増やす
n回だよ、n回お手だよ ポインタの指す値をn減らす
なんか足んねえよなぁもうn回鳴いてみろ ポインタをn進める
この野郎もうn回鳴いてみろ ポインタをn戻す
こ↑こ↓ ポインタの指す値をUTF-8のコードとみなして出力する
(小学生並みの感想) 1文字入力を読み込んで、ポインタの指す値に設定します
ハイ、よーいスタート ポインタの指す値が0以外なら何もせず、0ならループを終了して次へ進む。
2人は幸せなキスをして終了 ループの終了を意味します。この位置まで来ると、対応するループの先頭へ戻ります

Hello, World!

サンプルプログラムです。
以下のプログラムを実行すると「Hello, World!」が出力されます。

9回だよ、9回あくしろよ

ハイ、よーいスタート
  なんか足んねえよなぁもう1回鳴いてみろ
  8回だよ、8回あくしろよ
  なんか足んねえよなぁもう1回鳴いてみろ
  11回だよ、11回あくしろよ
  なんか足んねえよなぁもう1回鳴いてみろ
  5回だよ、5回あくしろよ
  この野郎もう3回鳴いてみろ
  1回だよ、1回お手だよ
2人は幸せなキスをして終了

なんか足んねえよなぁもう1回鳴いてみろ こ↑こ↓
なんか足んねえよなぁもう1回鳴いてみろ
2回だよ、2回あくしろよ こ↑こ↓
7回だよ、7回あくしろよ こ↑こ↓ こ↑こ↓
3回だよ、3回あくしろよ こ↑こ↓
なんか足んねえよなぁもう1回鳴いてみろ
1回だよ、1回お手だよ こ↑こ↓
12回だよ、12回お手だよ こ↑こ↓
この野郎もう1回鳴いてみろ
8回だよ、8回あくしろよ こ↑こ↓
8回だよ、8回お手だよ こ↑こ↓
3回だよ、3回あくしろよ こ↑こ↓
6回だよ、6回お手だよ こ↑こ↓
8回だよ、8回お手だよ こ↑こ↓
なんか足んねえよなぁもう1回鳴いてみろ
1回だよ、1回あくしろよ こ↑こ↓

その他実装とかの細かい話

  • ポインタの移動とポインタの指す値の増減を数値でできるようにしました
  • 日本語を使っているのでもちろんUTF-8です
  • 数値部分は全角でも半角でもオッケイです
  • メモリの増減・ポインタの移動に関する数値は正規表現で抜き出してます
  • ポインタ系の命令では、2回数値を記述しますが同じだろうが違おうが始めにでてきた方の数値を使うようにしています
  • Regexp#unionなんていう便利なメソッドがあったので、それを使って命令をまとめました

参考資料(偉大な先人達)

以下の本はBrainf_ckの実装で大変お世話になりました。
それから、Rubyで言語実装系を作る際にとても勉強になります。


以下のサイトはBrainf_ckを元に変な言語を作った人たちです。

brainf*ckでジョジョ言語 - toyoshiの日記

おっぱい言語

masarakki/nyaruko_lang · GitHub



ソースコード

class Icetea
  # エラークラスを継承する
  class ProgramError < StandardError; end
  
  ORDERS = [
    /\d+回だよ、\d+回あくしろよ/,
    /\d+回だよ、\d+回お手だよ/,
    /なんか足んねえよなぁもう\d+回鳴いてみろ/,
    /この野郎もう\d+回鳴いてみろ/,
    /こ↑こ↓/,
    /\(小学生並みの感想\)/,
    /ハイ、よーいスタート/,
    /2人は幸せなキスをして終了/
  ]

  def initialize(src)
    # トークンを入れる配列
    @tokens = src.scan(Regexp.union(ORDERS))
    @jumps = analyze_jumps(@tokens)
  end

  # 実行
  def run
    # テープを表した配列
    tape = Array.new()

    # 何番目の命令を実行しているか
    pc = 0
    
    # ポインタが現在どこを指しているか
    cur = 0
    
    while pc < @tokens.size

      case @tokens[pc]
      when /(\d+)回だよ、\d+回あくしろよ/
        tape[cur] = tape[cur].to_i + $1.to_i
      when /(\d+)回だよ、\d+回お手だよ/
        tape[cur] = tape[cur].to_i - $1.to_i
      when /なんか足んねえよなぁもう(\d+)回鳴いてみろ/
        cur += $1.to_i
      when /この野郎もう(\d+)回鳴いてみろ/
        cur -= $1.to_i
        raise ProgramError, "You can't move lefft from start point" if cur < 0
      when /ハイ、よーいスタート/
        pc = @jumps[pc] if tape[cur].to_i == 0
      when /2人は幸せなキスをして終了/
        pc = @jumps[pc] if tape[cur].to_i != 0
      when /こ↑こ↓/
        n = tape[cur].to_i
        print n.chr
      when /\(小学生並みの感想\)/
        tape[cur] = $stdin.getc.ord
      end
      pc += 1
    end
  end

  private
  # ジャンプ命令を解析する
  def analyze_jumps(tokens)
    jumps = {}
    starts =[]
    startword = "ハイ、よーいスタート"
    endword = "2人は幸せなキスをして終了"

    tokens.each_with_index do |e, i|
      if e == startword
        starts << i
      elsif e == endword
        raise ProgramError, "total number of #{startword} is more than #{endword}" if starts.empty?
        from = starts.pop
        to = i
        jumps[from] = to
        jumps[to] = from
      end
    end
    raise ProgramError, "total number of #{endword} is more than #{startword}" unless starts.empty?
    return jumps
  end
end

begin 
  Icetea.new(ARGF.read).run
rescue Icetea::ProgramError => e
  puts e.message
end


エンジョイ!プログラミングライフ!

プログラミングについて何も知らない人間がIT企業の学生インターンに参加できるようになるまで

こんにちは。

内容はタイトルの通りですが、とりあえずこの記事の目的としては以下のことを目指しています。

目的:この記事を読んだ人が独学でプログラミング技術を身に着けて思い描いたものを作れるようになる

 

「今からプログラミングの勉強を始めたいけど、何からやってどこに向かえばいいのか分からない!」

という人の助けになるようなものができれば幸いです。

 

始めになぜこんな記事を書こうかと思ったかを書いているので、そんなもの興味ないという人は適せん飛ばしていただければ良いかなと思います。

(書き終わってから気づいたのですが結構本の紹介が多いです。)

この記事の構成は以下の感じです。

  1. 出会い:プログラミングになれる
  2. 1年目:プログラミングにモヤモヤする
  3. 2年目:数学を学ぶ
  4. 3年目:バイリンガルトリリンガルプログラマー
  5. 4年目:プログラミングで色々できる

つまりプログラミング初めて4年くらいでちょいちょいお金もらえるくらいプログラミング書けるようになるよってことです。

しかし実際は4年もかかりません。

自分は学生生活で遊びまくっていたので、上記の1年は1か月くらいで学べる内容だと思います。

つまり、

 出会い→1か月目→2か月目→3か月目→4か月目

と読み替えていただければ良いかと思います。

試行錯誤しながらウネウネしたので4年もかかってしまった訳で、ヤル気あれば1~4か月くらいで下記の内容をさらうことができると思います。

 

以下の説明では様々な本が登場しますが、「これを読め」という訳ではなく私はこれを読んだというだけで、Webの情報でも良いですし、図書館で似た本を借りて読むとかも良いと思います。その辺は柔軟に。

 

なぜこんな記事を書いたか

先日、某IT企業のインターンに参加してきました。

インターンの内容はお口チャックされてしまったのですが、とても良い経験ができたので、この経験について何か記事を書きたいなと思っていたところ以下のような記事を見つけました。

ちらちら見ていたのですが、どのキャンプも料金結構高いなぁと思いました。
もちろん人に教えてもらうことによって身に着く良いことはたくさんありますが、独学で学ぶことによって身に着く良いこともたくさんあります。

ということで、今までのプログラミング人生を振り返りつつ、他の人の役に立つ記事でも書こうと思い立ってみました。

 

以下本編。

 

プログラミングについて何も知らない人間が
IT企業の
学生インターンに参加できるようになるまで

 

出会い:プログラミングなんてできるのはスーパーハッカーだけでしょ?

冗談抜きでこう思っていました。

私のプログラミングとの初めての出会いは大学の授業でした。(いきなり授業の話かよという感じですが。*1
当時は「プログラミングなんか絶対できんから、予習とかしないと絶対に卒業できなくなる」という恐怖心から、与えられた参考書を事前に読み進めていました。 

ということで、以下の本が人生で初めて出会ったプログラミング技術書です。

 

たのしいRuby 第4版
 

 

私のプログラミング人生はここから(=『たのしいRuby』)始まったと言っても過言ではありません。

そして、この本の内容を全て理解したときに初心者脱出と言っても過言ではないかと思います。

授業で「なんでRubyからやるんだ?」とか愚痴ってた学生もいましたが、今になって思うとRubyから始めたのが非常に良かったのだと思います

 

プログラミング最初の一歩は、こうした本を手元に置いてパソコンで実行しながら「あ、なんか動くな。」という感覚をつかむところから始まります。

最初は、やってることの意味とか仕組みとか全然分からず、魔術的な言葉がたくさん出てきて頭沸騰しながら読むことになると思います。

 

こうしてなんとか最初の数ページを読み、それをパソコンで実行できたとき、プログラマが一番初めに習得するであろう技術を取得できます。

それはパソコン画面に自分の好きな言葉を表示させるという技術です。*2

こうして、スーパーハッカーへと続いていく(?)階段の一段目に立つことができます。*3

 

この本で学ぶべきこと(=プログラミングの最初の基礎)は

  1. 変数とは何か
  2. 文字列と数値の違い
  3. 配列とハッシュ
  4. メソッドとは何か
  5. 各種演算(真偽の計算はとっつきにくいけど重要)
  6. 条件判断(if文とか)
  7. 繰り返し(while文とか)
  8. テキストデータの読み込み方法

の8つくらいかなと思います。
というか正直、当時はここまでしか分かりませんでした。

そんな訳で、基本中の基本を学んだところで次のステップに移ります。

 

1年目:プログラミングは何か気持ち悪い/Webって何?

考え出すとモヤモヤするプログラミング

プログラミングを学び始めると気持ち悪いと思うことが多いのです。

初心者の場合、とりあえず動くけど何がどうなっているのかさっぱり分からないことがキモいポイントかと思います。

私の場合、原因は「パソコンについて実は意外と知らないこと」にありました。

プログラミングをはじめたい、もしくは始める人というのは意外と「自分は普通の人よりパソコンに詳しい」という思い込みがある場合が多いのではないかと思います。

実はプログラミングを始めるほどにはパソコンに詳しくないという場合が多いのではないでしょうか。

そこで、そのプログラミングに対するモヤモヤした気持ち悪さをじゃっかん解消してくれるのが以下の1冊です。

コンピュータはなぜ動くのか?知っておきたいハードウエア&ソフトウエアの基礎知識?

コンピュータはなぜ動くのか?知っておきたいハードウエア&ソフトウエアの基礎知識?

 

これを一通り読み込むとプログラミングの基礎となるパソコンがどんなものかということがざっくり分かります。

これを踏まえた上で、たのしいRubyの内容を読み返すと結構分かってきます。

クラスって何だよ!

そんでもって、たのしいRubyで幾度となく登場するアヤシイ単語「クラス」。
この「クラス」を理解するためには様々なプログラミング言語で登場する「オブジェクト指向」という結構重要な概念を理解しなくてはならないのですが、これがまったくもって分からかったのでした。

そんなときに、以下の本で雰囲気をつかむことができました。

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

 

 一通り読むと「クラスという単語の意味」に加えて周辺のありがたい知識も身についてしまいます。

こうして、モヤモヤを解消しながらRubyという言語を知りどんどん仲良くなっていくのです。

 

個人でWebページを作れる!(脇道だけど後々重要) 

プログラミングについてちょっとできるようになると、レンタルサーバーなどを借りて自身のWebページなんかを作ってみたくなるわけです。*4

そのときに学ばなくてはならないのがHTMLとCSSです。

基礎は以下の本で学びました。

HTMLとCSSで基礎から学ぶWebデザイン

HTMLとCSSで基礎から学ぶWebデザイン

 

 実際にホームページを作って公開してみると色々と勉強になります。

 

また、ついでにインターネットの仕組みも学びたいと思い以下の本を読みながらフムフム言ってました。

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

 

 

2年目:プログラミングって数学!?

さて、ここまでで『たのしいRuby』の内容を一通り理解できるようになってRuby結構使えるけど?」という状態になります。 

Rubyについてもっと学びたいという人は『パーフェクトRuby』なんかを読むのがいいと思います。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

 

 

英語がOKなら以下の本が超良いです。

Eloquent Ruby (Addison-Wesley Professional Ruby Series)

Eloquent Ruby (Addison-Wesley Professional Ruby Series)

 

 

上記の本を読まなくてもここまで来ると結構自信が付きます。

そして、「Ruby結構できるで?」状態のときに出会ったのが『数学ガール 乱択アルゴリズム』です。

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

 

この本を読むとプログラミングの奥深い世界がチラっと垣間見えます。

この本を読むことで、アルゴリズム(=ひとまず「プログラムの内容を普段使う言葉で表したもの」としていただければ良いかと思います。)という言葉・概念と出会います。
数学ガール』で実際に出てくるアルゴリズムRubyで再現してみたりするととても実力が付きます。

そして、このアルゴリズムって何なのかを知ることによって、プログラムと数学との関連性が見えてきます。

アルゴリズムに関する数学の知識は、プログラミングで高度な処理を行いたいと思った場合に必須の知識になります。

ここらへんで少し実際のプログラムから離れて、

など机上の勉強を挟むと良いかと思います。

この辺の勉強に関する本は挙げるときりがないので、上記の単語でググったりしながら勉強していただければと思います。

以下のサイトなどが参考になると思います。

どこまで学べば良いかと言うと、「自分が完全にギブアップするまで」です。*5

数学の世界は結構難しいので、ある程度学んだらまたプログラミングの世界に戻って来ましょう。

 

3年目:他のプログラミング言語は方言みたいなもの

Rubyの知識を深める

数学を学んで(学びながらでも)さらにRubyの扱いに慣れていくことになります。

私はここらへんで、データベースとかも学んでおりました。
データベースの知識はプログラミングにとって必須だと思いますので、どこかで学びましょう。今です。

おすすめは『マンガでわかるデータベース』で一通り概要を把握して、『作りながら学ぶRuby入門』に沿ってRubyで実際に作ってみるということです。

マンガでわかるデータベース

マンガでわかるデータベース

 

 

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版

 

 

ここまでくるとプログラミングを用いてそれなりに立派な何かを作る力が付いています。

そうすると実際に何かを作ってみるのが良いと思います。

プログラミングで何か作る

実際の処理に対して、プログラミング言語には「向き・不向き・できない」があります。

ここで3つくらいの道に分かれることになります。

どれかの道に進んだ後で、別の道を行くというのも可能ですし、そのまま別の道をずっと行くこともあるのかなと思います。

 

1つはデスクトップアプリケーションの道です。

Rubyはデスクトップアプリケーションを作るのに不向きだと思います。(できなくはないです)
Windowsであれば、確実にC#を学ぶことになります。Macのことはしりません。*6

自分は以下の2冊で勉強しました。

やさしいC# (やさしいシリーズ)

やさしいC# (やさしいシリーズ)

 

 

改訂3版 パーフェクトC# (PERFECT SERIES 1)

改訂3版 パーフェクトC# (PERFECT SERIES 1)

 

 

 

2つめはWebアプリケーションの道です。

いわゆるCGI(≒サーバーでプログラムを動かす仕組み)を学んでいくことになります。
以下のWebサイトで学ぶのがとても良いかと思います。

Rubyist Magazine - Ruby ビギナーのための CGI 入門 【第 1 回】 初めての CGI プログラム

ここで、レンタルサーバーなどを借りて、実際に公開してみるととても勉強になります。
はじめは、ロリポップ や さくらのレンタルサーバー なんかがおすすめです。

 

そして、様々な言語でCGIのアプリケーションを作ってみましょう。3つの言語くらいに触れましょう。

おすすめはPHPPython(、Perl)です。

ここまで来ると、入門書とかは逆にうっとうしく感じるようになっているかと思います。
あとここまで来ると、他の言語についてはWebで検索しながらプログラミングできるようになっていると思いますので、本に頼ることもあまりなくなってくるかと思います。

PHP+MySQLマスターブック

PHP+MySQLマスターブック

 

 

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

 

 

 

3つめはスマホアプリケーションの道です。

これは割愛。とりあえず気になる人は「android アプリ 開発 入門」とかで検索すれば良いと思います。*7

 

 

こうして他の言語に触れると、「あれ?Rubyで使ってた知識って結構使えね?」という状態になります。

これがポイントです。

様々なプログラミング言語間には、「英語と日本語」ほどの壁はなく、「東京弁と関西弁」くらいの差があるんだということが実感できればかなりレベルアップします。

つまり、用途に合わせて強い武器を選ぶことができるようになるのです。*8

 

アルゴリズムについて

ここまで来ると前のところで出てきたアルゴリズムが効力を発揮します。

このレベルになると同じことをするのに様々な言語を使うことができるということが分かり、アルゴリズムを元に使用するプログラミング言語を選択することができるようになります。

そうすると、「こんなことをしたい!」という抽象的な処理を実際のプログラムに落とし込むことができるようになってくるのです。

私は、ここまで来るのが長かった…。

 

4年目:自分は何をやりたいのか

さて、このレベルになると、プログラミングで何か作るという点ではだいたいのことができるようになっています。

なので、何をしたいか、何を作りたいか、ということをはっきりさせるのが重要なのではないかなと思います。

ここからは自分が経験した分野でどんなものがあるのかというのを少し紹介する形にしたいと思います。

こうした分野に目を向けて、それらの技術を組み合わせることで素敵なアプリケーションが開発できると思います。(え?俺が何か作ったかって?え?><)

データマイニング

大量のデータから何か有意義なことを発見しようという分野。

最近ビッグデータとかで流行ってますね。Python使えればだいたいのことはできます。

が、R(という言語)も学んでおきたいところ。

自然言語処理

めちゃくちゃ面白い分野です。
機械に言葉を理解させようという世界感です。

簡単な例だと、迷惑メールの振り分けとか しゃべってコンシェル とかです。

以下の本がおすすめ。

自然言語処理の基礎

自然言語処理の基礎

 

 

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

 

 

画像処理・認識

人間のように機械に画像を理解させようという感じです。

これまためちゃくちゃ面白い。

紙の文書を読み込んで、PCで扱えるテキストに変換したり、画像中の細胞の数を自動で数えたりできます。
あとは、画像にA君が映ってますとかを自動で判定できるようになります。

デジタル画像処理 (Rで学ぶデータサイエンス 11)

デジタル画像処理 (Rで学ぶデータサイエンス 11)

 

 

情報検索

早い話がgoogleみたいなサイトを作ろうというものです。
ユーザがデータにアクセスするのを支援したりします。

レコメンド

Amazonのこの本を買っている人はこんな本も買っていますというアレです。

最短経路問題

これまたものすごく奥が深い。

電車とかの乗り換えシステムに使われています。

以下の本はマジで面白いです。

巡回セールスマン問題への招待 (シリーズ「現代人の数理」)

巡回セールスマン問題への招待 (シリーズ「現代人の数理」)

 

 

その他

たくさんありますが、サーバー関連やマイコンなどのハードウェア関連も学ぶと良いでしょう。今回の記事ではあまり触れていません。

マイコンなど扱うことによって得られる、プログラミングの世界が実世界に影響を与えるという体験はとてもエキサイティングです。

CentOSなどを扱ってみると、OSの世界も広がって楽しいです。

 

まとめ(最後に)

以下の通りに学びました。これからプログラミングを始めたい人は参考にしていただくと良いかもしれません。

  1. Rubyやる(別の言語でも良いと思います。)
  2. パソコンについて知る
  3. インターネットについて知る
  4. Rubyを一通りできるようになる(こちらも同様)
  5. アルゴリズムを学ぶ(周辺の数学も学ぶ)
  6. 他のプログラミング言語に手を出す
  7. 自分が何を作りたいかを考える

まあ、実際の私のプログラミング学習はもっとウネウネ曲がりくねったものなのですが、ちょこっと整理して紹介してみました。

 

では、最後にハッカー魂に火を付ける最高の2冊を紹介して終わりにしたいと思います。

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

 

 

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

 

 

 

補足

ホントはRとかMathematicaMATLABなんかについても書きたかったのですが、思いのほか記事が長くなってしまったのでデータ解析系の言語はまたの機会に…。

また、C言語Javaなど他の言語については記事で触れていないですが、機会があれば学んだ方がいいと思います。

個人的にはLispが変な感じで面白かったです。(詳しくはないけれど。)

*1:大学の専攻は情報科学ではないので、プログラミングに関しての専門教育は受けていません。

*2:Hello World!

*3:たぶん著名なスーパーハッカー達もここから始めたと思います!想像ですが!笑

*4:お金がない人は FC2ホームページ - 無料ホームページスペース とか無料でできておすすめです。

*5:客観的な目標としては、『パターン認識機械学習』という本がギリギリ読めるくらいかなと思います。

*6:宗教上の理由です。

*7:iOSについては宗教上の()

*8:だいぶ毛色の違う宣言型の言語も学ぶと良いかもしれません。これについてはググってください。

即答ツール

人工知能学会誌(29巻6号)のSFショートショートに掲載された「即答ツール」というお話が面白かったです。

 

〜ストーリー紹介〜

舞台はちょっとだけ未来。
優柔不断な主人公が、彼女のミユキに「ソクツー(即答ツール)入れてよね!」と怒られるところからストーリは始まります。
このソクツーは受信したメール等の連絡に対して、精神状態のモニタリング結果から最も適切な返事を自動で即答してくれるというツールです。

そして、彼女に言われるがまま家電量販店で最新のソクツー対応スマホを購入した主人公は・・・

〜ストーリー紹介おわり〜

 

実際あったら便利ですね。
自分自身、連絡返すのがめんどうになってしまいついつい遅くなってしまうのですが、このツールがあればすべて自動でやってくれそうです。

 

最近は、より速いレスポンスが求められるようになってきています。
LINEなどが広まって、メールとチャットの境界線も曖昧になってきています。
そんなことから「メール、早く返事してよね!」などと言われることも多くなってきました。

 

そういった
「早く返事をくれ」
「めどくさいけど、早く返事しなきゃ。」
などの欲求を突き詰めていくと、この”即答ツール”になるのかもしれません。

 

マイクロマシンの研究が進んだら、NTTとかで作ってくれないかなぁ・・・。

巡回ディズニー問題

こんばんは。昼のプルさわです。
みなさんディズニーは好きですか?
私は大好きです。

この前友人とディズニーランドの話をしていたところ
「行きたいアトラクション最短で回るコース、パッと出してくれる何か作ってよ~。」
と言われたので、ちょっと取り組んでみました。

ということで、

目的のアトラクションを最短距離で回る問題

を考えてみたいと思います。

巡回セールスマン問題

 さて、このディスニーランド最短距離で回りたい問題は、有名な「巡回セールスマン問題」として考えることができます。
「え、巡回セールスマン問題って何?」
という感じですね。
ググればすぐに分かりますが、簡単に言うと以下のような問題です。

地図上にある指定のポイントを最短距離で回るためにはどのように回れば良いか?

この問題は非常に奥が深く、多くの研究者が取り組んできた問題です。
そのため解法などが充実しているのですが、今回は無視してすべての経路を求める力技を使おうと思います。*1

距離データを集める

さて、問題を解くためにはアトラクション間の距離を集めたデータが必要です。
どっかに落ちてないかな~と思って調べたのですが、ちょろっと検索しただけでは見つからなかったので作りました。
本来なら道を歩いて距離を計測するべきなんですが、面倒だったので地図上の直線距離で近似しました。

SK ロードカウンタ RM-3MW

SK ロードカウンタ RM-3MW

 

 さて、アトラクションですがこちらも本来ならすべてのアトラクションに関するデータを収集する必要があるのですが、めんどくさいので人気アトラクション(ファストパスを発行しているアトラクション)のみに絞ってデータを取ってきました。

以下が、アトラクション間の距離を集めたデータです。

f:id:oscillograph:20141016211556p:plain

最も離れているのは「スプラッシュ・マウンテン」と「スターツアーズ」です。
逆に最も近いのはスプラッシュ・マウンテン」と「ホーンテッドマンション」です。

これはディズニー好きなら納得の結果になっています。

ちなみにアトラクション間で平均の距離は326mですので、単純に考えると8つのアトラクションをすべて回ると

326×7=2282m=2.2km

となり結構な距離を歩くことになります。

最短経路を見つける

今回は高々8地点なので、高度なアルゴリズムを使わずともすべての経路をリストアップして距離を計算し、距離が短い順に並べることで解を求めようと思います。

さて、どのような道順があるかを考えます。
どのような道順をたどるかという問題は「組み合わせ」として捉えることができます。

なので8地点を回る道順は

8!=8×7×6×5×4×3×2×1=40320(通り)*2

あることになります。かなり様々な種類の道順がありますね。

というわけで計算してみました。*3

結果

 計算の結果

  1. ビッグサンダー・マウンテン
  2. スプラッシュ・マウンテン
  3. ホーンテッドマンション
  4. プーさんのハニーハント
  5. スペース・マウンテン
  6. スターツアーズ
  7. モンスターズ・インク
  8. バズ・ライトイヤー

 の順で回ると総距離が1056mとなり、最短となることが分かりました。

先ほどの平均的な距離が2.2kmだったことを考えると、計算することによって総距離が半分以下になりました。

この結果はちょっと参考になるかもしれません。ちょっと。

f:id:oscillograph:20141016233000p:plain

 

(あるか分からない)今後の展開

今回はいくつか問題点が残っていて、主に3つあります。

  • 地図上の直線距離は実際の歩く距離でないこと
  • 待ち時間が考慮されていないこと
  • アトラクション数が絞られていること

これらを解決できればそれなりに役立つ何かができるかもしれません。

 おまけ

ちなみに、ディズニーランドの全アトラクション数は公式的に67あるそうです。
67個のアトラクションを考えたときの全組み合わせは94ケタ(!)の数です。

3600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 通り

(ちなみに64ケタが不可思議、68ケタが無量大数

こうなってくると全ルートを求めるのはとても大変です。
なので、前述の巡回セールスマン問題で考えられた様々なアルゴリズムが有効になってくるのです。
それらのアルゴリズムを駆使すれば、すべてのルートを調べなくても良かったりします。

数学者様々ですね!


おまけ その2(参考文献)

 

追記(2014/10/18)

後から気づいたんですが、スタート地点に戻ってきてないので、正確には巡回じゃないっすね…。

ということで、タイトルに偽りありでした。すみません。

*1:「じゃあ、なんで巡回セールスマン問題を出したんだ?」という感じですが、とりあえずこんなものがあるんですよ~という話題までに出してみました。

*2:正確にはどこからスタートしても良いことと、行き帰りの距離が同じことから 「7! / 2 」となりますが、簡単のため「 8!」としました。

*3:Ruby大好きなのでRubyで実装

線形代数と美女画像

こんにちは。昼のoscillographです。
このところ画像認識を勉強しているのですが、とても楽しいのでどんなことやっているのか紹介したいと思います。

最近線形代数の勉強を始めたけれどモチベーションが上がらない人とかおすすめです。
自分はそこまで数学とかできないのですが、ぜひ数学できるとこんな楽しいことができる!というのは知ってほしいです。
ベクトルの基礎と画像認識の橋渡しをしてから、美女空間の設計とその応用について考えていきます。

 

画像はベクトルだ…!

画像認識の分野では画像をベクトルとして扱うのが一般的です。
画像はピクセルの集まりなのでそのピクセルに入っている数値を並べてひとまとめにしてしまえば、ベクトルとして扱えます。
ベクトルとして抽象化された画像は、線形代数で用いる様々な演算を適用することができます。

f:id:oscillograph:20140605170551j:plain

 

ベクトルの平均

画像認識(データ分析)的には、ベクトルの平均をとるというのはそのデータ群の代表的な特徴を表現するということになります。
例えば、私の好きな女優(※後述)の画像を100枚集めて平均を取ると以下のような感じになります。

f:id:oscillograph:20140710120426p:plain

 

ベクトルの射影

3次元空間のある平面を考えてみます。
このときある平面に1本のベクトルを射影するということは、その平面の成分を抽出(もしくは平面の成分を除去)するということです。

詳しく説明すると、以下のようになります。

f:id:oscillograph:20140710123324j:plain

このx,y,zで張られる空間が人の顔画像を表す空間として(3画素の画像を考えてみてください)
P:佐々木君の顔画像
A:日本人の顔が多く分布している空間(日本人顔画像空間)
などどしたとき、
P':佐々木君の日本人成分
| P'-P |:佐々木君の日本人じゃない度合
などと解釈できます。

この例では3次元で考えていますが、この考えは多次元に拡張することができます。
つまり、ある画像を○○な画像空間に射影することによって○○な成分を取り出すことができるというものです。

美女空間の設計

ということで、美女空間を設計してみましょう。
つまりどんなにヤバい顔画像を射影しても美人な画像ができる魔法のような画像空間です。
今回は主成分分析(PCA)という方法を使って、空間を設計してみようと思います。
いくつかの(正規)直交ベクトルによる部分空間による美女空間です。

 

さて、美女画像空間を作成するために美女画像を集めます。
今回は(私が好きな)
広末涼子能年玲奈新垣結衣麻生久美子道重さゆみ
の5名の画像を各20枚ずつ、計100枚ネット上から収集してきました。

それらの画像に対してOpenCVというライブラリを用いて顔領域を抽出し、PCAにかけて作成した空間が以下のようなものです。

f:id:oscillograph:20140710125550j:plain

これらの画像はまさしく直交しています。つまり画像同士の内積は0になります。
 

本当に美女になるのか

さてここで作成した美女空間に人の画像を射影してみます。

今回は、なかやまきんに君さんと山崎邦正(月亭方正)さんの画像を使わせていただきました。

f:id:oscillograph:20140710133516j:plain

なんか美人になっている!?

というか別人な気もします。

ということで画像を重ねて徐々に透過させていくと…

f:id:oscillograph:20140710133605j:plain

なるほど、似てるっちゃ似てます。
美人な人ほど、変化は少ない訳ですので、差が大きかったということでしょうか。

結論

まあ、美人空間は作れたといっていいのではないでしょうか。

とりあえず、数学やっとくとこんな楽しいことができるということを伝えたかったです。

画像系は楽しいですね!

 

部屋の汚さの単位

今日は天気がいいのに、部屋が汚いので
部屋の汚さを示す単位(MR)
を作りました。現実逃避です。

汚さというか、単位面積あたりの細菌数を表す単位はあるみたいで、ベンザという名前みたいです。(参考:汚さを表す新単位「ベンザ」: あんどコンサ

このMR(Messy Room度)を使えば、日ごろの会話の中で
A「今日お前ん家でミーティングしよう!」
となったときに
B「俺ん家今、6MRくらいよごれてるから…。」
A「俺の家は3MRくらいだから、我が家でやるか。」
といったように客観的部屋の汚れを示すことができます。

 

汚さの指標

汚さの指標として、精神的な苦痛から肉体的苦痛に上がるにつれて汚さが上昇するものと仮定します。
一番クリーンな状態を整理整頓されている状態とします。
ここでは

地震の震度を参考にしてどの程度人の精神または肉体を揺らすかといった観点から1~7の数値で表現したい

と思います。

 

MRの詳細

MRには以下の4つの観点があります。

  • 屋内の様子
  • 屋外の様子
  • 精神の状態
  • 肉体の状態

です。MRは以下の4つの状態の総合的評価によって数値化されます。

 
MR表

どんどん使いましょう。

f:id:oscillograph:20140427080422p:plain

 

参考画像

MR4

f:id:oscillograph:20000310233005j:plain

引用:http://f.hatena.ne.jp/h-moto/20000310233005

 

MR6弱

f:id:oscillograph:20140427081215j:plain

引用:http://kuroroku.seesaa.net/article/236255239.html

 

MR6強

f:id:oscillograph:20140427081439j:plain

引用:http://hamamuratakuo.blog61.fc2.com/blog-entry-267.html

 

終わりに

汚部屋を片付けます。