明けましておめでとうございます。

本年も変わりませず宜しくお願いします。

去年はこちらはほとんど放置プレイでした。今年も多分こんな調子で行くと思います。
ま、ちょこちょこtwittertumblrはいじっていると思いますので、その辺冷やかしてみてください。

積ん読をちょっと切り崩さないとなー。

rubyで複数のrsyncを、パスワード入力とともに実行。最後にcrontabに登録



なんかすげーひさびさの更新が、こんな味も素っ気もない記事ですな。

…最近なんかイベントがあったはずなんだけど、よくわかりませんな。中止になったんじゃないですか?


外部コマンドを実行するとパスワード入力を求められちゃう

さて、ある事情があって、異なるサーバ間でデータの同期を取る必要がありいろいろ細工してみた。

rsyncコマンドで対象ファイルを指定すればいいんだけど、その際に厄介なことは、パスワードの入力が求められること。

一回限りだったらそれでも別にいいんだけど、できればcronに突っ込んで1時間ごとに実行したい。

rsyncコマンドを実行する際にパスワード入力をさせない方法は幾つかあるようだけど、どれも面倒そう。こういう運用は2ヶ月ほどの予定で、それ以後は同期元のサーバは停止するので、わざわざrsyncデーモンを走らせるとかの処置は、やってもいいけどちょっとモチベーションがわかない。

本格的なバックアップサーバを用意するわけではないので、このままrubyで外部コマンドを実行する簡単なスクリプトを組んでおきたい。



で、スクリプトを組む上でのポイントは

  • 複数のrsyncコマンドを実行する
  • パスワードを入力する
  • 成功失敗に関わらず、実行結果をログに出す
  • ひとつのコマンドが失敗しても次のコマンドを実施する
ほんとうだったらここで、スクリプト中のパスワードも隠蔽したいけど、まあ、同期先も元も俺ひとりが管理しているし、コードの中に平文でもいいか。

こういう対話的な処理をrubyで実現する場合、ptyとexpectを利用するのが定番らしい。


続きを読む

rubyでamazonから書籍検索



ISBNではなくて、作者やタイトルから書籍を得るときのサンプルコードも書いておく。



よくわからんのは、req.search( is, rg , 3) と書くと、1から3ページ目まで送ってくること。

2〜5ページ目だけよこせというような使い方ができない。なんでじゃ。使いにくい仕様だ。

続きを読む

rubyでamazonからISBNを検索

日本語ドキュメントがなくてちと悩んだんだけど、結果的にすごい簡単なことだったのでメモしておく。

rubyスクリプトamazonのWabAPIを利用して、ISBNから書誌情報を取得するサンプル。

続きを読む

bashの操作ログをとる

とりあえずコマンドは

scriptコマンドでいいみたい。
ログローテーションと圧縮の自動化は必要ですな。
あと、ログインとログアウトの時間と。
あーでも、当面は手動でやるか…。

クライアントのローカルでログを取る方法(teraterm編)。

たとえばteratermとかで、手元のPCにログを取りたい場合は以下のようなVBスクリプトを用意しておいて、そこからteratermをキックするようにするとよろしかろうと思う。
フォルダ"D:\work\ttermlogs\"を作っておくと、そこに日付と起動時間で名前を作ったログファイルができているはず。いちおうとりっぱぐれはない。
Dim WshShell, AppName, oExec, NowTime, LogPath, LogName

'Get current date and time
NowTime=Now

'Set log file, YYYYMMDD-HHMMSS.log style
LogPath = "D:\work\ttermlogs\"
LogName = LogPath & Year(NowTime) & "." & Month(NowTime) & "." & Day(NowTime) & "-" & Hour(NowTime) & "." & Minute(NowTime) & "." & Second(NowTime) & ".log"

'Set application command line
AppName = "C:\Program Files\teraterm\ttermpro.exe" & _
" /L=" & LogName

'Startup TeraTerm program
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(AppName)