Ruby 画像ダウンロード編 (10) プログラム作成 【計算数学 I】

更新日時:

プログラムの作成

ここまでで、必要な知識は全てお伝えしました。ここから先はプログラムの作成に入ります。 しかし、注意点から先に述べたいと思います。

注意点

サーバから何かダウンロードするようなプログラムや、もっと進んで、定期的にサーバを巡回するプログラム(これをクローラーといいます)を作る際には注意するべき点があります。細かいことを言い出すといろいろあるのかもしれません。しかし私からは絶対守ってほしいことを1点だけ注意します。 それは 先方のサーバへの攻撃となるようなことをしない ということです。

私たちの目的は、333 個のアイコンを全部ダウンロードすることでした。ですから、ダウンロードは各ファイル1回ずつでよいはずです。 また、Twitter アイコンプレゼントという企画の趣旨を考慮すると、各ファイル1回のダウンロードは正当と理解されるでしょう。

もしも、プログラムを無限ループにするなどして、何度も何度もダウンロードした場合はどうなるでしょうか? これは、サーバに対する攻撃になります。何も言い訳ができないでしょう。 高頻度でリクエスト送り続け、サーバを落とした場合、偽計業務妨害として逮捕される可能性もあります。 この問題は実に身近なものです。岡崎図書館事件のような、専門家から違法性に強く疑問が挙がるようなケースも過去あります。 どこから先が違法で、どこまでは安全だとはなかなか言えません。攻撃の意図がないからよいという理屈は通用しないかもしれません。

ですから、先方への攻撃とならないように、細心の注意を払ってプログラムを書くべきです。 このプログラムを書く上でも工夫をしています。それが

  if # file に指定されたファイルが存在すればという条件式
    puts "#{name} はスキップされました。"
    next
  end

の 4 行です。この 4 行のおかげで、ファイルが既にある場合に、もう一度ダウンロードすることを防ぐことができます。 たとえば、プログラムが何らかの理由で途中で終了しても、ダウンロードしていないファイルだけをダウンロードできます。

また、今回はやりませんでしたが、クローラーを作る際は、次のページにアクセスする前にいくらかインターバルを設けることを考慮するとよいでしょう。 Ruby ですと、sleep(1.0) で 1.0 秒停止することができます。ダウンロードとダウンロードの間にこういうものを挟むと、先方への負担が軽くなります。

プログラム作成

Twitter アイコンプレゼント のページのソースコードを見ると、以下のことがわかります。

  • 333 個のアイコンのURLは http://sansyasanyou.com/core_sys/images/main/cont/special/ico/(数字).png の形になっている
  • 数字は、1 から 333 まで動く

だから、for 文で書けばよいでしょう。その他、以下のことを予めお知らせしておきます。

  • for 文で使用している i は整数なので、文字列に直すなら i.to_s とします。ダブルクオーテーションマークの中に #{i} で埋め込む方法なら、to_s は必要ありません。
  • urlfile を開いて保存するところは、進行を確認するために、ファイルを保存したタイミングで puts "#{name}をダウンロードしました。" などと表示するようにしたほうがわかりやすいでしょう。

以下の空欄を埋めて、完成させましょう。

require 'open-uri'
require 'fileutils'

# 演習でやったのと同じ
dir = # File.expand_path で「このプログラムと同じディレクトリの『 icons 』というディレクトリ」のフルパスを得る

if # dir に指定されたディレクトリがなければという条件式
  # dir を作成する
  puts "ディレクトリ #{dir} を作成しました。"
end

for i in 1..333
  url = # i を使って URL を表現する
  name = # File.basename を使って url から ファイル名だけ取り出す (直接書いても正解ではある)
  file = dir + '/' + name
  if # file に指定されたファイルが存在すればという条件式
    puts "#{name} はスキップされました。"
    next
  end
  # url と file を開いて、保存する
end

あとがき

この教材を作成する際に、2016 年度の TA であった後藤さんと黄さんに全文を読んでいただき、貴重なコメントをいただきました。特に、後藤さんからは標準ライブラリと組み込みライブラリの違いについてご指摘頂きました。黄さんは留学生であるにもかかわらず全文を読み通していただきました。以上のお 2 人に心より感謝します。

この教材は 2016 年 6 月 20 日付けで書かれたものです。この教材は、各作品の版権元とは一切関係ありません。本サイトの記述はマシン固有の環境に依存することがあります。

ナビゲーション

この教材は、東京大学理学部数学科専門科目「計算数学 I」のために執筆されたものです。 このサイトに掲載する際に、記事を分けてあります。 他の回はRuby 画像ダウンロード編 一覧 #ks1-ruby-downloadから御覧ください。

Ruby 入門 (計算数学実習資料集)には他の TA が書いた教材があります。

コメントする