DiaryException このページをアンテナに追加 RSSフィード

2010-12-11(土)

[]ファイルシステム監視システム: inotify

Dropboxを使っていると、指定ディレクトリ以下に含まれるファイル更新(作成、削除、編集)される度にDropboxを通して複数のファイルシステムで同期される。各PCインストールされたDropboxデスクトップソフトファイルシステム監視しているらしい。

Linuxだと、inotifyを使うことによって、ファイル監視アプリケーションを作ることが出来る。Ubuntuだと、aptにlibinotifyとかinotify-toolsというものがあるので、それらをインストールすれば良い。

inotify-toolsをインストールすると、inotifywaitとinotifywatchというコマンドインストールされる。inotifywaitは指定ディレクトリ(指定を省略するとコマンドを実行したディレクトリ)内のファイル監視する。inotifywatchは指定ディレクトリ内のファイル監視した統計コマンドを終了した時に出力する。Dropboxの様に、ファイル監視更新の度に何かするには、inotifywaitを使う。

$ inotifywait -m -r TARGET_DIR  # -m = --monitor, -r = --recursive
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

## ls
TARGET_DIR/ OPEN,ISDIR
TARGET_DIR/ CLOSE_NOWRITE,CLOSE,ISDIR

## touch test
TARGET_DIR/ CREATE test
TARGET_DIR/ OPEN test
TARGET_DIR/ ATTRIB test
TARGET_DIR/ CLOSE_WRITE,CLOSE test

## cat test
TARGET_DIR/ OPEN test
TARGET_DIR/ CLOSE_NOWRITE,CLOSE test

## echo "this is a statement" >> test
TARGET_DIR/ OPEN test
TARGET_DIR/ MODIFY test
TARGET_DIR/ CLOSE_WRITE,CLOSE test

## mv test test1
TARGET_DIR/ MOVED_FROM test
TARGET_DIR/ MOVED_TO test1

## cp test1 test
TARGET_DIR/ OPEN test1
TARGET_DIR/ CREATE test
TARGET_DIR/ OPEN test
TARGET_DIR/ CLOSE_WRITE,CLOSE test
TARGET_DIR/ CLOSE_NOWRITE,CLOSE test1

## rm test
TARGET_DIR/ DELETE test

出力をCSV書式にするにはオプションに"-c"を加える。

$ inotifywait -c -m -r TARGET_DIR/

## ls
TARGET_DIR/,"OPEN,ISDIR",
TARGET_DIR/,"CLOSE_NOWRITE,CLOSE,ISDIR",

## touch test
TARGET_DIR/,CREATE,test
TARGET_DIR/,OPEN,test
TARGET_DIR/,ATTRIB,test
TARGET_DIR/,"CLOSE_WRITE,CLOSE",test

## rm test
TARGET_DIR/,DELETE,test

出力書式をもっといじるなら、"--format"と"--timefmt"オプションを使う。

$ inotifywait --format "%T %e %w%f" --timefmt "%Y-%m-%d %H:%M" -m -r TARGET_DIR/
2010-12-11 13:32 DELETE TARGET_DIR/test1

libinotifyをPythonから使うなら、python-pyinotifyというパッケージaptにあるのでインストールする。ライブラリ名はpyinotifyである。中身はctypesによるlibinotifyのラッパになっている。

pyinotifyを使ったコードを書けば、ファイルシステムイベント毎に何かさせることが出来る。例えばデスクトップ通知を出したりファイルを処理して何か出力したり

$ python pyinotify_test.py

## touch test1
create  /home/saeki/TARGET_DIR/test1

## rm test1
delete  /home/saeki/TARGET_DIR/test1

MacだとKqueueFSEventsを使えばinotifyと似たことが出来るようだが、簡単に使うためのツールは見つからなかった。

2010-11-13(土)

[][]Mac環境Ubuntu環境におけるデスクトップ通知

デスクトップ通知とは、デスクトップで全てのアプリケーションより上のレイヤバルーンあるいはポップアップの形式でメッセージを表示するものを指す。

結果の出力に時間のかかるプログラムを端末で動かしている場合など、プログラムを動かしている端末から目を離したい場合が時々ある。しかし、プログラムエラーにより落ちたり、あるいは正常に終了した場合に、端末から目を離していてはすぐに対応することが出来ない。

そこで、プログラムからデスクトップ通知を用いることで、全てのアプリケーションより上のレイヤに任意のメッセージを表示することが出来るので、プログラムの挙動に対しすぐに対応することが出来る。

Mac環境デスクトップ通知: Growl

Macデスクトップ通知と言えばGrowlがある。

AppleScriptによるGrowlによるデスクトップ通知を出すプログラムは以下のようになる。

tell application "GrowlHelperApp"
	register as application "GrowlTest" all notifications {"Error", "Info"} default notifications {"Info"} icon of application "Script Editor.app"
	-- アプリケーションのアイコン指定の他、画像ファイルの指定も可
	notify with name "Info" title "This is a Title" description "This is a Description" application name "GrowlTest"
end tell

f:id:LaclefYoshi:20101113173221p:image

Growl SDKパッケージを開き、Bindings/Pythonディレクトリに、Pythonで用いるためのGrowlライブラリがあるのでインストールするとPythonプログラムからGrowlによるデスクトップ通知を出すことが出来る。

import Growl
g = Growl.GrowlNotifier(applicationName='GrowlTest',
                        notifications=['Info', 'Error'])
g.register()

imagePath = "/Applications/R.app/Contents/Resources/RLogo.png"
iconfile = Growl.Image.imageFromPath(imagePath)
g.notify(noteType='Info',
         title='GrowlTest',
         description='This is a Description.',
         icon=iconfile,
         sticky=False)

f:id:LaclefYoshi:20101113173222p:image

Growlネットワークを通してリモートマシンデスクトップ通知を送ることが出来る(404 Not Found)。このプロトコルを用いたアプリケーションには、Growlパッケージに含まれているgrowlnotifyがある(growlnotifyはネットワーク経由でないデスクトップ通知も可能)。

$ growlnotify -m "This is a Message" -u -H "localhost"

f:id:LaclefYoshi:20101113175234p:image

ネットワーク経由の通知の場合アイコンの設定は出来ない。

growlnotifyで-n(--name)オプションを設定しない場合デフォルト名前:growlnotifyが用いられるためデスクトップ通知が表示される。独自の名前ネットワーク経由の通知で設定する場合、予め、Growlの設定からリモートアプリケーション登録を許可」し、パスワードを設定する必要がある。そして、growlnotifyでその独自の名前を用いる場合には、パスワードを-P(--password)オプションを設定する。リモートアプリケーション登録を許可しない場合、独自の名前を用いた通知は無視される。

PythonGrowlライブラリでもネットワーク経由のデスクトップ通知を行うことが出来る。

import Growl

ui = {'ApplicationName': 'growlnotify',
      'NotificationDescription': 'This is a Description',
      'AllNotifications': ['Command-Line Growl Notification'],
      'DefaultNotifications': [0],
      'NotificationName': 'Command-Line Growl Notification',
      'NotificationTitle': 'This is a Title'}

n = Growl.netgrowl("localhost", None)
# リモートアプリケーション登録を許可している場合、あるいは登録済みのリモートアプリケーション名を用いる場合、パスワードを入れる

# n.PostRegistration(ui)  # リモートアプリケーション登録をする
n.PostNotification(ui)

f:id:LaclefYoshi:20101113173223p:image

ネットワーク経由の通知はUDPパケットを送るだけなので、Growlライブラリを用いる必要はない。Growlライブラリ内のGrowl.pyからnetgrowlクラス辺りをプログラムコピペしても使える。

Ubuntu環境デスクトップ通知: xmessageとNotifyOSD

Ubuntuに限らず、X11環境インストールされている環境では、xmessageコマンドを用いることが出来る。

$ xmessage -button '' -timeout 2 "This is a short Message"

f:id:LaclefYoshi:20101113184225p:image

Ubuntuでのデスクトップ通知は、標準でNotifyOSDという機能が搭載されている。libnotify-binパッケージインストールすると、notify-sendというコマンドが使える。

$ notify-send -i /usr/share/icons/application-default-icon.png "This is a Summary" "This is a Body"

f:id:LaclefYoshi:20101113185003p:image

python-pynotifyパッケージインストールすると、PythonプログラムからNotifyOSDによるデスクトップ通知を出すことが出来る。

import pynotify
pynotify.init("My Application")
n = pynotify.Notification("This is a Title",
                          "This is a Description",
                          "/usr/share/icons/application-default-icon.png")
n.show()

f:id:LaclefYoshi:20101113173224p:image

NotifyOSDではネットワーク経由のデスクトップ通知は出来ないようだ。

2010-02-11(木) 時々雨、時々雪。

[]mltermでフォント混在表示

今までは、aafontで全てVLゴシックを指定して、コードも日本語文章も表示していた。

# ~/.mlterm/aafont
ISO8859_1               = VL Gothic-iso8859-1:100;
JISX0201_KATA           = VL Gothic-jisx0201.1976-0:100;
JISX0201_ROMAN          = VL Gothic-jisx0201.1976-0:100;
JISX0208_1983           = VL Gothic-jisx0208.1983-0:100;

f:id:LaclefYoshi:20100211114138p:image

VLゴシックの英字にはM+が使われていて、まあcoO0Il1辺りはすぐ区別出来たし、.,もそれなりに可読性が高かったので、長く使っていたのだけれど、最近、Anonymous(Anonymous Pro)というコーディング用フォントを知り、なかなか見易そうだったので、使ってみることにした。

mltermは、US_ASCIIの表示にISO8859-1フォントを使うオプションがあり、それを使った。

# ~/.mlterm/aafont
ISO8859_1               = Anonymous Pro-iso8859-1:100;
JISX0201_KATA           = VL Gothic-jisx0201.1976-0:100;
JISX0201_ROMAN          = VL Gothic-jisx0201.1976-0:100;
JISX0208_1983           = VL Gothic-jisx0208.1983-0:100;
# ~/.mlterm/main
iso88591_font_for_usascii=true
line_space = 1

f:id:LaclefYoshi:20100211114139p:image

全体的に横幅が広くなり、行間が狭くなった。ちょっと狭過ぎだったので、mainで行間に1ピクセル入れた。それでも、VLゴシックに比べ1画面に収まる行数は増えている。俯瞰出来る行数が増え、1字の横幅が広くなったことで1行に長いコードを書く癖を押さえられる。

Tなどの横棒端の髭で好みが分かれそうなところだが、暫く使ってみて割と気に入っている。

2009-12-15(火) 寒い寒い。

[]screenのhardstatus alwayslastlineにIPアドレスを表示する

パソコンを同時に2台くらい使っていると、あるパソコンから別のパソコンにSSHで繋いだりファイル転送したりしたくなる時がある。

その度に、/sbin/ifconfig でinetアドレスを確認するのも面倒なので、screenのhardstatus alwayslastlineに常時表示させておくことにする。

試しに、Pythonで出来るか。

>>> import socket
>>> socket.gethostbyname(socket.gethostname())
'127.0.1.1'

知ってるよ!

と、横着は出来ないようで、 get the IP address associated with a network interface (linux only) « Python recipes « ActiveState Code とか ページがみつかりません | Weboo! Returns. の様にする必要がある。

ifconfigの出力を加工した方が(見た目が)楽だ。ifconfigの出力から、inetという単語が含まれる行をgrepで選んで、awkでIPアドレス部を取る。

#!/bin/sh
/sbin/ifconfig|grep "inet[^6]"|grep -v "127.0.0.1"|awk '{print $1}'|awk -F: '{ print $2 }'|tail -n 1

MacなどのBSD系だともうちょっと短く書ける。

#!/bin/sh
/sbin/ifconfig|grep "inet[^6]"|grep -v "127.0.0.1"|awk '{print $2}'|tail -n 1

ネットワークインタフェースが複数あると、それぞれのIPアドレスが出てくるので、ここは横着して、最後の行のネットワークインタフェースのIPアドレスを取っている。

$ ./printip.sh
172.20.6.12

これをscreenに表示させるために、backtickに登録する。

backtick 1 3600 3600 $HOME/.local/bin/printip.sh
hardstatus alwayslastline "(略) $USER@%1` (略)"

とすれば、username@IPアドレス がscreenに常時表示される。

f:id:LaclefYoshi:20091215135320p:image

2007-04-10(火) 『LET IT BE』発売。

[]友達ヒドス

何が酷いって、友達を「訴えられるぞ」と煽っておいて、ソースも出さず逃げ、結果友達をこんな相談所に投稿させるまで追い込んだのだから

世の中なんだってヤバイものになり得るって事ですよ。「タダ」は往々にして白っぽいグレー。

2006-08-18(金) 晴れ。遂に洗濯出来た。

[][]モバイルLinux

一般ユーザでここまで大きくなっている携帯電話産業で、「Linux搭載だから凄い」なんて言っても意味が無いと思う。自分の携帯電話のOSすら知らない人がほとんどだろうし。それよりも見た目重視、が携帯産業の流れ。

とは言っても組み込み系でも浸透してきたLinux。携帯電話のOSとして安定すれば、よりモバイル機器として使える可能性が大きくなるだろう。Skype搭載したり。

今の携帯電話のソフトウェアで一番不満な事は、メールやブックマークの検索が出来ない事。今、僕の携帯電話の受信メールBOXに入っているメールは860通、送信メールBOXに入っているメールは98通。こんなに保存できるのに、検索出来ないというのはソフトウェアとして非常に問題がある。

もう少し、携帯電話の中身もオープンになったら良いのに。アプリが作れると言っても、物凄い制限の下でだから、気持ち悪い。

2006-05-02(火) 雨。ズボンがいつも濡れる。

[][]使えそうなツール

今月の『TUX』より、面白そうなツールを幾つか抜粋。

DTPソフト。KNOPPIXに標準で入っていたと思う。PDFで出力可能など機能豊富で使い勝手も悪くない。

マインドマップ作成ツール。画像処理ソフトを使っても出来ないことは無いが、ノードの管理などマインドマップに必要な機能は備えてないので、本格的にマインドマップを作るなら専用ソフトが必要。

プロジェクト管理ツール。ガントチャート、タスク管理、リソース管理。複数人によるプロジェクトには必須。僕にはまだ必要ない様だけれど。

VoIPクライアント。Skypeの独壇場かと思ったらそうでもない。Firefoxの拡張機能として使える。ビデオチャット可能。そうか、こうすればマルチプラットフォーム対応になるんだ。

2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |