スキマハコ

わすれがちなスキマな事を詰め込んでいます。ITの他に暮らしについても書いています。

HerokuでWebサービスを公開するまでの記録をするよー(-1)

ごめん…Railsで作りたかったけど、そもそもスタートアップからハードルあげすぎて、自分がついていけなくなった…。

とりあえず、1ファイルでサービスをちゃんと公開するまで、がんばるよ。

Sinatraを利用する

「ぼくはRailsでサービスを作りたいんだ!Sinatraって何だよ!」
そんなわけでSinatraってよく知らなかったので調べてみた。

Rubyist Magazine - Sinatra 再入門、 Padrino / Rack / その先の何か
Rails Hub情報局: Railsはフルコース、Sinatraはお皿、Padrinoはビュッフェ
Sinatra 1.3.0 & Padrino 0.10.3 がリリースされました。ざっくり紹介(2)。 « blog.udzura.jp

ようするにRailsの軽量フレームワークのようですぜ。
大きいサイズのサービスじゃなくっていいよーって時に便利みたい。
確かに、rails new でアプリケーションを作ると大きいからなあ。

ruby1.9.xで、Net::SSHを使ってIPv6でSSHするー

Net::SSHを使ってIPv6でつなごうとしたら、引数がおかしいがな!と怒られた時の対応メモ。

環境

2.x系を利用しました。

$ gem list

*** LOCAL GEMS ***

bigdecimal (1.1.0)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
net-sftp (2.0.5)
net-ssh (2.3.0)
rake (0.9.2.2)
rdoc (3.9.4)

おこられた内容

# SSHのデバッグログを出す(:verbose=>:debug)
# セッション接続
Net::SSH.start("fe80::XXXX:XXXX:XXXX:XXXX", "user", :password => "password", :verbose=>:debug) do |ssh|
  result = ssh.exec!("ls -l")
  puts result
end
# => D, [2012-03-30T09:12:32.962733 #3309] DEBUG -- net.ssh.transport.session[47ab2d8]: establishing connection tofe80::XXXX:XXXX:XXXX:XXXX:22
# => Invalid argument - connect(2)

えー、引数が違うの??

じゃあIPv4だとどうなの?

Net::SSH.start("XXX.XXX.XXX.XXX", "user", :password => "password") do |ssh|
  result = ssh.exec!("ls -l")
  puts result
end
# => D, [2012-03-30T09:21:29.412012 #3325] DEBUG -- net.ssh.transport.session[5090b0a]: establishing connection to XXX.XXX.XXX.XXX:22
# => D, [2012-03-30T09:21:29.416018 #3325] DEBUG -- net.ssh.transport.session[5090b0a]: connection established
# => ... (以下ログが続く)

つながったー!!!!ええええ。

SSHを振り返る。

SSHDの設定がおかしいのかなー。
IPv6は拒否します!みたいな…
アクセス制御ファイル内容確認する。

$ cat /etc/hosts.deny	# アクセス拒否ファイル
#
# hosts.deny    This file describes the names of the hosts which are
#               *not* allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow.  In particular
# you should know that NFS uses portmap!

$ cat /etc/hosts.allow	# アクセス許可ファイル
#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#

結論:なんにもなかった。

そういえば、SSHの接続方法ってどんなのだっけ?とテキストを確認。

$ ssh XXX.XXX.XXX.XXX
$ ssh fe80::XXXX:XXXX:XXXX:XXXX%eth0

インターフェース指定してる…??

試してみる

# SSHのデバッグログを出す(:verbose=>:debug)
# セッション接続
Net::SSH.start("fe80::XXXX:XXXX:XXXX:XXXX%eth0", "user", :password => "password", :verbose=>:debug) do |ssh|
  result = ssh.exec!("ls -l")
  puts result
end
# => D, [2012-03-30T09:21:29.412012 #3325] DEBUG -- net.ssh.transport.session[5090b0a]: establishing connection to fe80::XXXX:XXXX:XXXX:XXXX:22
# => D, [2012-03-30T09:21:29.416018 #3325] DEBUG -- net.ssh.transport.session[5090b0a]: connection established

うごいたー!!!!

教訓:APIの書式だけじゃなくって、コマンドの書式も確認してみよう

CentOSのIPv6を有効にするよー

インターフェースの設定にIPv6の設定を追加しようとしたら怒られたので、
そのメモ。

NIC(eth0側)を外部接続用に設定
※以下はTD用CentOSの設定
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
DHCP_HOSTNAME=localhost.localdomain
IPADDR=XXX.XXX.XXX.XXX
NETMASK=255.255.255.0
TYPE=Ethernet
USERCTL=no
# ※IPV6INITがYesになっていることを確認。
IPV6INIT=yes
PEERDNS=yes

$ /etc/rc.d/init.d/network reload ← ネットワーク設定反映

$ ifconfig eth0 ← NIC(eth0側)ネットワーク設定確認

IPv6の自動割り振りはケーブルが刺さっているときに行われる

ってやってたんだけど次のエラー、再起動時に以下のメッセージが出た。

$ /etc/rc.d/init.d/network reload
致命的:[ipv6_test]カーネルがIPv6をサポートするようにコンパイルされていません。

えええ…

一応、エラーメッセージでぐぐたすしたら、次のようなことらしい。

Try looking inside /etc/modprobe.conf for these lines:
alias net-pf-10 off
alias ipv6 off

I would comment them out and add another comment like this:

# Un-comment these to disable ipv6
#alias net-pf-10 off
#alias ipv6 off

Kernel is not compiled with IPv6 support? - Linux Archive

$ cat /etc/modprobe.conf
alias eth0 e1000
alias scsi_hostadapter ata_piix
alias scsi_hostadapter1 ahci
alias net-pf-10 off
# ipv6を無効にしてそうな設定をコメント
# alias ipv6 off
# options ipv6 disable=1
alias snd-card-0 snd-intel8x0
options snd-card-0 index=0
options snd-intel8x0 index=0
remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0
alias eth1 e1000
alias eth2 pcnet32

で、再起動したらOKでした。

ちょこっとツール

ディレクトリの更新日時を変更したいなーと思った時に使うシェル。
ディレクトリ名がちょっと特殊なパターンだけど、他にも設定日時を固定で設定してもいいかも。

#!/bin/sh

# ディレクトリ名(YYYYMMDDhhmmssttt)と同じ更新日付にする。

# ファイル一覧を取得(すべてのファイル)
for f in $( ls ); do
  # ディレクトリのみ
  if [ -d $f ] ; then
    # ディレクトリ名から日時(YYYYMMDDhhmmss)を取得
    date=$( echo "$f" | cut -c 1-12)
    # echo "$date"
    touch -cm -t$date $f 
  fi
done

# 確認
ls -l --full-time

ディレクトリ内のファイルを特定の場所にコピーする。

basepath=../src
copypath=/copy
# ファイル一覧を取得(すべてのファイル)
for f in $( ls $basepath ); do
  # ファイルのみコピー
  if [ -f $basepath/$f ] ; then 
    echo $basepath/$f$copypath
    cp $basepath/$f $copypath
  fi
done

ちょっと便利ツールでした。

rubyのguiライブラリ

Rubyist Magazine - Create
こちらを見ていて、tkを使ってみよう!と思ったものの、なんか動かなーいと思ったら
ライブラリがないぜ!といわれる。

どうやらtkが標準でインストールされてないっぽい。覚書メモ。

1.8.x系の場合はこちら→

確認環境

$ ruby -v
ruby 1.9.2p290 (2011-07-09) [i386-mingw32]

インストールされているか確認する

rubygemを利用して確認してみる。

$ gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.3)
actionpack (3.0.3)
activemodel (3.0.3)
activerecord (3.0.3)
activeresource (3.0.3)
activesupport (3.0.3)
arel (2.0.10, 2.0.6)
builder (2.1.2)
bundler (1.0.21)
erubis (2.6.6)
i18n (0.6.0)
mail (2.2.19, 2.2.14)
mime-types (1.17.2)
minitest (1.6.0)
polyglot (0.3.3)
rack (1.2.5, 1.2.1)
rack-mount (0.6.14, 0.6.13)
rack-test (0.5.7)
rails (3.0.3)
railties (3.0.3)
rake (0.9.2.2, 0.8.7)
rdoc (2.5.8)
rubygems-update (1.8.15)
sqlite3 (1.3.4 x86-mingw32)
sqlite3-ruby (1.3.3)
thor (0.14.6)
treetop (1.4.10)
tzinfo (0.3.31)

tkライブラリ(モジュール?)はインストールされていない…。
rubygemを利用してインストール!

# gem install tk-win
Fetching: tk-win-0.2.2-x86-mingw32.gem (100%)
Successfully installed tk-win-0.2.2-x86-mingw32
1 gem installed
Installing ri documentation for tk-win-0.2.2-x86-mingw32...
Installing RDoc documentation for tk-win-0.2.2-x86-mingw32...

unixだと違うライブラリっぽい…「search tk」でたくさん出てきた。
unixでは標準でtkライブラリが入っているようなので、いらないのかな?

VirtualBoxにCentOSをいれたよー

なんとvirtual boxには64bitが入るらしい・・・ホストOSが32bitでも!すごい!
vmwareだけだと思っていたので、これはうれしい!!

前提

マシンCPUがVt-x/AMD-vをサポートしていること。

これは、BIOSの設定でOFFになっていることがあるので、要確認。
Windows7とか入ってるようなマシン(XPモード可能なやつ)であればだいたいサポートしてる。
そんな極端に古いマシンでなければいけるはず。

ハマったところ

ネットワーク設定。
主にこんな感じ。

  1. ホストオンリー:ホストOSとゲストOSだけを通信させたい
  2. ブリッジ:ローカルなネットワークで通信したいし、インターネットにもつなぎたいし、ゲスト・ホストOSも通信したい
  3. NAT(デフォルト):とにかくインターネットにつなぎたい/けど受信はしたくない

ブリッジであれば、①と③を兼ね備えるんだけど、セキュリティの問題もあるので注意。
とりあえず、①+③の組み合わせでだいたいなんとかなる。

で、①+③については基本的にVirtualBoxの側設定だけでなんとかなる。
(参考先の、iptableの矛盾は注意が必要だけど)

私がハマったのは②ブリッジの時。
このときそもそもブリッジがよくわかってなかったんだけど…。
まず、ホストOS側で【バーチャルのネットワーク】と【ローカルネットワーク】のブリッジを作る。

そのあと、VirtualBoxのUIからNICを追加する。
追加するNICはもちろん、さっき設定したブリッジ。

DHCPでつなげる場合はこれでおしまい。
でも私の環境が静的に割り振ってあげないといけなかった…。

なので

    • ブリッジしたNICに静的アドレスを設定(VirtualBoxの環境設定から)
    • ゲストOSに入って、該当のインターフェースにIPアドレス・マスクを設定

これでブリッジが完成!
手間取ったー。

Arrayのto_sがバージョンで実装が違うよー

前回の内容に認識ミスがあったので、訂正!

#-------------------------------1.8.x
a = "ab"
p "a.unpack('C*').to_s=" + a.unpack('C*').to_s
#=>"a=9798"
#-------------------------------1.9.x
a = "ab"
p "a.unpack('C*').to_s="+a.unpack('C*').to_s
#=>"a=["9798"]"
なんか配列になった!!!!!
文字から文字コードを取得しよう - スキマハコ

配列になったわけではなくって、1.8と1.9で配列のto_sの実装が変更になったが正しい。
そもそも、unpackやpackはテンプレートに沿った変換を行った配列を返すものなので…。

↓1.8

to_s -> String
Array#join($,) と同じです。
[1, 2, 3, 4].to_s # => "1234"
class Array

↓1.9

to_s -> String
inspect -> String
自身の情報を人間に読みやすい文字列にして返します。
[1, 2, 3, 4].to_s # => "[1, 2, 3, 4]"
[1, 2, 3, 4].inspect # => "[1, 2, 3, 4]"
class Array

地味にこういうのきついなあ…。