gnuplotでローソク足を表示させる

twitterでこんなことをつぶやきました:

手軽かつ詳細に,環境に依存せず為替の履歴をローソク足で見られるサイト作ったら便利かなと思った.第一感ではCSVさえ手に入ればRuby + sh + crontabですぐできそうだが.

まあいきなりは無理ですので,とりあえず今日は,ドル円と日経225を月足で表示することにしました.
期間は,1980年代から現在までのデータを見つけられたので,まあその付近ということにしました.

すぐできるだろと思ってたら,データ加工に手間取り半日がかりの作業となりました.

・日経先物225
米Yahooのサイトに,月足のCSVデータがあったので簡単に作れました.

中身はこんな感じです.gnuplotで扱うために,カンマではなくタブで区切ってます.ですので厳密にはCSVではありません.

$ cat kabu.txt
# 年月日 始値 高値 安値 終値
2010/12/01 9939.8 10394.22 9918.55 10228.92
2010/11/01 9166.85 10157.97 9123.62 9937.04
2010/10/01 9440.52 9716.92 9179.15 9202.45

(略)

1984/03/01 9920 10929 9920 10929
1984/02/01 10201 10201 9830 10031
1984/01/04 9927 10236 9927 10196

set xdata time
set timefmt "%Y/%m/%d"
set format x "%Y"
set xlabel 'Year'
set title 'Transition of NIKKEI225 by soraochi'
set ylabel 'NIKKEI225 [Yen]'
plot "kabu.txt" using 1:2:3:4:5 with candlesticks linetype -1 notitle, 10000 lt 7, 20000 lt 7, 30000 lt 7

・ドル円
日足でのCSVは見つかったのですが(参考文献),月足のCSVは見つけられませんでした.
まず,拾ってきた日足データを下記のような形式に加工しました.


$ cat ./hiasi.txt
# 年月日 始値 高値 安値 終値
1989/1/03 123.60 125.56 123.35 123.60
1989/1/04 123.65 125.15 123.65 125.05
1989/1/05 125.05 125.76 125.05 125.59

(略)

2010/12/27 82.82 82.99 82.65 82.83
2010/12/28 82.80 82.81 81.81 82.36
2010/12/29 82.45 82.45 81.60 81.62

awkで扱いやすくするため,日付のフォーマットを日経225のときとは変えてあります.
このままでは日足なので,月足に変換するシェルスクリプトを書きました.

シェルスクリプトのテキスト版

#!/bin/bash

TEMPFILE=/tmp/rosoku.$$;

rm ./rosoku.txt;
touch ./rosoku.txt;

YEAR=1989;
while [ `test $YEAR -le 2010;echo $?` = 0 ]
do
 MONTH=1;
 while [ `test $MONTH -le 12;echo $?` = 0 ]
 do
  cat ./hiasi.txt | grep `echo $YEAR/$MONTH/` > $TEMPFILE;
  HAJIMENE=`cat $TEMPFILE | head -1 | awk '{print $2}'`;
  OWARINE=`cat $TEMPFILE | tail -1 | awk '{print $5}'`;
  TAKANE=`cat $TEMPFILE | awk 'BEGIN{ taka = 0.0 }{if ($3 > taka){taka = $3}}END{print taka}'`;
  YASUNE=`cat $TEMPFILE | awk 'BEGIN{ yasu = 1000.0 }{if ($4 < yasu){yasu = $4}}END{print yasu}'`;   echo -e "$YEAR/$MONTHt$HAJIMENEt$TAKANEt$YASUNEt$OWARINE" >> ./rosoku.txt;
  MONTH=`expr $MONTH + 1`;
 done
 YEAR=`expr $YEAR + 1`;
done

rm $TEMPFILE

月足の高値(安値)は,その月に属する日足の高値(安値)のうち最も高い(安い)ものです.twitterでつぶやいた通りです:

Σxi=A(for i:= 1 to N)のとき,集合Aの最小値は,部分集合xiの最小値xi_minのうちのどれかか.∀xi_minが既知なら,集合Aの最小値はN-1回の比較演算だけで求められると.

出力(rosoku.txt)は以下のようになりました

$ cat rosoku.txt
1989/1 123.60 130.98 123.35 130.50
1989/2 130.35 130.90 125.20 126.87
1989/3 126.85 133.55 126.85 132.77

(略)

2010/10 83.49 84.01 80.41 80.48
2010/11 80.33 84.41 80.24 83.65
2010/12 83.68 84.52 81.60 81.62

作った月足データをgnuplotで出力しました

set xdata time
set timefmt "%Y/%m"
set format x "%Y"
set title 'Transition of USDJPY=X by soraochi'
set xlabel 'Year'
set ylabel 'USDJPY=X'
plot "rosoku.txt" using 1:2:3:4:5 with candlesticks linetype -1 notitle, 80 lt 7 w l, 160 lt 7 w l

CSVデータは概ね加工できたので,次は任意の期間と足を指定できるCGIを作るかもしれません.

・参考文献
gnuplotでローソク足を表示させるのに参考になりました
http://park8.wakwak.com/~sohgetsu/cgi-bin/wiki.cgi?page=gnuplot

awkで文字列を扱う時,参考にしました
http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html

日銀の統計サイト.あまり役に立ちませんでした
http://www.stat-search.boj.or.jp/index.html

日経225の古いデータがあります
http://finance.yahoo.com/q/hp?s=^N225

ドル円,先物などのデータがあります
http://www.sankayo-jp.com/download.htm

ドル円の古いデータがあります
http://www.fxlabo.com/content/tradematerial/zai_deta.htm

Ubuntu10.10でVMware Playerが動かないときの対処法

見事に引っかかったのでメモしておきます.VMware Workstationについても同様かと思われます.

[Ubuntu][PC]VMwarePlayerが起動しない on Ubuntu 10.10

Ubuntu 10.10 and VMware Player 3.1

リンク先のスクリプトを回せば良いのですが,su,あるいはsudoを必要とするので自己責任でお願いします.
build-essentialが入っているかを確認しましょう.dist-upgrade時に消えてしまったのか,僕はこれでしばらく迷いました.

Ubuntu 10.04上でWindowsXPを動かす(仮想化)

仮想化ブームも一段落ついたところで,仮想化を試してみました.
理由は単純で,Windowsバイナリを動かせる環境が欲しかったからです.Wineによるエミュレーションも(期待度の割には)あまり良くないですし.

環境

ホストOS:Ubuntu 10.04
ゲストOS:Windows XP
CPU:E8400
グラボ:GeForce 9600GT
SSD:Intel X25-V

以下の3つを試しました

・KVM + qemu
・VirtualBOX
・VMware Player

KVM+qemu
重い.ひたすら重い.Linux上でLinuxを扱うのは速いのかもしれませんが(未検証),今回の目的では使い物になりませんでした.残念!

VirtualBOX
オープンソースなので使ってる人が多いと思われる.インターフェースも分かりやすいし挙動も素直だし,なかなか良い.
ただ,後述のVMware Playerのほうが速かった.

VMware Player
かなり古くからある商用ソフトウェア.VMware Playerは無償だが,VMware Workstationなどの有償版も提供されている.お値段は2万円から.高いのか安いのかは,僕には判断がつかない.
今回は無償版のVMware Playerを使った.機能,性能ともに十分すぎる.Windowsインストール時の煩わしい設定も勝手にやっておいてくれる.
aptから拾えなかったり,ネットワークドライブが勝手に無効になったり怪しい点もあるが,この3つの中では一番良いと僕は思う.

まとめ:

HD動画くらいなら概ね再生できます.ただ,DirectX系のアプリやゲームは,ほぼ動かないです.

時間の許す限り,自分で色々試してみるのが一番の解決策ですね.

OpenOffice.orgでLaTeXライクな数式を書く(Ubuntu 10.04版)

2009年に同様の記事を書きましたが,前回の方法ではepsが使用できなくなってしまったので書き直します.

インストールに成功した環境:Ubuntu 10.04 64bit

まずaptからインストールできるものを取ってきます

sudo apt-get install texlive imagemagick epstool

フォントをインストール


mkdir OOoLatexFonts
cd OOoLatexFonts
wget http://mesh.dl.sourceforge.net/sourceforge/ooolatex/OOoLatexFonts.zip
unzip OOoLatexFonts.zip
cd ..
sudo mv OOoLatexFonts /usr/share/fonts/truetype/.
sudo fc-cache -f /usr/share/fonts/truetype

eps関係のものをインストールする.適宜ここからダウンロードしてください.64 bit linuxの場合でも,latex2emf_Linux_i386_binary.tar.gzでOKです.


tar -xzvf latex2emf_Linux_i386_binary.tar.gz
cd latex2emf_Linux_i386_binary/
sudo ./install.sh

次にOOoLatex本体をインストールします.OOoLatex本体はここからダウンロードしてください
インストール方法は

Tools > Extension Manager > Add > Select the oxt file you’ve downloaded

です.日本語ローカライズされたOOoを使ってる方は・・・同様だと思います,たぶん.

・・・Ubuntu9.04(Jaunty)まででしたらこれで使えるようになるのですが,epsを生成しようとすると「script error : the postscript file was not converted to emf」とエラーが出てしまいます.
これは9.04(Jaunty)までは存在していた「libstdc++5」が,Karmic以降には「libstdc++6」になったことに起因する問題です.
universeからJauntyのlibstdc++5を拾ってきてインストールすればこれまでのように使えます.

下記リンクは64bit版のものです.アーキテクチャが違う場合,ここからダウンロードして差し替えてください


wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_amd64.deb
sudo dpkg -i libstdc++5_3.3.6-17ubuntu1_amd64.deb

64bit版を使っている場合,32bit版のlibstdc++5もインストールしなければなりません.

wget http://security.ubuntu.com/ubuntu/pool/universe/i/ia32-libs/ia32-libs_2.7ubuntu6.1_amd64.deb
dpkg-deb -x ia32-libs_2.7ubuntu6.1_amd64.deb ia32-libs
sudo cp ia32-libs/usr/lib32/libstdc++.so.5.0.7 /usr/lib32/

長くなりましたが,以上で使えるようになります.

2010-09-23 追記
一つ忘れてました.上記実行したあと,次のコードも必要です.

cd /usr/lib32/
sudo ln -s libstdc++.so.5.0.7 libstdc++.so.5

2010-11-21 追記
Ubuntu 10.10でも動作を確認しました.

参考:
Install libstdc++.so.5 on Ubuntu 10.04 or 9.10

Fluxboxを使ってみた

Gnomeが重いのでFluxboxにしました.色々カスタマイズしたので,やってみたことを書いておきます.

・Why Fluxbox?
1 : 軽い
Gnome使うより,全体的に動作が軽くなります.Firefoxも軽くなります.
2 : 強力なカスタマイズ機能
細かいとこまで設定できます.
さらに,設定は~/.fluxbox以下に入っているので,USBメモリに突っ込んで展開するだけで出先でも見慣れたUIを使うことができます.

・soraochiの環境
Ubuntu 10.04

・使うための準備


sudo apt-get install fluxbox eterm fbsetbg

etermとfbsetbgは壁紙を設定するのに必要です.fluxconftというGUI設定ツールもあるんですが,使い勝手が悪いので僕は使ってないです.

・まずやっておくと便利なこと
~/.fluxbox/startupを開いて,exec fluxboxの前に


xset mouse 2.0 2.0 &
numlockx &

と書いておく.xset mouseはマウスの速度ですので適宜値を変更してください.numlockxは,NumLockをオンにするコマンドです.
つまり,~/.fluxbox/startupはfluxboxを起動する前にシェルで実行するコマンド群です

・Theme
このへんに色々あります.再起動やログオフなど面倒な作業なく変えられるので便利です

・外観
メニューバーが大抵文字化けするので,拾ってきたThemeのmenu.cfgの一番下に

toolbar.font: 好きなフォント名-12
menu.title.font: 好きなフォント名-12
menu.frame.font: 好きなフォント名-12
window.font: 好きなフォント名-12
menuFont: 好きなフォント名-12
titleFont: 好きなフォント名-12

と書いておくといいです.ついでに

toolbar.height: 20

も入れておくと見やすいです.

・右クリックのメニュー
デフォルトだととてつもなく使いづらいので,カスタマイズ必須です.

まず
cat ~/.fluxbox/menu

[begin] (fluxbox)
[include] (~/.fluxbox/mymenu)
[end]

とします.

~/.fluxbox/mymenuの上の方によく使うアプリケーションを書いておきましょう

For example:

[exec] (bash) { x-terminal-emulator -T "Bash" -e /bin/bash --login}
[exec] (Firefox) {/usr/bin/firefox}
[exec] (gedit) {/usr/bin/gedit}
[exec] (GNOME system monitor) {/usr/bin/gnome-system-monitor} <>
[exec] (X Chat) {/usr/bin/xchat}
[exec] (Pidgin) {/usr/bin/pidgin}
[exec] (Nautilus) {/usr/bin/nautilus --no-desktop --browser }
[wallpapermenu] (~/.fluxbox/wallpapers/) {fbsetbg -a}

[wallpapermenu]の項目を入れておくと,~/.fluxbox/wallpapers/以下の画像ファイルがメニューに現れ,クリックすると壁紙にできるようになります.

・ショートカット
ショートカットキーを追加する方法です.

~/.fluxbox/wallpapers/keysの下の方に

Mod4 E : Exec nautilus --no-desktop --browser
Control Shift Escape : Exec gnome-system-monitor
Mod4 X : Exec gnome-terminal

で,Win + Eでnautilis,Control + Shift + Escapeでgnome-system-monitor,Win + Xでbashが立ち上がるようにできます.

・総評
常用するつもりは全くなく,お遊びのつもりではじめたのですが,使っているうちにGnomeに戻す気がなくなりました.
おすすめ.

出先にいながら自宅にいるようにインターネットをする方法

(6/14 11:00 間違いに気付いたので大幅に直しました)
(2018年08月01日 間違いに気付いたので少し追記しました)

自宅のSSHd + SOCKS serverを介してインターネットにアクセスすれば,公開鍵暗号を破られない限り,自分の管理していないFirewallやProxyに通信を閲覧されることがなくなります.
また,SSHが通っていれば簡単に使えるので手軽です.

ローカル:出先(会社,研究室)のLinux
リモート:自宅のLinux

と呼ぶことにします.

まず,ローカルからリモートへSSHでトンネルを掘りましょう

ssh -D 1080 -p 22 user@jitakuhogehoge.com

ポート番号は適宜読み変えてください.

ローカルのFirefoxを以下のように設定します

↑(2018年08月01日 追記 上記画像はやや間違えていて、SOCKS Hostの項目だけ設定すれば十分です)

SSL Proxyの項目は設定しないでください.SSLセッションは元々暗号化されているので,SOCKS通すと上手く通信できなくなります.

tcpdumpでパケットを見てみると,SOCKSを通さない場合は通信内容が丸見えです.
以下は,https://team2ch.orgを表示したときのものです.


sudo tcpdump -t -n -X -s 1000 port 80 > no_socks
cat no_socks

※一部抜粋

0x0000: 4500 028b 38bf 4000 4006 ed40 8299 0db0 E...8.@.@..@....
0x0010: 77f5 0a2f aa73 0050 6623 713b 7bc8 0a43 w../.s.Pf#q;{..C
0x0020: 8018 00b6 5868 0000 0101 080a 000d 74e6 ....Xh........t.
0x0030: 3e43 d1c0 4745 5420 2f69 6e64 6578 2e63 >C..GET./index.c
0x0040: 6769 2048 5454 502f 312e 310d 0a48 6f73 gi.HTTP/1.1..Hos
0x0050: 743a 2074 6561 6d32 6368 2e6f 7267 0d0a t:.team2ch.org..
0x0060: 5573 6572 2d41 6765 6e74 3a20 4d6f 7a69 User-Agent:.Mozi
0x0070: 6c6c 612f 352e 3020 2858 3131 3b20 553b lla/5.0.(X11;.U;

SOCKSを通せば


sudo tcpdump -t -n -X -s 1000 port 22 > socks_haita
cat socks_haita

※一部抜粋


0x0000: 4500 0104 c652 4000 3706 6a34 77f5 0a2f E....R@.7.j4w../
0x0010: 8299 0db0 a2e4 856a 628f d7eb f933 c721 .......jb....3.!
0x0020: 8018 0266 48c7 0000 0101 080a 0a5f 9a0d ...fH........_..
0x0030: 000e 0bc9 3049 7fb9 b473 7a4e 47d9 d50e ....0I...szNG...
0x0040: e8a4 15b4 ee8c 0d60 9506 c829 170e 2d26 .......`...)..-&
0x0050: 4fa2 d2e5 fc49 14c3 9f27 5b83 9a27 f5bf O....I...'[..'..
0x0060: 0368 db97 a2d1 187d f180 2f42 f631 c525 .h.....}../B.1.%
0x0070: 6fea 9341 019a 4f6a 1d7f bb0e 52ea 82fa o..A..Oj....R...

実際にパケットを見ても,通信内容について推測することは(公開鍵暗号を破らない限り)できません.
もし仮にパケット内容を暗号化している共通鍵が解読されたとしても,共通鍵は使い捨てなので,盗聴されたパケットは氷山の一角にすぎません.

ssh -Xはローカルネットワーク内であれば有効ですが,WAN越しだと描画速度の面から実用的ではありません.
この方法でSOCKSを使えば,ローカルから直接接続するのとあまり変わりない描画速度/回線速度で,Firewallを誤魔化しながら通信をすることができます.
もっとも,回線速度に関してはリモートの回線速度にも大きく依存すると考えられます.また,FirewallでSOCKSによる通信をしゃ断されたら使えないというデメリットもあります.

Ubuntu 10.04でIPv6をオフにする

毎度お馴染み,IPv6をオフにする話です.

まずは確認から.
ifconfigでinet6などのIPv6っぽいものがあれば,おそらくオンになってます.

今までであれば

sudo echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
sudo sysctl -p

sudo echo 'blacklist ipv6' >> etc/modprobe.d/blacklist.conf

という感じでやればオフになったのですが,Lucidではこれが効かないようです.

ググってみたところ,grub2からオフにする方法を見つけました.

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX="ipv6.disable=1"

sudo update-grub2

無事,オフにできました.

参考サイト:
Ubuntu 10.04 ipv6 Disable, firefox

Ubuntu 10.04(Lucid)のGMA 500 Poulsbo対応状況

先日購入したVAIO Xに,Ubuntu10.04を入れた.
結論から言うとPoulsboのドライバが入れられなかった.
GMA 500のネットブックお持ちの方は,まだ9.10使ってたほうがよさそうです(2010-05-02現在).

2010-05-12追記
スクリプトが公開されました

2010-05-19追記
僕のVAIO Xに,スクリプトを使ってインストールできました.
VAIO P,Xでは,grub2の書き換えが必須です.
挑戦するかたは,自己責任でお願いします.

9.04から,PoulsboのドライバがLaunchpadで公開されていた

9.10以降も(入れるのに苦戦するものの)使えていた

(2010.4半ば) Ubuntu 10.04でPoulsboが使えない.Jolicloudでは使えるのにどうしてだ!(Forumより)

ソースコード自体がuglyで対応が難しい

Karmic対応のshをLucid用にしたshが公開された

動かない人続出(僕も試してみたのですが動きませんでした)

一方Mandriva cooker(debianで言うところのtestingやsid)では,Mon, 26 Apr 2010に改良されたソースコードがパッケージで配布されていた

Lucidではそのまま使えない

Lucid用にMandrivaからcherry-pickingして作り直してみたけどXが起動しない

2010-05-05追記
ubuntuforums.orgのlucazadeさん,jbernardoさんがドライバを直してくれた.どうやら/usr/libが/libになっていたらしい.

2010-05-07追記
Karmicでは動くものの,依然,Lucidでは動かない

ソースコードの改良が続く

Lucidで5秒間動くようになった

notification-areaとnotify-osdを消せば30秒動くことが判明した.

2010-05-09追記
まだ完璧ではないものの,動くようになったようです(/etc/X11/xorg.confを編集する必要があります)

2010-05-10追記
改良版シェルスクリプト(temporary版)ができたようです.

2010-05-11追記
Ubuntuのwiki(HardwareSupportComponentsVideoCardsPoulsbo)のLucidの項目が更新されました.
動いた報告が何件か上がってます.VAIO P,Xでは,今回もgrub2の書き換えが必要なようです
ソラオチは今週末以降作業します.

参考
Poulsbo on Mandriva with X server 1.7
http://blino.org/blog/mandriva/poulsbo-xserver1.7.html

When will ubuntu Lucid 10.04 support Intel GMA500 "Poulsbo" video hardware?
http://ubuntuforums.org/showthread.php?t=1453445

Guide to Get the Best Performace from the GMA 500
http://ubuntuforums.org/showthread.php?t=1229345&highlight=gma500&page=50

HardwareSupportComponentsVideoCardsPoulsbo
https://wiki.ubuntu.com/HardwareSupportComponentsVideoCardsPoulsbo/

DDNS更新スクリプト(運用編)

運用とかそんな大層なもんじゃないですが,先月作ったスクリプトがどうなったかについて書いておきます.

# ls -lart
total 40
drwxrwsr-x 3 root staff 4096 Feb 12 23:36 ..
-rw-r--r-- 1 root staff 49 Feb 16 19:27 log~
-rw------- 1 root staff 15 Feb 16 19:27 getip~
-rw-r--r-- 1 root staff 12 Feb 16 19:27 getip_status~
-rw------- 1 root staff 793 Feb 16 20:20 vd.sh~
-rwx------ 1 root staff 802 Feb 16 21:29 vd.sh
drwx--S--- 2 root staff 4096 Feb 16 21:29 .
-rw------- 1 root staff 444 Mar 16 18:55 log
-rw-r--r-- 1 root staff 12 Mar 16 18:55 getip_status
-rw------- 1 root staff 15 Mar 16 19:20 getip

getipは10分毎に取得できているようです.logが10分毎になっていないのは,さっき手動で回したせいです.

# cat log
Tue Feb 16 19:52:03 JST 2010 -> 119.245.10.115
Tue Feb 16 20:12:26 JST 2010 -> 119.245.10.115
Tue Feb 16 20:15:11 JST 2010 119.245.10.115 ->
Tue Feb 16 20:20:01 JST 2010 119.245.10.115 ->
Tue Feb 16 20:25:01 JST 2010 -> 119.245.10.115
Tue Feb 16 20:50:01 JST 2010 -> 119.245.10.115
Wed Feb 24 14:50:04 JST 2010 119.245.10.115 ->
Wed Feb 24 15:00:04 JST 2010 -> 210.165.205.7
Tue Mar 16 18:55:12 JST 2010 210.165.205.7 -> 119.245.11.216

お世辞にも上手くlogが取れてるとは言い難いですね.原因として,IPアドレスが変化すると,一時的にifconfigのinet addr欄が空白になることが考えられます.
ただ,変更日時と変更後のIPアドレスは分かるので,さほど困ることはないです.

PCルータの性能についてですが

$ free
total used free shared buffers cached
Mem: 1034944 779284 255660 0 114268 596360
-/+ buffers/cache: 68656 966288
Swap: 2650684 76 2650608

PCルータにはメモリ1G載せてるのですが,70M程度しか使っていないようです.
CPUはセレロン2Gですが,負荷により通信が落ちることもありません.
Atomあたりでも,NICさえしっかりしたもの積めば十分な性能が出る気がします.
家庭用ルータより速くて小回りが効くので,設置場所さえ許されるのであればおすすめです.

value-domain.comのDDNSを自動で更新するスクリプト

固定IPアドレスを持ってないので,IPアドレスが変わる度value-domainにお知らせしなければなりません.
しかし,IPアドレスが変更されるとSSHも通りませんので出先だと手の施しようがなくなります.

固定IPアドレスは高いので,以下のような要件を満たすシェルスクリプトを書きました.

こうしたい:

・うちで使ってるdebian lennyで動く
・value-domainでだけ使えればいい
・crontabに登録して,10分に1回IPアドレスに変更がないか確認させる
・WAN側IPアドレスを知るのに,外部サーバに問い合わせを行わない(10分に1回問い合わせたらご迷惑でしょう?)

スクリプトのテキスト版はこちら

#!/bin/sh

# Set your account information of VALUE-DOMAIN.com
vdomain=`echo 'hogehoge.com'`;
vpass=`echo 'password'`;

# WAN port
wan_if=`echo 'ppp0'`;

# Getting the current directory of this script
current_dir=`echo $(cd $(dirname $0);pwd)`

# Get older ip address
oldip=`cat $current_dir/getip`;

# Get current ip address
`ifconfig $wan_if | grep "inet addr" | awk '{print $2}' | sed 's@addr:@@'` > $current_dir/getip;

# You can also use this line;
# wget -O $current_dir/getip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip";

sleep 5;
newip=`cat $current_dir/getip`;

# Renew (or do not renew)
if [ "$oldip" != "$newip" ]; then
wget -O $current_dir/getip_status "http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$vdomain&p=$vpass&h=*&i=$newip";
echo "`date` $oldip -> $newip" >> $current_dir/log;
fi

$ sudo crontab -l

*/10 * * * * /bin/sh /usr/local/sbin/vd/vd.sh >/dev/null 2>&1

ファイル構成は

vd.sh       (上記スクリプト本体)
log        (IPアドレスに変更があったときに書いておくファイル)
getip       (アドレスをメモしておく,/tmpに置いた方がよかったかも)
getip_status  (最後にIPアドレスが変更されたときの,value-domain.comからの応答を書いておく)

です.

ifconfigで外側IPアドレスを取得しているので,外側IPアドレスの付与を受けているインターフェースを持つマシンでしか使えません.
まあつまり,PCルータで回す用です.

NAT内で使うには,外部サーバに頼るか,その他の工夫が必要です.
DDNS更新スクリプト(運用編)へ続く

追記@2011-02-26
意外と閲覧数が多いことに気付いたので,一部訂正&テキスト版を置きました

追記@2011-11-09
上記スクリプトをマルチアカウント版に改良してくださった方がいます.感謝.
ValueDomain用のdynamicDNS更新のBashスクリプト

既知のバグ@2011-11-09
Terminalを日本語環境で使用していると上手く動かないようです.つまり,

$ echo $LANG

を実行してja_JP.UTF-8などが表示される場合,使えないということです.(うちの環境ではen_US.utf8が表示されます)
これは,IPアドレスを取得する行,つまり

`ifconfig $wan_if | grep "inet addr" | awk '{print $2}' | sed 's@addr:@@'` > $current_dir/getip;

がコテッコテで環境依存な取得方法であることに由来しています.
動かすには,この行を改良するか言語をen_US.utf8に設定する必要があります.
外部サーバに問い合わせするのを許容するなら,例えば以下のように変更すればいいと思います.

wget -O $current_dir/getip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip";