問: 組み体操で10段のピラミッドを作ったとき、最も重量がかかるのはどの場所で、それはおよそ何kgか

Twitter で流れてきたので、Scheme でやってみた。

(define main
  (lambda (args)
    (print (reaction-of-kumitaiso (string->number (cadr args))))))

(define self-weight
  (lambda (n)
    (if (= n 1)
        (list 0.5 0.5)
        (cons 0.5 (append (make-list (- n 1) 1.0) '(0.5))))))

(define reaction-of-kumitaiso
  (lambda (n)
    (if (= n 1)
        (self-weight 1)
        (let ((u (map (lambda (x) (/ x 2.0)) (reaction-of-kumitaiso (- n 1)))))
          (map + (cons 0.0 u) (append u '(0.0)) (self-weight n))))))

1人分の体重を1.0として10段だと、一番下の支点にかかる重量は、

takatoh@nightschool $ gosh kumitaiso.scm 10
(0.9990234375 2.986328125 4.9091796875 6.6171875 7.841796875 8.29296875 7.841796875 6.6171875 4.9091796875 2.986328125 0.9990234375)

最大になるのは真ん中の支点で、8.29296875。1人の体重が60kgだと仮定すれば、

gosh> (* 8.29296875 60.0)
497.578125

となって、およそ500kg。うへぇ!

Amazon EC2を試してみた:(4)インスタンスに固定IPをつける

Elastic IP というのを使うようだ。

EC2 の Dashboard ページから、Elastic IPs を選んでページを移動、Allocate New Address をクリックする。
これだけで、新しい IP アドレスが作成された。

今できたアドレスを右クリックして Associate Address を選ぶ。出てきたダイアログでひもづけるインスタンスを選んで、Associate ボタンをクリック。
これで OK のようだ。

ちゃんと Elastic IP がひもづけられているのを、次の2つで確認した。

  • ssh で接続できる
  • ブラウザで接続できる(Nginx のページが表示される)

追記

インスタンスをいったん停止して、再度起動してからも同じ IP で接続できることも確認した。

Amazon EC2を試してみた:(3)Nginx

今回は Nginx をインストールして web ページを確認するまで。

インストールはとっても簡単、yum コマンドでインストールするだけ。

[ec2-user@ip-172-31-3-244 ~]$ sudo yum install nginx

起動。

[ec2-user@ip-172-31-3-244 ~]$ sudo /etc/init.d/nginx start
nginx を起動中:                                            [  OK  ]

ブラウザで確認すると、ちゃんと動いている。

nginx-on-amazon-ec2

Amazon EC2を試してみた:(2)S3バケットをマウントする

S3のバケットをファイルシステムとしてマウントするには、s3fs-fuse というツールを使う。今回使ったヴァージョンは最新の 1.77

依存するツールのインストール

まずは依存するツールをインストールする。

[ec2-user@ip-172-31-3-244 ~]$ sudo yum install gcc
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install libstdc++-devel
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install gcc-c++
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install fuse
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install fuse-devel
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install curl-devel
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install libxml2-devel
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install openssl-devel
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install mailcap
[ec2-user@ip-172-31-3-244 ~]$ sudo yum install automake

ダウンロードしてインストール

[ec2-user@ip-172-31-3-244 ~]$ wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.77.tar.gz -O s3fs-fuse-v1.77.tar.gz
[ec2-user@ip-172-31-3-244 ~]$ tar xvzf s3fs-fuse-v1.77.tar.gz
[ec2-user@ip-172-31-3-244 ~]$ cd s3fs-fuse-1.77
[ec2-user@ip-172-31-3-244 s3fs-fuse-1.77]$ ./autogen.sh
[ec2-user@ip-172-31-3-244 s3fs-fuse-1.77]$ ./configure --prefix=/usr
[ec2-user@ip-172-31-3-244 s3fs-fuse-1.77]$ make
[ec2-user@ip-172-31-3-244 s3fs-fuse-1.77]$ sudo make install

認証

S3に接続するには認証の必要がある。つまり Access Key ID と Secret Access Key が必要だってこと。方法は4つあるようだけど、今回は /etc/passwd-s3fs ファイルを作る方法にした。

[ec2-user@ip-172-31-3-244 s3fs-fuse-1.77]$ sudo vim /etc/passwd-s3fs
[ec2-user@ip-172-31-3-244 s3fs-fuse-1.77]$ sudo chmod 640 /etc/passwd-s3fs

マウント

[ec2-user@ip-172-31-3-244 ~]$ sudo s3fs lathercraft-storage2 /mnt/lcstorage -o rw,allow_other,default_acl=private

さあ、うまくいってるかな?

[ec2-user@ip-172-31-3-244 ~]$ echo Hello > /mnt/lcstorage/hello.txt
[ec2-user@ip-172-31-3-244 ~]$ ls /mnt/lcstorage
hello.txt
[ec2-user@ip-172-31-3-244 ~]$ df -kh
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  1.3G  6.5G   16% /
devtmpfs         990M   56K  990M    1% /dev
tmpfs           1003M     0 1003M    0% /dev/shm
s3fs             256T     0  256T    0% /mnt/lcstorage

OK、うまくいった。

参考になったページ

 cf. Amazon EC2からS3をファイルシステムとしてマウントする – mooapp
 cf. s3fs を使って EC2 に S3 の Bucket をマウントする – Qiita
 cf. Installation Notes – s3fs-fuse/s3fs-fuse

追記

インスタンスを再起動した時に自動でマウントするには、/etc/fstab ファイルに次の行を追加する。

s3fs#lathercraft-storage2 /mnt/lcstorage fuse rw,allow_other,default_acl=private 0 0

Amazon EC2を試してみた:(1)SSHで接続するまで

Amazon Web Service のホームから EC2 をクリックすると、EC2 のホーム画面になる。Launch Instance を選んで、スタート。

Step 1: Choose an Amazon Machine Image (AMI)

まずは、OS を選ぶところから。ここは素直に、Amazon Linux AMI 2014.03.2 (HVM) にしておいた。

Step 2: Choose an Instance Type

次にインスタンスタイプを選ぶ画面になる。インスタンスタイプはちょっとだけ欲張って t2.small にする。右下の Next: Configure Instance Details をクリック。

Step 3: Configure Instance Details

ここはデフォルトのまま、Next: Add Storage をクリック。

Step 4: Add Storage

ここもデフォルトのまま。

Step 5: Tag Instance

Name に lathercraft-storage2 を指定して、Next: Configure Security Group。

Step 6: Configure Security Group

Assign a security group はデフォルトの Create a new security group。Security group name は launch-wizard-3 となっていたのでそのまま。3 になってるのは、前にもちょっとだけ試したことがあるからかな。
HTTP のサーバとして使う予定なので Add Rule から HTTP を選んで追加した。

Step 7: Review Instance Launch

最終確認画面。このまま Launch をクリック。すると、Select an existing key pair or create a new key pair というダイアログが出たので、Create a new key pair をえらんで、amazon2 という名前をつける。でもって Download key pair をクリックすると鍵がダウンロードできる。これは SSH でインスタンスに接続するときに使う。ダウンロードした鍵は amazon2.pem というファイル名になっている。
それから、あらためて Launch Instance をクリック。

これでインスタンスの起動は完了。View Instaces をクリックして、EC2 のホーム画面に戻ると、新しいインスタンスが running 状態になっているのが確認できた。

SSHで接続

上でダウンロードした鍵 amazon2.pem ファイルを .ssh ディレクトリに移動してパーミッションを変更。

takatoh@nightschool $ mv Downloads/amazon2.pem .ssh
takatoh@nightschool $ chmod 400 .ssh/amazon2.pem
takatoh@nightschool $ ls -l .ssh | grep amazon2
-r-------- 1 takatoh takatoh 1692  9月  6 08:26 amazon2.pem

さあ、インスタンスに接続してみよう。インスタンスの IPアドレスは、インスタンスリストの Public IP の欄で確認できる。ユーザーは ec2-user だ。

takatoh@nightschool $ ssh -i .ssh/amazon2.pem [email protected]
Last login: Fri Sep  5 23:44:47 2014 from fntsitm001026.sitm.fnt.ngn.ppp.infoweb.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
9 package(s) needed for security, out of 28 available
Run "sudo yum update" to apply all updates.

Nginxのプロキシが動いてくれない(解決編)

Nginx のプロキシが動いてくれない問題が解決した。
↓このページが参考になった。

 cf. nginx連載3回目: nginxの設定、その1 – インフラエンジニアway

結論から言うと、アクセスログのフォーマットに定義していない名前を使っていたことだった。この行。

access_log /var/log/nginx/storage1.lathercraft.net/access.log main;

access_log ディレクティブには、ログファイル名のほかにログのフォーマットを名前で指定できる。ここでは main というのがそれだ。だけど、この間書いた(書いたというかネットからもらってきた)設定ファイルでは main という名前のログフォーマットが定義されていなかった。だからテストも通らなかったわけだ。

ログフォーマットは例えばこんなふうに定義できる。

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

これで main という名前のフォーマットが使えるようになる。

ところで、Nginx にはあらかじめ combined という名前のログフォーマットが組み込まれているそうだ。

log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

せっかくなので、こっちを使うことにした。結局、最初に示した行はこう変わった。

access_log /var/log/nginx/storage1.lathercraft.net/access.log combined;

これでめでたく動くようになった。