<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>週刊（月刊？）プレカリアート &#187; 草稿</title>
	<atom:link href="http://blog.neoneet.jp/category/%e8%8d%89%e7%a8%bf/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.neoneet.jp</link>
	<description>ニートになりそうな私が好き勝手書きます</description>
	<lastBuildDate>Sat, 24 Dec 2011 06:19:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>ファイルのダウンロード</title>
		<link>http://blog.neoneet.jp/2009/01/09/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89/</link>
		<comments>http://blog.neoneet.jp/2009/01/09/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 13:10:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[コンピュータ]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[草稿]]></category>

		<guid isPermaLink="false">http://blog.neoneet.jp/?p=155</guid>
		<description><![CDATA[写真をダウンロードしてみる Webページに掲載されている写真をローカルにダウンロードします。そのためには写真のURLが必要です。まず、どこか写真の載っているWebページを開いて、そのURLを調べます。多くのWebブラウザでは右クリックをして「画像を開く」などを選ぶことで画像だけを開くことができます。そこからURLを取得します。 こうして得られた画像のURLを覚えておきます。今回は http://chsv.nikon-image.com/jpn/products/camera/slr/digital/d3x/img/sample/pic_009.jpg とします。 open-uriを使う おそらく一番お手軽なものはopen-uriを使うことでしょう。require &#8216;open-uri&#8217;することでopenでURLを開くことが可能になります。 require 'open-uri' filename = ARGV[0].split("/")[-1] data = open(ARGV[0]) file = open(filename, "w") file.puts(data.read) file.close これを保存して引数にURLを与えるとファイルをダウンロードすることができます。今回は約17MBと大きいものでしたが、無事にダウンロードすることができました。 関連項目 URLからファイル名を取り出す 配列の添え字 ファイルに記録する net/httpを使う より細かい動作をしたいときにはnet/httpがよいでしょう。これを用いるとGET以外にもPUTもできるようになります。 require 'uri' require 'net/http' Net::HTTP.version_1_2 uri=URI(ARGV[0]) filename = ARGV[0].split("/")[-1] file = open(filename, "w") Net::HTTP.start(uri.host, uri.port) do &#124;http&#124; file.puts(http.get(uri.path).body) end file.close Socketを使う（その１） さらに細かい制御が欲しい場合にはSocketを使うこともできます。 require 'uri' require 'socket' [...]]]></description>
			<content:encoded><![CDATA[				<h2>写真をダウンロードしてみる</h2>
				<p>Webページに掲載されている写真をローカルにダウンロードします。そのためには写真のURLが必要です。まず、どこか写真の載っているWebページを開いて、そのURLを調べます。多くのWebブラウザでは右クリックをして「画像を開く」などを選ぶことで画像だけを開くことができます。そこからURLを取得します。</p>
				<div align="center">
				<a href="http://blog.neoneet.jp/wp-content/uploads/2009/01/1.png"><img src="http://blog.neoneet.jp/wp-content/uploads/2009/01/1-300x239.png" alt="1" title="1" width="300" height="239" class="aligncenter size-medium wp-image-162" /></a>
				</div>
				<p>こうして得られた画像のURLを覚えておきます。今回は</p>
				<p>http://chsv.nikon-image.com/jpn/products/camera/slr/digital/d3x/img/sample/pic_009.jpg</p>
				<p>とします。</p>
				<h2>open-uriを使う</h2>
				<p>おそらく一番お手軽なものはopen-uriを使うことでしょう。require &#8216;open-uri&#8217;することでopenでURLを開くことが可能になります。</p>
				<pre class="prettyprint">
require 'open-uri'

filename = ARGV[0].split("/")[-1]

data = open(ARGV[0])
file = open(filename, "w")
file.puts(data.read)
file.close
</pre>
				<p>これを保存して引数にURLを与えるとファイルをダウンロードすることができます。今回は約17MBと大きいものでしたが、無事にダウンロードすることができました。</p>
				<h3>関連項目</h3>
				<ul>
				<li>URLからファイル名を取り出す</li>
				<li>配列の添え字</li>
				<li>ファイルに記録する</li>
				</ul>
				<h2>net/httpを使う</h2>
				<p>より細かい動作をしたいときにはnet/httpがよいでしょう。これを用いるとGET以外にもPUTもできるようになります。</p>
				<pre class="prettyprint">
require 'uri'
require 'net/http'

Net::HTTP.version_1_2

uri=URI(ARGV[0])
filename = ARGV[0].split("/")[-1]

file = open(filename, "w")

Net::HTTP.start(uri.host, uri.port) do |http|
	file.puts(http.get(uri.path).body)
end

file.close
</pre>
				<h2>Socketを使う（その１）</h2>
				<p>さらに細かい制御が欲しい場合にはSocketを使うこともできます。</p>
				<pre class="prettyprint">
require 'uri'
require 'socket'

uri = URI(ARGV[0])
filename = ARGV[0].split("/")[-1]

puts ARGV[0]
puts filename

file = open(filename, "w")

socket = TCPSocket.new(uri.host, uri.port)
socket.puts "GET #{uri.path} HTTP/1.0\r\n"
socket.puts "Host: #{uri.host}\r\n"
socket.puts "\r\n"

# ヘッダを捨てる
file.puts(socket.read.split("\r\n\r\n")[1..-1].join("\r\n\r\n"))

socket.close
file.close
</pre>
				<h3>関連項目</h3>
				<ul>
				<li>HTMLのヘッダを捨てる</li>
				<li>splitとjoin</li>
				<li>配列の添え字</li>
				</ul>
				<h2>Socketを使う（その２）</h2>
				<p>たとえば1024バイトずつ読んでみることもできます。</p>
				<pre class="prettyprint">
require 'uri'
require 'socket'

uri = URI(ARGV[0])
filename = ARGV[0].split("/")[-1]

file = open(filename, "w")

socket = TCPSocket.new(uri.host, uri.port)
socket.puts "GET #{uri.path} HTTP/1.0\r\n"
socket.puts "Host: #{uri.host}\r\n"
socket.puts "\r\n"

# ヘッダを読み飛ばす
header = ""
while true do
	read = socket.recv(1024)
	if read.size == 0 then
		break
	end

	header += read
	response = header.split("\r\n\r\n")
	if response.size != 1 then
		body = response[1..-1].join("\r\n\r\n")
		size = body.size
		file.print(body)
		break
	end
end

while true do
	read = socket.recv(1024)
	if read.size == 0 then
		break
	end
	size += read.size
	puts "read : " + size.to_s + "bytes"
	file.print(read)
end

socket.close
file.close
</pre>
				<h3>実行結果</h3>
				<pre>
[・・・・]# ruby socket2.rb http://data.tumblr.com/J98fYvxSwi9giuxz1vPx43LSo1_400.jpg
read : 998bytes
read : 2022bytes
read : 2378bytes
read : 3402bytes
read : 4426bytes
read : 5450bytes
read : 6474bytes
read : 7498bytes
read : 8522bytes
read : 8618bytes
read : 9642bytes
（略）
</pre>
				<h2>Socketを使う（その３）</h2>
				<p>非同期読み込みについて。</p>
				<pre class="prettyprint">
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.neoneet.jp/2009/01/09/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

