2013/12/21(土)template <class T> class TreeNode { ... }; の中身は?
tree を作ることを考える。
根があって、任意数の子をとれる。
子も任意数の子をとれる。
汎用的なtreeクラスの節、template
どうやったら引き回しやすいか。
まぁ、複数の子っても、たくさんの子を持つか、
あるいはまったく子を持たないかわからないので、
二分木で表現することにする。
思いつくまま定義を書くと、
template<class TValue> class Node { TValue value; Node<T> *parent, *firstChild, *nextSibling; };
みたいになって、それを実装してみたのが
https://gist.github.com/ttsuki/95ceef4cacdc9c5e0294 なのだけど、
いざ使ってみようと思って、
使う側に回ってからTValueにあたる型を作ってて思ったんだけど、
普通、Treeで何らかの構造を表そうと思ったら、
その要素TValueはデータ構造的にツリーになる前提があるわけで
TValue自身がTValue::ナントカ() が自分の親・兄弟にアクセスできないと、
トラヴァーサルしにくいなーということに後から気づいた。
じゃあ、
class 実際に扱いたい型 : public Node<実際に扱いたい型 *> { ctor() : Node(this) { } };
なら?
にしても、parentは、Node<TValue *>の型であって、
それをTValueとして扱うにはダウンキャストがいるのでなんか気持ち悪い。
って考えてると、
class 実際に扱いたい型 { Node<実際に扱いたい型 *> link; ctor() : link(this) { } };
になって、マジで?ってなる。
これだと、でもまぁ、これだとキャストなしに、
自分の親ノードを得るのに return link.parent.value; できるので……。
ただ、GetParent() とか、ApplyAllChildren等を
全部pImplばりに再実装しないといけなくて、
それめんどくさいなぁ。
なんか、お約束のレシピはないのかしら。
2013/12/01(日)ぼくんちのNASで動いているValue Domain DDNS Updator
「つーさのくーかん」は、ぼくんちのNAS上で動いてるのですが、
プロバイダを変えてからちょこちょこIPアドレスが変わるようになり、
GoogleのWebmasterツールから、サイトにアクセスできない!と怒られては、
手動でDNSレコードを更新していたりということをやっていたのですが、
最近この作業にうんざりしてきていたので、
ようやくValue DomainのDDNSを更新するためのプログラムを作ることにしました。
DNS更新には、自分のグローバルIPが要るのですが、これをどっから取ってくるか。
手っ取り早くどっか外部サイトのサービスを呼ぶ手もあるにはありますが、
やっぱ自宅鯖してるくらいだからその辺は閉じていたいとも思いまして、
UPnPでルータに問い合わせることにしようと思いました。
予てから、UPnPを使って自分のグローバルIPアドレスを得るC#プログラムを公開してましたが*1、
こいつは、Windowsなupnp.dllを使ってる関係で、Linuxでは動かなかったので、
NASが定期的に自分のIPを確認してDDNSに登録することはできなかった。
LinuxでUPnPと言われても門外漢で、
ちょっと調べるとgupnp-toolsとかいうのもあるらしいのですが、
Xなしで動くのかどうかよくわからなかったので、
まぁ、自分で書くことにしました。
https://gist.github.com/ttsuki/7723258
書きました。
VSでexeをビルドして、NASへコピーしました。
nohup mono ValueDomainDDNSUpdator.exe > vdddnsu.log 2>&1 & echo kill $! > kill-vdddnsu.sh
動きました。
これからは安定して、サイトにアクセスできるようになると思います。
UPnPは、最初にUDP multicastでネットワーク上にいるデバイスを探すのですが、
今回はルータのIPが既知、かつ、変化しないので、その辺はすっ飛ばしました。
って、考えたらコントロールURLも変わらないはずだし、もっと楽できたなぁ……。
反省です。
おわりです。