2015年10月23日金曜日

Ruby Net::HTTPの使い方と(直接)使うべきでない時

Untitled Document.md

rubyで単純なHTTP Getをするのであれば、openuriが圧倒的に便利ファイルと同じように、http getリクエストを扱えてしまう。
しかし、比較的複雑なリクエスト(例:POST、ヘッダに何か入れる)の場合、net/httpを使う。

最も単純なGET

Net::HTTPでのgetは以下のようになる。 この程度ならopenuriを使った方が良い。

require "net/http"

# レスポンスをブロックの外で使いたい時には事前に定義しておこう
# ブロックがクロージャであることを忘れずに
response=nil

uri = URI.parse("http://example.net/")
Net::HTTP.start(uri.host, uri.port) do |http|
  response = http.get("/index.html")
  puts response.code # ステータスコード
  puts response.message # メッセージ
  puts response.body # レスポンスボディ
end

puts response.message # => OK

以下のようにインスタンスを作成してからコネクションを開く事もできる。
しかしこの場合には、最後にクローズしないとだめ。忘れるとシツレイ。
startにブロックを渡せば、ファイルオープンと同じように最後にクローズを勝手にやってくれるので安心。

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new("/index.html")
http.close

HTTPSへのGET

以下のようにstartの引数に:use_ssl=>trueを渡してやる。

require "net/http"

uri = URI.parse("https://example.net/")
Net::HTTP.start(uri.host, uri.port,:use_ssl=>true) do |http|
  response = http.get("/index.html")
  puts response.body
end

POSTの場合

require "net/http"

uri = URI.parse("http://example.net/")
Net::HTTP.start(uri.host, uri.port) do |http|
  response = http.post("/search.cgi",'query=foo',header=nil)
  puts response.code
  puts response.message
  puts response.body
end

素晴らしいNet::HTTP解説のリンク

チートシート
http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

RestでJSONリクエストを投げる例。
https://www.socialtext.net/open/very_simple_rest_in_ruby_part_3_post_to_create_a_new_workspace
http://altarf.net/computer/ruby/2890

restを作る時に便利なgem
https://github.com/rest-client/rest-client

以下に該当する場合にはNet::HTTPを使うべきでない。

単純なGETしかしない

→openuriを使う
http://ruby-doc.org/stdlib-2.1.0/libdoc/open-uri/rdoc/OpenURI.html

クローラーを作りたい

→anemoneを使う
https://github.com/chriskite/anemone

Amazonの商品検索、操作APIを使いたい

→asinを使う
https://github.com/phoet/asin

AWSのRESTを使いたい

→aws-sdk-rubyを使う
https://github.com/aws/aws-sdk-ruby

なんかRESTを使いたい。

→rest-clientを使う
https://github.com/rest-client/rest-client

2015年10月17日土曜日

10分でdocker入門

Untitled Document.md

10分でdocker入門

近年、Linuxカーネが導入したcgroupなどの機能によって、コンテナによる仮想化が可能になった。 OSのファイルシステムや、CPU、メモリなどのリソースをプロセスごとに割り振り、お互いを孤立されることができるようになったことで、 1つのマシンの中にコンテナと呼ばれる仮想のマシン環境を作っていくことができるらしい。VMwareやVirtualBoxとくらべて、区画を作るだけな分、リソースの使用効率が良く、高速らしい。 使ってみた感想は、兎に角速い。VMwareやVirtualBoxに比べて、とにかく仮想環境の作成が早くできる。 コンテナはむこうと違って異るカーネルの環境は作れないが、この速さは一定の環境でのソフトウェアの動作を検証したい時などにとても便利。 たとえばインストーラの動作確認をするなら是非使いたい。

インストール

cat >/etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
yum install docker-engine -y

起動

docker daemon

(service docker startでも良いはずだがそっちはエラーが出た)

イメージのダウンロード

https://hub.docker.com/explore/でイメージを探して

sudo docker pull centos
sudo docker images

コンテナの中でshellを立ち上げて、ユーザーを作ってみる。

07:15:19 sato@localhost docker $ sudo docker run -i -t centos /bin/bash
[sudo] password for sato:
[root@d0f14de7ac35 home]# useradd nyanchu
[root@d0f14de7ac35 home]# su - nyanchu
[nyanchu@d0f14de7ac35 ~]$
[nyanchu@d0f14de7ac35 ~]$ exits
[root@d0f14de7ac35 /]# exit
exit

さっき抜けたコンテナを確認

07:16:26 sato@localhost docker $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS               NAMES
d0f14de7ac35        centos              "/bin/bash"         About a minute ago   Exited (130) 44 seconds ago                       hopeful_engelbart

再度コンテナに接続

終了しているので最初に起動してやる必要がある。
さっき作ったユーザーが存在しているのがわかる。

07:17:17 sato@localhost docker $ sudo docker start d0f
d0f
07:17:27 sato@localhost docker $ sudo docker attach d0f
[root@d0f14de7ac35 /]# su nyanchu
[nyanchu@d0f14de7ac35 /]$ ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

コンテナからイメージを作成

12:28:49 root@localhost ~  $ docker commit d0f my_image
d583edebf68931c8aa5b52565a3b0182f759a79b4b0924d040468c8241bfa19a

docker imagesでできたイメージの確認

12:29:10 root@localhost ~  $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
my_image            latest              d583edebf689        10 seconds ago      263.7 MB
centos              latest              e9fa5d3a0d0e        3 days ago          172.3 MB

作ったイメージからコンテナを作成

作成したイメージに作って置いたユーザーが最初から存在することが確認できる。

12:30:36 root@localhost ~  $ docker run -i -t my_image /bin/bash
[root@e12f0ec2d79f /]# su - nyanchu
Last login: Sat Oct 17 03:22:52 UTC 2015 on console
[nyanchu@e12f0ec2d79f ~]$