2014/11/19

Ruby ARGVとgetsを併用する

まったく知らないことに出くわしたのでメモ。
Rubyで小物ツールを作っていたわけですが…

first_arg = ARGV[0]

とかやって引数を読み込むのはよくやってました。
また、

input = gets

などとして、入力待ちにしといて何か入力させるのも、処理内容を確認させるときなどにこれまでもときどき使ってました。

で、両方同時につかうと、エラーに。

 `gets': No such file or directory

きょとんとしてしまいました。

どうやらgetsはARGF.getsの略で、引数をファイル名とみなしたものを取りに行くのがデフォルトの動作だそうです。そして、引数がない場合にはじめて標準入力を対象とするんだとか。知らんかった…。

input = STDIN.gets

などとして、明示的に標準入力を指定してあげると、期待通りの動作をしてくれました。

2014/11/15

RubyでGmailからメールを送信(したくて結構つまづいた件)

Gmail!Gmail! / FixtheFocus

Ubuntu(14.04)環境にて、あるRubyのシステムでエラーを検出したらメールで通知しようということになり、お手軽そうなのでGmailのSMTPを使うことにしたのですが、当初ものすごく手軽に行けそうな気がしたものの、結構つまづいてしまったお話です。

RubyでGmail送信。ちゃんとお手軽なgemが存在するようなので、さっくりとソレを使うことにします。

gem install gmail

してから、下記のような感じのコードで、手元の環境で動作することを確認。

require 'gmail'
Gmail.connect('account@gmail.com', 'password') do |gmail|
    gmail.deliver do
        to 'address@hoge.com'
        subject 'subject strain'
        text_part do
            body 'body string'
        end
    end
end

…で、借りている本番サーバーに持っていくと動かない。
よくある話ですね。。

Net::IMAP::NoResponseError

なるエラーが返ってくる。そして、Googleアカウントのセキュリティ設定のURLも提示されている。
GmailのヘルプやWeb上から、Googleアカウントの「セキュリティ」「アカウント権限」で「安全性の低いアプリのアクセス」を有効にしちゃえばいいように思うものの、それでも結果は同じ。
この本番環境が仮想環境上にあるので、ひょっとしてそれが関係あるのかしら…?などといろいろと迷走をはじめる。

結果的には、Googleアカウントの「パスワード」の「2段階認証」をONにして、「アプリパスワード」を設定してあげると動いた。
おそらく、手元の環境で難なく動いたのは、普段このアカウントにアクセスしているIPアドレスだったから(…といっても、あまり使ってないアカウントではあったのですが)で、居住地域とはまったく違う本番環境のIPアドレスからのアクセスをセキュリティ的に弾いたような印象です。

じゃあなんで2段階認証にすればOKになるんだ…とか、その辺の事情は分からずじまい。Gmailのヘルプ的にもアカウント権限の設定だけでアクセスできそうな気になっちゃいましたしね。なにはともあれ、2段階認証。

2014/05/12

QNAPでTimeMachineが失敗する...

DIY Time Machine WallpaperDIY Time Machine Wallpaper / FHKE

QNAPのNASを使用していますが、最近TimeMachineバックップが成功しません。
TimeMachineには公式に対応しているNASですし、ファームウェアも現在最新の4.0.7です。でもMacがMavericksになってからは、特に調子が悪いような気がしています。

試行錯誤しているうちに、失敗の症状もバリエーション出まくりでわけわかんなくなんてきまして。初回だけは成功することもあれば、初めから固まることもあり。もう嫌気がさして3ヶ月くらいTimeMachineを止めてしまっていたのですが、先日Windows機が突然死するという事態に出くわし、システムバックアップの便利さを痛感したため、やっぱりなんとかしてバックアップはとっておきたいと思った次第です。

QNAPのバカ。もう知らない。
そんなわけで、「TimeMachineサーバー」の機能は使わずに、フツーのNASとしての共有フォルダ、つまりAFPマウントとかして使っている領域にシステムバックアップを取るのをアレコレ試行錯誤した経緯です。つまりQNAPもTimeMachine非対応NASであるかのごとくいじって、システムバックアップとろう、という試行錯誤。

0. 下準備

調べてみると、バックアップ先にするディスクイメージ名の規則が決まっており、バックアップするMacのホスト名とMACアドレスが必要らしいので、用意しておきます。
蛇足ながら、ホスト名はターミナルで
$ hostname
で返される文字列です。HOGE.localだったらHOGEの部分。
MACアドレスはLANに接続しているネットワーク機器固有のアドレス。
$ ifconfig -a
で返される文字列に含まれています。
多くの場合、有線LANは“en0”で無線LANは“en1”になってるようですが、環境次第です。”01:23:45:AA:BB:CC”みたいな感じで記述されてます。

1. バックアップ先にするディスクイメージをつくる

リモートには直接イメージを作れないらしいので、まずはローカルのホームディレクトリとかデスクトップとか、適当な場所につくります。
こんな感じのコマンド。
$ sudo  hdiutil create -size (SIZE) -fs HFS+J -type SPARSEBUNDLE -volname (VOLUMENAME) (HOSTNAME)_(MACADDRESS).sparsebundle
(大文字)のところは、環境固有の値になります。
  • (SIZE) - イメージのサイズ。バックアップするMacの容量の1.5倍くらいがいいっていわれてました。
  • (VOLUMENAME) - なんでもいいですが、この名前でイメージがマウントされます。’TimeMachine’とかすることが多い模様。
  • (HOSTNAME)_(MACADDRESS) - ディスクイメージのファイル名。0.で取得したホスト名とMACアドレスを使います。MACアドレスは、’:’を抜いたものになります。
具体的にはこんなかんじになります。
$ sudo  hdiutil create -size 256g -fs HFS+J -type SPARSEBUNDLE -volname TimeMachine HOGE_012345AABBCC.sparsebundle
これで、HOGE_012345AABBCC.sparsebundleなるディスクイメージファイルが作成されます。

2. ディスクイメージのマウント

1.で出来上がったイメージ、例でいうHOGE_012345AABBCC.sparsebundleをNASの共有フォルダに持っていきます。この辺はFinderでやりました。

QNAPユーザなら言わずもがなやもしれませんが、適当なNASの共有フォルダに移動させたのちに、作ったディスクイメージをマウントしてあげます。
私は通常SMBではなくAFPで使っていますが、“Public”って名前の共有フォルダの下に適当なフォルダを作ってディクスイメージを移動しました。

その後、移動先でイメージをダブルクリックします。すると1.で指定したVOLUMENAME、例でいうとTimeMachineという名前でイメージがマウントされます。

3. イメージをTimeMachine先のディスクにする

つぎに、非対応NASでTImeMachineするために、下記のコマンドを打ちます。
defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1
すると、あら不思議。「TimeMachine環境設定」の「ディスクを選択」に、従前のイメージがあらわれます。…となっていたハウツー記事があったのですが、私の環境では現れません。どうやら、この辺りはTimeMachineのバージョンなどによって違いがあるような気配です...。

もっと言えば、このコマンドはAFP(Appleのファイル共有)を使用する場合は不要と書いてある記事もありました。
さらにもっと言えば、0.のイメージ名をホスト名とMACアドレスで作成すること自体が、AFPの場合は不要って書いてある記事も見つけました。つまりイメージ名もなんでもいいんだと。
この辺、オーソライズされた情報が見つけられなかったので、必須なのかどうかはよく解りませぬが、今回は私がやったことを全部書いておこう…ということで書き添えます。
検証するモチベーションがもうないので...若い誰かがきっとやってくれる...後は頼んだ...

4. あらためて、イメージをTimeMachine先のディスクにする

tmutilなるコマンドを使って、マウントしているイメージをTimeMachine先に指定します。
$ sudo tmutil setdestination /Volumes/(VOLUMENAME)
VOLUMENAMEは、1で指定したもの。例で言うとTimeMachineです。

もしここでエラーになった場合は、/Volumesの下を確認してみましょう。ダブルクリックなどしてマウントされたものは/Volumesの下にマウントされていきますが、名前がかぶっていたりすると、勝手にTimeMachine–1などと思いがけないものになってしまったりします。こうなったら今後のためにも、他とかぶらないような名前を付け直すしかなさそう。

うまくいくと、TImeMachine環境設定のバックアップ先ディスクとしてVOLUMENAMEがセットされた状態になってます。

…これって、TimeMachineどうこうっていうか、フツーにディスクイメージをマウントしているだけじゃないかという気がフツフツ。そんなところからも、ホスト名やMACアドレス云々はやはり要らないような気がするとです。

5. レッツTimeMachine

メニューバーから「今すぐバックアップを作成」してみます。

もし、途中で固まってしまった場合は…というか私はばっちり固まってしまったのですが、どうやらSpotlight機能のindex作成が悪さをしていることがある模様です。
sudo mdutil -i off /Volumes/(VOLUMENAME)/Backups.backupdb
とすると、index作成をオフにできるんですと。これでホントに固まってたのが動き出しました。びっくり。(...ってか、これは明白にバグじゃね?) 私はSpotlightを使ったことないですし、今後も使う気がないので丸ごとオフにする設定を探してみました。
/etc/hostconfig
というファイルにSPOTLIGHT=-NO-と書き加えればいい模様。ホントにオフになったのかどうかは分からないものの、それ以来変なことは起きてないので、それでいいやー。(だんだんとモチベーションが...)

6. その後、どうするの?

初回バックアップは終わったものの、今の状態はNASをマウントして、さらにディスクイメージをマウントしてある状態です。...これからどうなんのコレ?
ずっと家で使うようなiMacとかなら、マウント状態のまま運用しても問題なさそうですが、私はMacBook Airで持ち歩くのでマウント状態を維持できません。

試しに一度マウントを解除してみてTimeMachineを動かしてみると案の定、ディスク接続されるまで動かんよ的なことを言われる。...まぁ、そりゃそうです。
つまり、バックアップをするためには
  1. NASマウント
  2. イメージマウント
  3. 「今すぐバックアップ」!
のような手順が必要になるということです。
TImeMachineはONのまま放置しておくと一時間ごとというせわしなさでバックアップをとろうとするので、それよりは基本はOFFにしておいて、好きなタイミングでバックアップをとれるコレも悪くないのかしら。などと思ったりもして、これで使っていくことにします。

7. さらにその後

TimeMachineは順調に動くものの、バックアップとるときの3ステップが案の定邪魔くさくなってきました。そこでスクリプトを書いてみました。エラー処理も無いいい加減なものなので、とてもそのままは載せられませんが、ざっくりと
  • mount_afp(NASをマウントして…)
  • hdiutil attach(イメージをマウントして…)
  • tmutil startbackup(今すぐバックアップ!)
  • hdiutil detach (イメージをアンマウントして…)
  • umount(NASをアンマウント)
などと実行していくようにすれば、ワンクリックで実行できるようにはなったので、これで良しとしようと思います。
ディスクイメージをコピーしちゃえばバックアップのバックアップ?も気軽にできますし、これはこれでステキな環境かもしれないと思いはじめていたり。

デロリアン トミカ
by カエレバ
にほんブログ村 IT技術ブログ IT技術メモへ