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の接続方法ってどんなのだっけ?とテキストを確認。
- IPv4の場合
$ ssh XXX.XXX.XXX.XXX
- IPv6の場合
$ 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 offI would comment them out and add another comment like this:
# Un-comment these to disable ipv6
#alias net-pf-10 off
#alias ipv6 off
$ 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が標準でインストールされてないっぽい。覚書メモ。
確認環境
$ 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モード可能なやつ)であればだいたいサポートしてる。
そんな極端に古いマシンでなければいけるはず。
ハマったところ
ネットワーク設定。
主にこんな感じ。
- ホストオンリー:ホストOSとゲストOSだけを通信させたい
- ブリッジ:ローカルなネットワークで通信したいし、インターネットにもつなぎたいし、ゲスト・ホストOSも通信したい
- 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
地味にこういうのきついなあ…。