Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

ログファイル監視 + イベントスクリプト@ruby

ログファイルを監視して、ある文字列が出力されたらイベントを発生させたかったので、rubyで監視スクリプトを書いたので紹介します。

"log"というファイルを"hoge"という文字列で監視したい場合の使い方。

$ ./monitor.rb log hoge
ファイルlog を文字列hoge で監視します

ここで、他のコンソールから

$ echo "1234hoge5678" >> log

とすると下記のように出力されて終了します。

*** MATCH : 1234hoge5678

ログによってはcronでローテーションされて切り詰められて、新しい空のファイルになることもあるので、 その場合は古いファイルを見ずに新しいファイルを見るような処理も入っています。

ファイル名 : monitor.rb
-------------------------
#!/usr/bin/ruby

def usage()
    puts "\nusage : ./monitor.rb filename string"
    puts "          filenameで指定されたファイルをstringで監視し、マッチすれば終了します"

end

if (ARGV[0].nil? || ARGV[1].nil?)
    puts "引数が足りません"
    usage()
    exit!
else
    begin
        filename = ARGV[0]
        file = File.open(filename, "r")
        filesize = File.size?(filename)
        if (filesize == nil)
            filesize = 0
        end
    rescue => e
        puts e
        puts filename + "を開くことができません"
        usage
        exit!
    end
    str = ARGV[1]
    puts "ファイル" + filename + " を文字列" + str + " で監視します"
end

#最終行まで移動
file.seek(0,IO::SEEK_END)

begin
    # 読み込みループ
    while (true) do
        line = file.gets()
        if (! line.nil?)
            if ( /#{str}/ =~ $_ )
                puts "*** MATCH : " + $_
                exit
            end
        else
            sleep(0.5)

            if ( ! File.exist?(filename))
                puts "ファイルが削除されました"
                file.close()
                exit!
            end

            newFilesize = File.size?(filename)
            if (newFilesize == nil)
                newFilesize = 0
            end
            if ($DEBUG)
                puts "oldsize : "+ filesize.to_s + " newsize : " + newFilesize.to_s
            end
            if (newFilesize < filesize)
                puts "ファイルが切り詰められました. 新しいファイルを読み込みます"
                file.close()
                begin
                    file = File.open(filename)
                rescue => e
                    puts e
                    puts "ファイルを再オープンできません"
                    exit!
                end
                file.seek(0,IO::SEEK_END)
            end
            filesize = newFilesize
        end
    end
ensure
    if (! file.closed?)
        file.close()
    end
    exit!
end

rubyのexitの終了コード@1.8.5 and 1.8.7

最近rubyを使い始めて、いざプログラムを書いたところ、終了ステータスがうまく戻らないようで、困ってます。 rubyにはプログラムを終了するのにexitとexit!というのがあり、ドキュメントを見る限り、exitのデフォルトは終了ステータスが"0"で、exit!は"-1"のようです。

そこでLinux上やcygwin上のbashのirbで実験してみたところ、

>>exit
echo $?
0
>>exit (1)
echo $?
0
>>exit!
echo $?
1
>>exit! (1)
echo $?
1
>>exit! (0)
echo $?
0

となってしまい、exitで何を指定しても0になりません。 バグなんでしょうか?

rubyのirbで補完@cygwin

cygwin上でrubyのirbを動かしている時に、ふと補完ができたら便利だと思って調べてみたら、すでに作っている人がいるじゃないですか。皆さん考えることは同じなのね。

Wirbleというのをgemでインストールしないといけないらしいのですが、 cygwinのインストーラではインストールできないようなので、gemをまずはここからダウンロード。maznはrubygems-1.2.0.tgzをダウンロードしました。

インストールは簡単です。

# tar zxvf rubygems-1.2.0.tgz
# cd  rubygems-1.2.0
# ruby setup.rb

以上です。次にWirbleをインストールします。

# gem install -y wirble

参考にしたサイトでは上記コマンドでインストールできなかったとのことですが、maznの環境ではこれでOKでした。

あとは、 ~/.irbrc がなければ新規作成して、以下を書き込みます。

# vi ~/.irbrc
# load libraries
require 'rubygems'
require 'wirble'
# start wirble (with color)
Wirble.init
Wirble.colorize

これでTABで補完ができるようになったり、色がついたりします。

参考 http://journal.mycom.co.jp/articles/2006/12/22/wirble/ http://turn-addict.vox.com/library/post/cygwin%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8Bruby.html

viで制御コードの入力

.vimrcといった設定ファイルを書いていると、制御コードを入力したいときがあります。これは、Ctrl-v を押した後に目的のキー、またはCtrl+○で入力すればできるようです。

制御コードの参考 : http://ash.jp/code/ctrltbl.htm]

cygwin上のvimでは、デフォルトでBackspaceがうまく動作しません。日本語も表示できないため、~/.vimrcに以下を追記してあげましょう。Hはもちろん制御コードです

noremap <BS> ^H
noremap! <BS> ^H

set encoding=japan

簡単バックアップシェル

サーバ管理していると、ちょっとしたデータを定期的にバックアップしたいことがあります。私が普段使用している簡単バックアップのbashのシェルを紹介します。

#!/bin/bash
BACKUP_NAME=`date '+%y%m%d.tar.bz2'`
BACKUP_DIR=/home/backup/
BACKUP_FILE=/var/www

cd $BACKUP_DIR
tar cvfj $BACKUP_NAME $BACKUP_FILE
find $BACKDUP_DIR -type f -daystart -mtime +15 -follow |xargs /bin/rm -f

上記例では、ホームページ領域の/var/wwwをtarで固めてBACKUP_DIRで指定したディレクトリ/home/backupにバックアップしています。tarファイル名は、バックアップ時の年月日としています。

これを毎日cronで実行してあげればよいのですが、このままだといつかはディスクが足らなくなってしまうので、最後のfindで/home/backup内の15日以上古いファイルは削除するようにしています。

今回はtarで、あるディレクトリをまるごと固めていますが、tarではなくcpでファイルをコピーしたり、データベースをバックアップするコマンドをたたいたりすることでいろいろと対応できます。

インストールしているFirefox3の拡張機能

Firefox3に追加している拡張機能一覧のメモです。 (Extension List Dumperで出力して、一部編集)

FoxmarksでXMLパースエラー@Firefox3 on WinXP

Firefox3はリリース日にダウンロードして、インストールまでしてたのですが、各種プラグインが対応していなかったので敬遠してましたが、やっと重い腰をあげてメインのブラウザをFirefox2から変更しました。というのも、Firefox2で使用していたGoogleのブックマーク同期プラグインが、Firefox3に対応しておらず、さらにサービスも停止してしまうからです。

Firefox3ではFoxmarksという 同期ツールを使用することにしました。Googleのプラグインでは必ずGoogleにブックマークをアップロードする仕組みで、暗号化されているとしても自分のプライベートな情報をアップロードするのはどうも良い気分がしていませんでしたが、Foxmarksは自宅のFTPサーバやHTTP, HTTPSのWebDAVサーバに置くことができるので選択しました。

さっそくFoxmarksプラグインをインストールし、Firefoxを再起動。再起動後、Foxmarksのセットアップダイアログが出てきますが、自宅のサーバを使用するためここはひとまずキャンセルします。

その後、ツールバーの ツール→Foxmarks→設定 をクリックして設定画面を開こうとするとXMLパースエラーなるものが出現。調べてみたところ、日本語版のFIrefox3に対応していなかったようで、以下のようにすることで回避できました。

C\\Documents and Settings\\{ユーザ名}\\Application Data\\Mozilla\\Firefox\\Profiles\\{ランダムな値}.default\\extensions\\[email protected]\\chrome\\chromeFiles\\locale\\ja-JP\\foxmarks.dtd
を
C:\\Documents and Settings\\{ユーザ名}\\Application Data\\Mozilla\\Firefox\\Profiles\\{ランダムな値}.default\\extensions\\[email protected]\\chrome\\chromeFiles\\locale\\ja\\foxmarks.dtd
に上書き

あとは、Firefoxを再起動し、Foxmarksの設定画面の詳細で自分のサーバを使用にチェックし、アップロード先(ファイル名まで指定)することで、無事アップロード完了しました。

VLANの設定@Cisco Catalyst 2960

VLANの設定方法についての覚え書き。

まずは、新しいVLANの作成

sw# configure terminal
sw(config)# vlan 100             ← VLANのIDを指定
sw(config-vlan)# name vlan100    ← VLANの名前を指定
sw(config-vlan)# end

インタフェースにVLANを割り当て。ここではポート1をVLAN ID 100に割り当ててます。

sw# configure terminal
sw(config)# interface Gigabitethernet 0/1   ←ポート1の設定モードへ
sw(config-if)# switchport mode access       ←ポートのモードはaccessにする
sw(config-if)# switchport access vlan 100   ←vlan id は100に割り当て
sw(config-if)# end
sw# copy running-config startup config      ←設定を保存します

複数のポートを設定するには、ポートの範囲を指定できます。

sw#interface range Gigabitehernet [0/2 - 0/8]

switchpori以降のコマンドは同じです。

参考 : http://www.cisco.com/japanese/warp/public/3/jp/service/manual_j/sw/cat29/2960cg3/chapter12/8603_01_12.shtml

googleマップが凄い!!

とうとうgoogleマップのストリートビュー(street view)の日本版がアップロードされました。東京や大阪など主要都市がメインのようですが凄すぎます。

自分の住んでるマンションもはっきりと写っています。googleの車を見たことあるので、私もどこかに写ってるかもしれません。ここまではっきりと写ると恐いです。

screenコマンド@cygwin with ck

cygwinのターミナルck上でscreenを使用しようとすると、デタッチ後にアタッチができません。これはCYGWINという変数にttyをセットすることで解決できるようで、通常ならばマイコンピュータのプロパティから変数を追加してあげればできますが、ckを使用していると上書きされてしまいます。

これはckがホームディレクトリの.ck.config.jsで設定されているからです。なのでこのファイルの最初で定義されている

app.Env("CYGWIN") = "nontsec";

のnontsecをttyに変更して、ckを再起動すれば使えるようになりました。しかし、一度ckのWindowを閉じてしまうと、アタッチができないようです。

==追記 2008/8/16 ==

screenコマンド上で日本語が表示されません。 ~/.screenrcに

defencoding SJIS

を記述してあげましょう

==追記 2009/4/9 ==

screenを叩くと.bashrcが読み込まれません。psで見るとbashではなくshが立ち上がっていました。ということで、bashを立ち上げるために、~/.screenrcに以下を記述してあげましょう。

shell /bin/bash

bashでの配列操作

あまりbashの配列操作を書くことがないから覚え書き。

定義方法は "変数名=(内容をスペース区切り)" です。

my_array=(a b c d)

もちろん各々の要素に個別に代入することも可能です。

my_array[0]=a
my_array[1]=b
my_array[2]=c
my_array[3]=d

配列の全要素を取り出すには@を使用。

for i in ${my_array[@]}; do
        echo $i;
done

ちなみにbashの配列はexportできないので、注意が必要です。

bashで配列のエクスポートができない@bash 3.2

SD経由で着信音にする方法

通常、SDカード経由で携帯に3gpファイルをコピーした場合、着信音やアラーム音にすることはできず、したい場合はdocomoにパケ代を払ってiモードでダウンロードしないといけません。

しかしこのiアプリを使って転送すればiモードで取得したのと同じになるらしく、パケ代なしで着信音にすることができました。パケホーダイ契約していないと、3gpファイルのiモード転送は思った以上に高額になるので便利です。

作者さんに感謝です。

追記 DojaのAPI - MovieStore.addEntry()は大きなファイルを携帯に登録できないようです。なので、iアプリを使っても着うたフルのような大きなファイルは転送できません。3gpサイズはおそらく最大500KB?で、一度に遅れるサイズは3MBぐらいかな。

iモーションのエクスポート属性と着信音について@SH906i

iモーションを自作の着うたにする場合に、エクスポート属性をつけた場合とつけない場合の挙動についてのメモ書き。

エクスポート属性をつけないとSDカードに移動する際、移行可能コンテンツに移動され本体に再度インポートした際iモードのフォルダに移動され着信音として使用できます。しかし、もちろんエクスポート属性がないため、他の端末などにコピーすることはできません。

エクスポート属性をつけて本体にダウンロードすると、着信音として使用できます。しかしSDカードの移行可能コンテンツに移動するこ とはできず、SDカードのマルチメディアのフォルダに移動orコピーになります。これを再度本体に移動しても、iモードのフォルダに入れることができず着 信音として使用できません。よって、せっかくダウンロードしても一度SDカードに移してしまうと着信音として使えなくなるので注意が必要。なぜこんな仕様なんだろ。

perlのCPANでモジュールをインストール@Debian Etch

CPANにはperlのモジュールが多数登録されています。これをインストールする方法の覚え書きです。

初めて起動した時は初期設定が立ち上がります。

# perl -MCPAN -e shell
・・・・・

最初にマニュアル設定しますかと聞かれるので、noにしたところ、後のモジュールインストールでサイト接続エラーになってしまうので、接続先URLを手動で設定します。Debian Etchは/etc/perl/CPAN/Config.pm で設定します。接続先はここから適当に選びました。

  'urllist' => [],
      ↓
  'urllist' => qhttp://ftp.riken.jp/lang/CPAN/,

あとは、目的のモジュールをインストール。

# perl -MCPAN -e shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan>

目的のモジュールを指定

cpan>install モジュール名

メール 110番での警察通報先一覧

※このページのコメント欄に通報内容を書き込んでも通報できません。ご注意ください。

音声通話のできない障害者や、電話がかけられない状況、電池切れで音声発信できない時などメールやWebページ上で警察に110番できると便利ですよね。そこで調べて見たところ、県によって通知方法はばらばら、携帯からしか通知できなかったり、または通知できない県さえありますので、通知できない県の場合で緊急の場合は、隣の県の警察宛に送ってみてもよいのではないでしょうか。もちろんその時は他の県からの通報である旨を記載することをお勧めします。

音声通話の110番のように、メール110番も全国共通のシステムにして欲しいものです そんなに難しいシステムではないので検討してみてはいかがでしょうか > 警察庁および各都道府県警の皆様

困っている人の何かのお役に立てればと思い、以下に調べた結果を参考までに載せておきます。参考でFAXも記載しています(一部)。

メール作成のポイントは以下の通りです。(滋賀県警のWebページより引用)

  1. 「何がありましたか?」・・・・・・交通事故、窃盗事件、喧嘩等
  2. 「いつ、場所はどこ?」・・・・・・時間、場所(近くの目標物)
  3. 「どんな事件・事故」?・・・・・・ケガをされた人の数や状態、事件・事故の概要
  4. 「犯人は?」・・・・・・・・・・・・・・人数や特徴、逃走車両の種別やナンバー、色、逃走方向
  5. 「あなたのお名前は?」・・・・・住所、氏名、連絡先、事件、事故との関係

常時更新しているわけではないので、通報先が変わっていたらごめんなさい。連絡頂ければ修正します。 ※通常の110番と同様に扱われると思います。決していたずらでメールを送らないでください。いたずらで送って罰せられてもmaznは責任を負いません。

都道府県 通報先 参考ページ
北海道 携帯からのみ?
青森県 http://www.police.pref.aomori.jp/i/mail110/mail110.htm
岩手県 http://www2.pref.iwate.jp/~hp0802/oshirase/tsuushinshirei/110ban/kakekata.html
宮城県 [email protected]
秋田県 [email protected]. akita.jp
山形県 http://www.yamagata110.jp/ 0120-110-289 (FAX)
福島県 [email protected]
茨城県 http://ibaraki110.jp/
栃木県 m110.tochigi.police■●▲★aioros.ocn.ne.jp (■●▲★を@に置き換えてください。)
群馬県 非公開 0120-578-110(FAX)
埼玉県 http://saitama110.jp/index.html
千葉県 http://chiba110.jp/
東京都 http://mpd110.jp/
神奈川県 http://www.kanagawa110.jp/
新潟県 http://niigata110.jp/
富山県 メール110番アプリ http://police.pref.toyama.jp/cms_cat_police/102050/kj00021670.html
石川県 非公開 075-225-0303(FAX)
福井県 緊急用はなし?
山梨県 [email protected]
長野県
岐阜県 https://www.gifu110.jp/pc/[email protected]
静岡県
愛知県 http://www.ap-web110.jp/
三重県 http://mie110.jp/ 059-229-0110(FAX)
滋賀県 [email protected]事前に[email protected]に空メールを送信するとフォームを受信できる
京都府 http://kyoto110.jp/
大阪府 [email protected]
兵庫県 http://hyogo110.jp/
奈良県 [email protected]
和歌山県 [email protected]
鳥取県 [email protected]
島根県 http://shimane110.jp/
岡山県 [email protected] または http://homepage3.nifty.com/ok110/110.html
広島県 [email protected] 0120-110-842 (FAX)
山口県  http://yamaguchi110.jp/
徳島県 http://toku110.jp/cgi-local/i_t/tselector.cgi
香川県 [email protected]
愛媛県 [email protected]
高知県 http://780-dlmail110.jp/
福岡県  [email protected]
佐賀県 [email protected]
長崎県 http://nagasaki-police110.jp/
熊本県 [email protected]
大分県 [email protected]
宮崎県 http://miyazaki110.jp/
鹿児島県 [email protected]
沖縄県 一般公開なし

iptablesでポートフォワーディング

iptablesでポートフォワーディングを設定する方法の紹介です。なお設定はCentOSで試しました。

まずは、通常Linuxのデフォルトはパケットのフォワーディングが無効になっているので有効にします。

# echo 1 > /proc/sys/net/ip_forward

これはOSを再起動すると戻ってしまうため、恒久的に有効にするには/etc/sysctl.confに以下を追記します。

 net.ipv4.ip_forward=1

ここでは、SSHのフォワーディングを例に説明します。以下のようなサーバ・ネットワーク構成だとします。

接続元端末     10.1.1.200
    ↓
設定対象サーバ  10.1.1.1
               192.168.0.1
    ↓
SSHサーバ      192.168.0.2

まずは端末から対象サーバに入ってくるパケットをSSHサーバにDNATでフォワーディングします。待ち受けポートは5555とします。

# iptables -t nat -A PREROUTING -p tcp --dst 10.1.1.1 --dport 5555 -j DNAT --to-destination 192.168.0.2:22

上記では、パケットの宛先が設定対象サーバ(--dst 10.1.1.1)で、宛先ポートが5555 (--dport 5555)ならば、パケットの宛先を 192.168.0.2:22 に書き換えろという意味になります。

この時、パケットの送信元IP(ソースIP)は、10.1.1.200 のままです。そのためSSHサーバがこのパケット受け取ったら、10.1.1.200へ応答を返そうとします。SSHサーバは10.1.1.xx のネットワークに繋がっていないため、10.1.1.xx に直接応答を返すことができません。そのためSSHサーバに設定されているデフォルトゲートウェイに応答パケットの転送を依頼することになります。つまりSSHサーバのデフォルトゲートウェイが設定対象サーバになっていれば、応答パケットは設定対象サーバ経由で流れていきます。

SSHサーバのデフォルトゲートウェイが設定対象サーバになっていない場合や、接続元端末とSSHサーバが同一のセグメントにある場合、応答パケットが設定対象サーバを経由しないためうまく動きません。この場合以下の設定をiptablesに追加し、SSHサーバに出て行くパケットの送信元IPを設定対象サーバのIPに書き換えます。

# iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.2 --dport 22 -j SNAT --to-source 192.168.0.2

設定対象サーバに戻ってきたパケットは自動的に逆DNATされるため、以上で正常に動くはずです。

参考 : http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/output/dnattarget.html

SVNのシンボリックリンク?

SVNでソースを管理している時、ある他のリポジトリで管理されているライブラリを参照したくなる時があります。参照したい時にsvn checkoutすればよいかもしれませんが、ライブラリも随時アップデートされるような環境の場合、毎回checkoutやupdateするのは面倒です。そこでシンボリックのように、あたかもシンボリックリンクのようにあたかも自分のリポジトリに存在しているように設定することができます。

設定は簡単で、現在svnは以下のような構造になっているとします。

pj-
  |--tool
  |--config
  |--libs
    |--mylib

これを以下のようにしたいとします。

pj-
  |--tool
  |--config
  |--libs
    |--mylib
    |--otherlib --> svn://otherrepos.net/libs

これを作るには、まず自分の作業用のリポジトリに移動して

# svn propedit svn:externals libs

ここでsvnに設定されているエディタが起動されます。起動しない場合は環境変数SVN_EDITORを設定してください。エディタが起動されれば、以下のように記述します。

otherlib svn://otherrepos.net/libs

以上で設定完了です。commitしてください。otherlibというディレクトリを作る必要はありません。

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ