미나와 저에 대한 소문의 해명

이전 블로그 글 에서 복잡한 감정을 드러낸 이후 미나와 저에 대한 여러 소문을 들을 수 있었습니다. 개인적으로 연락을 받아 소통하기도 하였지만, 점점 더 많은 사람들이 이 문제에 대해 관심을 보이고 있는 듯 합니다. 따라서 일이 어떻게 돌아가고 있는지 알려드리고자 합니다.
시작하기 전에 이전 글로 인해 기분이 상하신 분이 계셨다면 사과의 말씀을 드리고 싶습니다. 미나 PMC가 좀 더 일찍 도움을 청했더라면, 아마도 우리는 이 지경에 이르기 전에 문제를 해결했을 지도 모르겠습니다. 또한 다양한 채널을 통해 깊이있는 조언을 해 주신 분들께도 감사드리고 싶습니다.
의장직을 매년 돌아가면서 맡기로 한 미나 PMC의 원래 계획에 따라, Peter Royal이 미나 프로젝트의 새 의장이 될 예정입니다. 28일에 제 사퇴가 받아들여지면 또한 미나 PMC에서 스스로 탈퇴할 예정입니다. 그렇습니다. 저는 미나 프로젝트를 떠납니다. 물론 이것은 제가 아파치 소프트웨어 재단을 떠난다는 이야기는 아닙니다. 준비되었다고 느낄 때 다시 돌아올 것입니다.
현재, 저는 개인적으로 새 네트워크 어플리케이션 프레임워크를 만들고 있습니다. 이 프레임워크는 네티 2의 후속 프로젝트이고, 하이버네이트 팀이 LGPL을 선택한 이유와 같은 이유로 LGPL이 적용되어 있습니다. 다른 프로젝트를 포크하지 않고 처음부터 다시 작성했습니다. 향후에 JIRA, FishEye, Hudson 및 더 나은 사이트 디자인과 같은 장점을 누리기 위해 JBoss.org에 호스팅될 가능성도 있습니다.
이 글에서 꽤 많은 질문들에 대해 답했길 바라며, 질문이 더 있으면 자유로이 연락 주시길 바랍니다.

So Long, MINA!

Before I begin, I’d like to admit I learned a lot of great things and met many nice people in the foundation. It was an exceptional experience for me to make MINA one of the world’s best network application frameworks. I believe MINA was a good example which has shown how great project the Apache way can create.

There were several arguments (flamewar, dispute or whatever you call) in the MINA community recently. Those arguments took place in the MINA private mailing list mostly. However, the internal disharmony got a breakout finally. There were also subsequent IRC chat and blog post which gave more public exposure. Let me add another now. It’s not something which can be slienced by saying ‘LET IT DIE.’ with a high hand and private chat anymore.

Someone seem to find the underlying cause of this issue is just because I was an employee of Alex Karasulu. However, that’s not the sole issue – if you believe so, it just means that you are too simplistic. Although I had tough time dealing with him while I work with him, it’s not something that makes me sick of this situation. So, let me talk about what make me sick actually.

First, I hate people keep telling me that I have to thank and respect someone because they helped me join the Apache Software Foundation and make MINA promoted to be a top level project, or I would be still toying with Netty in the corner of the Internet. It is a direct insult to many individuals including me who run or ran great personal open source software projects.

Second, I hate people veto my hard work prematurely because of a stupid reason. I understand we are collaborating with each other and collaboration has pros and cons. Therefore, the slowdown of a collaborative project is absolutely OK to me and it’s expected. Everybody has his or her opinion and each other’s technical points should be reviewed properly. However, what’s happening in the MINA community now is far from that. Especially, the recent arguments on JavaDoc tags and volatile keyword are good examples of stupid arguments.

Third, I hate people who say just like there’s something going on in secret among Red Hat employees, which is plain wrong. There’s no such organized move that those conspiracy theory believers imagine. Sure, I shared my complaints with my colleagues, but it’s stupid exaggeration if it’s considered to be an attempt to control the project. Red Hat employees are seriously asked to behave ethically when we get involved into an open source project so that the project grow up as sustainable and healthy as possible, instead of taking an immediate advantage.

Fourth, I hate people degrades (or misinterprets) that MINA is a one man show project and that one man show (or lack of proper documentation?) prevents people from getting involved into the project. It’s true that I wrote pretty much chunk of MINA code by myself. However, it was because many great active contributors were with me – Peter Royal, Niklas Therning, Julien Vermillard, Mike Heath, Vinod Panicker, Rich Dougherty, Daniel Wirtz and many more committers and patch submitters. Please note some of them were once loyal Netty users. Were they able to join the project just because they were freaking genius that they can catch up the moving target? Hell no! The documentation and my communication skill sucked much more at that time. It’s because they shared the vision of the project and had strong will to contribute to the project, instead of complaints and vetos with no sustainable and sound suggestion. Therefore, keep saying ‘one man show’ is also a direct insult to all contributors including me, of course excluding those who are causing the trouble. Also, it’s a lame excuse that people can’t contribute enough because of lack of documentation.

A few weeks ago, I thought about forking MINA seriously because of the reasons above. However, I kicked that idea out of my mind quickly because I had strong belief that there are many silent yet nice people in the community who supports MINA.

Now? My hope for MINA is pretty much dead because of a few loud noise makers. I’m fed up with dealing with unnecessary arguments. Whatever you say, I did my best and don’t want to let myself hurt both mentally and physically anymore. I think it’s good time to go back to the calm corner of the Internet they underestimate.

여기는 샌프란시스코 자바원 2008

생각보다 외국 나갈 일이 잦다. 이번에는 자바원 2008 발표 겸 아내와의 결혼 1주년 기념 겸 해서 샌프란시스코에 왔다. 잊어버리기 전에 몇 가지 적어 둘까 한다.

샌디에고나 올랜도와 마찬가지로 샌프란시스코는 대체적으로 넓직넓직하다. 건물도 크고 길도 넓다. 뉴샤텔이 가진 아기자기함은 없지만 느껴지는 여유는 뉴샤텔 못지 않은 듯 하다. 하지만 노숙자들이 많아서 알 수 없는 이유로 찔린다.

자바원 역시 최대의 자바 컨퍼런스답게 그 규모가 상상 이상으로 컸다. 하지만 여기 저기 돌아다니는 험상굳은 경비원들과 경비견들은 뭔가 이 곳과는 어울리지 않는 느낌이다. NIO.2의 Alan Bateman, Grizzly의 Jean-Francois Arcand, Jetty의 Greg Wilkins 등과 함께 점심 식사를 같이 하며 NIO.2 및 네트워크 어플리케이션 개발에 대한 아이디어를 주고 받았다. 특히 커넥션마다 버퍼를 두는 대신 스레드마다 버퍼를 두는 방식은 꽤 신선했다. 장기적으로 Grizzly 팀과 협력하여 더 나은 네트워크 어플리케이션 프레임워크를 만들었으면 하는 바램이 있는데, 라이선스 문제로 잘 될 지는 모르겠다.

하지만 그 무엇보다도 자바원에서 인상적이었던 경험은, 한 개발자가 나를 알아보고 MINA를 잘 쓰고 있다면서 사진 한 장 같이 찍어 줄 수 없겠냐고 한 일이다. 나도 드디어 팬이 생긴 건가? 기왕이면 사인도 해 달라고 했다면 감개무량의 극치를 달렸겠지만 내 능력상 거기까진 무리라고 본다. ㅋ

샌프란시스코는 의외로 그렇게 큰 도시는 아니라 걸어서 대부분의 장소를 돌아다닐 수 있었다. 아마 여기 와서 지금까지 15마일은 걸어다닌 것 같다. 지도가 있어도 나침반이 없으니 가끔은 반대 방향으로 길을 잘못 들어 한참을 헤매기도 했지만 이게 다 추억이 아닐까 생각해 본다. 페리도 타고, 금문교도 두 번이나 – 한 번은 걸어서, 한 번은 버스로 – 건너고, 거의 달동네 수준으로 가파른 소살리토와 노브힐도 기억에 남는다. 그나저나 차이나타운과 저팬타운의 분위기는 왜이렇게 대조적인지. 왜색에 꽤나 물들어 있는 우리 부부는 역시 저팬타운에서 아늑함을 느꼈다. 그 외에도 그레이스 성당도 규모나 스테인드 글래스, 벽화 등에서 아주 볼만했는데, 유럽 친구의 ‘유럽엔 그런게 하도 많아서’ 라는 말에 할 말을 잃고 말았다.

오늘은 선 측에서 제공하는 1시간짜리 일대일 프리젠테이션 스킬 교육을 받았다. 그냥 바로 프리젠테이션을 하면 몰랐겠지만 이렇게 교육을 받고 나니 발표를 위해 많은 준비가 필요하다고 느끼게 되었다. 생각해 보면 당연한 것들이지만 처음 받아보는 교육이라 신선했다. 반복되는 프리젠테이션에 지루함을 느끼고 있었는데, 발표 기술을 배워가면서 하는 발표라면 더 즐겁게 임할 수 있지 않을까? 그래서 내일은 아마도 발표 준비로 바쁠 듯 하다. 그리고 금요일은 대망의 발표.. 아마 잘 될 것 같다. 그냥 느낌이 좋다.

그나저나 이렇게 여기까지 와서 숙박하고 식사하는 비용만 기백만원이 들고 있는데 스폰서가 없으니 말그대로 알거지가 될 것 같은 예감이 든다. 그러면서도 이렇게 호사를 누리고 있으니, 그 여유가 우리 부부 스스로도 대견스럽지 않을 수 없다. ㅡㅡ;

Long technical IRC conversation

It’s been a long time ago since I took part in a technical IRC conversation. Today, a few core community members of the Apache MINA project got together in the IRC channel and discussed about providing a way to build an extremely high performance network applicatiion by providing means for zero-copy (close to zero copy to be strict). The discussion progressed purely from technical viewpoint and it was therefore a lot of pleasure for all of us.

Now, what’s remaining is to excute the agreed changes in a branch, review it and merge it back to the trunk. I think coding should be the easist part considering the length of the conversation we had today. 🙂

I was recently very sceptical about and fed up with too long conversation without quick action, but today’s conversation was an exciting experience all thanks to the participients – Emmanuel, Julien and David. Thanks guys, and I hope my proposal will satisfy all of you!

그 다음은 무엇이 되어야 좋을까?

Update: 아직은 조심스럽지만, 의외로 오해가 잘 풀려 계속해서 미나 프로젝트에 공헌할 수 있게 될 것 같습니다. 좀 더 기술적인 논의에 집중할 수 있게 되지 않을까 생각해 봅니다. 그래도 이젠 무엇이 되어야 좋을 지는 생각해 볼만한 문제가 아닌가 싶습니다.

세상엔 원치 않게 서로를 상처입히는 일이 많이 생긴다. 시간이 지나 그 모든 일들에 대한 기억이 희미해질 때가 오기만을 기다리게 된다. 또는 그 사람을 다시는 마주치지 않길 빌거나.

지난 몇 개월 동안 특정 한두 사람과 아파치 미나 프로젝트 관리 위원회 내부에서 다양한 갈등이 있었고, 그 결과 숙고 끝에 미나 프로젝트에 더 이상 참여하지 않기로 마음먹었다. 4년이라는 시간 동안 공들여 쌓아 온 프로젝트를 한 순간에 떠난다는 것이 어쩌면 섣부른 판단일 수 있겠다. 하지만 그만큼 이제는 좀 다른 뭔가를 만들어 볼 때가 온 것이 아닌가 생각이 든다.

물론 그 다른 뭔가는 아마 미나가 가진 근본적인 문제점을 해소한 네트워크 어플리케이션 프레임워크가 될테니, ‘다르다’ 라는 말은 어울리지 않을지 모르겠다. 하지만 긴 역사를 가진 프레임워크를 바꾸는 것보다는 근본적인 부분에서부터 다시 시작하는 것이 어쩌면 덜 피곤한 방법이 아닐까 싶다.

독재를 옹호하고 싶진 않다. 하지만 민주주의는 때때로 너무나 피곤하다. 물론 그들에겐 명백하게 느껴지겠지만, 이번 일이 내 잘못인지 그들의 잘못인지는 모호하다. 내성적인 성격 탓에 아직 협업 능력이 부족하기 때문인지도 모르겠다. 꼭 그렇다기 보다도, 그저 의욕적으로 무언가를 추진하고자 하는 시도가 계속해서 공격당할 때 나는 분노를 느낀다, 라고 표현하는 게 맞는 것 같다.

순수한 기술적 협업은 즐겁다. 미나를 하면서 가장 기뻤던 순간들은 그런 기술적 협업을 통한 더 높은 수준으로의 향상과 서로를 향한 인정이었다. 하지만 어느 한 쪽이 그 외의 무언가를 강요하기 시작하고 서로의 메시지를 감정적으로 해석하기 시작한 뒤로는 그 즐거움을 찾아볼 수 없게 되어버렸다. 나는 그 즐거움을 다시 느끼고 싶다. 하지만 미나 프로젝트에서는 이제 아니다.

한편으로는 지금까지 지나치게 빨리 야심가처럼 달려왔기 때문은 아닌가 싶다. 아파치 커미터, 탑레벨 프로젝트 승격, 프로젝트 관리 위원회 의장, 멤버, 그리고 풀 타임 오픈 소스 개발자. 그 다음은 무엇이 되어야 좋을까? 곰곰히 생각해 볼 시간이다.

PS: 한국인에 대한 미나 지원은 당분간 계속 할 예정이므로 직접 메일 주십시오.

Changing the default sound card automatically in Linux

Many people including me usually use a USB sound card or a USB speaker to enjoy noise-free high-fidelity sound. I simply don’t understand why all the main board manufacturers ship with a built-in sound chipset which just sucks. It’s not an exception for all laptops.

In a non-portable system such as a desktop PC, you usually don’t need to change your default sound card because your USB sound card is always connected. However, it’s a whole different story for a laptop computer. USB sound card is often disconnected and connected again. For example, I connected my USB speaker to the docking station. The expected behaviour is that the default sound card is chosen automatically – the sound system should be reconfigured so that my USB speaker becomes the default sound card when I dock to the docking station.

Currently, there’s no desktop environment that addresses this problem AFAIK, so I wrote a quick and dirty script file that reconfigures the sound system automatically when a new sound card is detected. The script assumes that you are running HAL and DBUS, which are very common in modern Linux distributions.

#!/bin/sh
# Path: /usr/local/bin/alsa-watch

# Exit if running already.
if [ "x`pgrep -of 'alsa-watch'`" != "x$" ]; then
  exit 1
fi

# Configure the sound card to the default.
/usr/local/bin/alsa-reconfigure

# Begin monitering.
{
dbus-monitor --system --monitor "type='signal',path='/org/freedesktop/Hal/Manager',interface='org.freedesktop.Hal.Manager'" | while read -r EVT; do
  echo "$EVT" | egrep -qi "(DeviceAdded|DeviceRemoved)"
  if [ "$?" = '0' ]; then
    read -r EVT_VAL
    echo "$EVT_VAL" | egrep -qi '(alsa_playback|sound_card)_[0-9]+"'
    if [ "$?" = '0' ]; then
      # Reconfigure the sound card if a sound card is plugged in or out.
      /usr/local/bin/alsa-reconfigure
    fi
  fi
done
} &

Another required script is alsa-reconfigure. The following is what I put into the alsa-reconfigure script. I reset the volume level here:

#!/bin/sh
# Path: /usr/local/bin/alsa-reconfigure
# Exit if there's no sound card.
[ -f /proc/asound/cards ] || exit 0
cat /proc/asound/cards | grep -qi 'no soundcard' && exit 0

# Prefer USB audio device to other sound cards.
cat /proc/asound/cards | grep -qi USB-Audio
if [ "$?" == "0" ]; then
  CARD=`cat /proc/asound/cards | grep USB-Audio | head -1 | perl -pi -e "s/\s*([0-9])+.*/\1/"`
  USB='y'
else
  CARD=`cat /proc/asound/cards | head -1 | perl -pi -e "s/\s*([0-9])+.*/\1/"`
  USB='n'
fi

# Update ALSA settings.
echo "pcm.foo {
  type dmix
  slave.pcm "hw:$CARD"
  ipc_key 1024
}

pcm.!default {
  type plug
  slave.pcm "foo"
}

ctl.!default {
  type hw
  card $CARD
}
" > /etc/asound.conf
chmod 644 /etc/asound.conf

# Reset the volume. (optional)
if [ "$USB" == 'y' ]; then
  amixer sset 'PCM' 80% > /dev/null 2>&1
else
  amixer sset 'Master' 30% > /dev/null 2>&1
fi

You could also do something different such as restarting PulseAudio daemon:

#!/bin/sh
# Path: /usr/local/bin/alsa-reconfigure
# Exit if there's no sound card.
[ -f /proc/asound/cards ] || exit 0
cat /proc/asound/cards | grep -qi 'no soundcard' && exit 0

# Prefer USB audio device to other sound cards.
cat /proc/asound/cards | grep -qi USB-Audio
if [ "$?" == "0" ]; then
  CARD=`cat /proc/asound/cards | grep USB-Audio | head -1 | perl -pi -e "s/\s*([0-9])+.*/\1/"`
else
  CARD=`cat /proc/asound/cards | head -1 | perl -pi -e "s/\s*([0-9])+.*/\1/"`
fi

# Update ALSA settings. (optional if your Linux distribution uses PulseAudio by default)
echo "pcm.!default {
  type pulse
}

ctl.!default {
  type pulse
}
" > /etc/asound.conf

pkill -f '(^|/)pulseaudio( |$)' > /dev/null 2>&1
sleep 1
pkill -9 -f '(^|/)pulseaudio( |$)' > /dev/null 2>&1

# Restart PulseAudio daemon
pulseaudio \
  --system --daemonize --high-priority --realtime --log-target=syslog \
  --disallow-module-loading --disallow-exit \
  --resample-method=src-sinc-best-quality --no-cpu-limit -n \
  -L "module-native-protocol-unix auth-anonymous=1" \
  -L "module-native-protocol-tcp auth-ip-acl=192.168.0.0/16;127.0.0.0/8" \
  -L "module-rescue-streams" \
  -L "module-alsa-sink device=hw:$CARD" \

I execute alsa-watch in my /etc/rc.local file and it works perfectly for me. 🙂

Switching from GNOME to XFCE 4.4

I recently switched from GNOME to XFCE + SLiM, which is more light-weight. I am very satisfied with XFCE because of smaller footprint and less unnecessary applications.

However, I have encountered a few small issues.

Problem with opening a URL from Thunderbird

Clicking a URL in Thunderbird doesn’t open a browser at all. I was able to find a solution here. The more elegant and XFCE-friendly solution is to place the following file into /usr/lib/mozilla-thunderbird/defaults/pref/:

# /usr/lib/mozilla-thunderbird-defaults/pref/xfce.js

user_pref("network.protocol-handler.app.http","/usr/bin/exo-open");
user_pref("network.protocol-handler.app.https","/usr/bin/exo-open");
user_pref("network.protocol-handler.app.ftp","/usr/bin/exo-open");

Evince still requires GNOME.

Evince is a great document viewer, but it depends on many GNOME libraries. Therefore, installing Evince again means that the complete switchover to XFCE doesn’t make a sense. Instead, I installed the official Adobe Acrobat Reader as an alternative. (epdfview was also an option, but it lacks some essential features.)

I use QtCurve theme for GTK2, KDE3 and 4. The problem is that acroread is still a 32-bit application, and there’s no libqtcurve.so in Gentoo emul-* packages. The result was working but ugly and inconsistent look.

To make acroread have the same look with other 64-bit GUI applications, I have set up chrooted Gentoo x86 installation, emerged gtk-engines-qtcurve there and copied the 32-bit libqtcurve.so into /usr/lib32/gtk-2.0/2.10.0/engines/.

To be honest, it was painful to build all x86 stuff just for a single shared object, but it is also nice to see all applications has the same look and feel.

Notes applet loses the recent changes.

XFCE Notes applet saves its files a few minutes after keystroke, and it often leads to the loss of recent changes in my to-do list. There’s no workaround other than modifying the source code AFAIK. I hope the save timeout value becomes configurable in the near future.

XWFM doesn’t have a shortcut for cycling windows list backward.

With Metacity, I mapped ‘alt-grave(`)’ to cycle windows list backward. This mapping is very useful when you pressed alt-tab one or two more times by mistake – you can always go backward with just a few more alt-grave instead of cycling the long windows list with many alt-tab keystrokes.

Time Out applet counts down even if there’s no user activity.

XFCE Time Out applet is a good alternative to Workrave, but it doesn’t stop counting down even if I am away from the computer.

Conclusion

I mentioned a few problems I’ve found while I use XFCE 4.4 in this post and provided workarounds for some of them. You might feel that XFCE has a lot of problem from this post, but you got it wrong if you felt so. In my opinion, XFCE is an extremely stable and fast desktop environment with nice features and better customizability.

URL Monitor – Getting Notified When a Web Page is Updated

I’ve been using RSS Generator for a while to generate RSS for web pages which don’t provide RSS. However, the service often goes unreliable probably due to enormous load from various RSS readers. Another caveat was that the URL of the generated RSS is so long that it’s not accepted by the input form of some web-based RSS readers.

So, I rather chose to write a simple shell script which sends me an e-mail message when the web pages in my watch list change. It’s name is ‘URL Monitor’:

#!/bin/sh
# Path: /usr/local/bin/url-monitor

mkdir -p /var/cache/url-monitor
cat /etc/url-monitor.conf | while read -r NAME; do
  read -r URL || exit 1
  read -r INTERVAL || exit 2
  read -r STRIP_REGEX || exit 3
  read -r NEEDLE || exit 4
  read -r REPLACEMENT || exit 5

  if [ -f "/var/cache/url-monitor/$NAME.html" ]; then
    MTIME=`stat --format=%Z "/var/cache/url-monitor/$NAME.html"`
    NOW=`date +%s`
    AGE=$(($NOW - $MTIME))
    if [ $AGE -lt $INTERVAL ]; then
      continue;
    fi
  fi

  wget -q -T 60 -O - "$URL" | perl -pi -e 's/[rn]/ /g' | perl -pi -e "s/$STRIP_REGEX//gi" | perl -pi -e 's/s+/ /g' | perl -pi -e "s/$NEEDLE/$REPLACEMENT/gi" > "/var/cache/url-monitor/$NAME.html.new"

  if [ ! -f "/var/cache/url-monitor/$NAME.html.new" ] || [ `stat --format=%s "/var/cache/url-monitor/$NAME.html.new"` == "0" ]; then
    echo "Failed to fetch - $NAME" >&2
    rm -f "/var/cache/url-monitor/$NAME.html.new"
    touch "/var/cache/url-monitor/$NAME.html"
    exit 6
  fi

  if [ -f "/var/cache/url-monitor/$NAME.html" ]; then
    diff -q "/var/cache/url-monitor/$NAME.html" "/var/cache/url-monitor/$NAME.html.new" > /dev/null 2>&1
    if [ "$?" == "0" ]; then
      rm -f "/var/cache/url-monitor/$NAME.html.new"
      touch "/var/cache/url-monitor/$NAME.html"
      continue
    else
      mv -f "/var/cache/url-monitor/$NAME.html.new" "/var/cache/url-monitor/$NAME.html"
    fi
  else
    mv -f "/var/cache/url-monitor/$NAME.html.new" "/var/cache/url-monitor/$NAME.html"
  fi

  # Send notification
  {
    echo 'From: URL Monitor <[email protected]>'
    echo 'To: Trustin Lee <[email protected]>'
    echo "Subject: $NAME - updated"
    echo 'Content-Type: text/html; charset=euc-kr'
    echo
    cat "/var/cache/url-monitor/$NAME.html"
    echo
  } | sendmail trustin
done

This quick and dirty shell script simply strips out unnecessary part from the fetched web page, caches it and notifies me (local user ‘trustin’) via an e-mail when the newly fetched stuff differs from the cached one. The following is the example configuration file (/etc/url-monitor.conf):

JavaWorld: Featured Tutorials
http://www.javaworld.com/features/index.html
86400
(^.*<div id="toplist">|<p><a class="findmore".*$)
/javaworld/
http://www.javaworld.com/javaworld/
DDJ.com: High Performance Computing
http://www.ddj.com/hpc-high-performance-computing/archives.jhtml
86400
(^.*Feature Articless*-->|<br clear="left">.*$)
/hpc-high-performance-computing/
http://www.ddj.com/hpc-high-performance-computing/
Lono.pe.kr
http://lono.pe.kr/src/
86400
(^.*[[Start]]-->|<!--[[.*$)
/src/
http://www.lono.pe.kr/src/

Each line has the following meaning:

  • 1st line – the subject of the web page
  • 2nd line – revisit interval (in seconds)
  • 3rd line – what to strip out (in regex)
  • 4th line – something to replace (in regex), probably relative URLs
  • 5th line – what you want to replace the expression specified in the 4th line with

Once configured, url-monitor should be executed periodically. I added the following line to my crontab:

# Path: /etc/cron.d/url-monitor.cron
SHELL=/bin/bash
PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=trustin
HOME=/root

# Run the URL monitor every three minutes
*/3 * * * *  root  /usr/local/bin/url-monitor

As you noticed, it’s very primitive and requires you to modify the script itself to configure certain parameters. However, I think it’s just OK as long as the number of the web pages I have to monitor (read: which doesn’t provide RSS) is small.