リストへの追加と挿入
テスト返却にて、嫌味も織り交ぜながらの解説の後、 30分ほど時間があったので、次のステップ。
リストへの追加
前回までの授業では、リストは直接記述していたが、 データを読み取りながらのリスト生成を説明する。
まずは基本ということで、リストの先頭挿入。 ただし、データの入力順序とは逆になってしまう。
struct List* top = NULL ; int x ; while( scant( "%d" , &x ) == 1 ) { top = cons( x , top ) ; }
この欠点の修正ということで、末尾追加型を示す。 Listへのポインタのポインタがわかりづらいけど…
struct List* top = NULL ; struct List** tail = &top ; while( scant( "%d" , &x ) == 1 ) { *tail = cons( x , NULL ) ; tail = &((*tail)->next) ; }
ポインタのポインタは分かりづらいので、改めて式の一部分が 型でどうなっているのかを示す。
リストへの途中挿入
リストが使われる利点は、データの途中挿入。 以下のプログラムは、昇順に並んでいるデータの、適切な場所にデータを 途中挿入するプログラム。 一つ前のnext部を変更する必要があるため、 ひとまずは分かりやすいプログラムということで、p->next でループを回す。 本当は、List**を使いたいんだけどね…
void insert( struct List *p , int x ) { for( ; p->next != NULL ; p = p->next ) { if ( p->next->data > x ) { p->next = cons( x , p->next ) ; break ; } } }
ただし、このプログラムは、データの先頭や末尾への追加は正しく動かない。 このためよく用いられるテクニックは、先頭と末尾に本来なら使わないダミーデータを 入れておき、先頭末尾の特別処理を書かずにすませる方法をとる。 このような方法を番兵(sentinel)と呼ぶ。
緊急連絡システムのmuninが止まってた…
昨日よりニュースで、北陸地区での豪雨警報がでている。 緊急連絡のメールが沢山飛ぶ可能性もあり、 サーバの状況を監視してみる。しかしながら、監視用に動かしている munin の データが、5/1 を最後に更新されていない。 丁度、Debian の更新などをかけていた時期だし、その影響と思われる。
/var/log/munin/munin-update.logを見ると、以下の様な履歴が大量に残っている。 調べてみると、munin のデータをネットワーク越しに返信する、munin-node が正しく動いてないとのことであった。
(( /var/log/munin/munin-update.log )) 2013/06/19 09:35:01 [ERROR] Munin::Master::UpdateWorker <localdomain;localhost.localdomain> died with '[FATAL] Socket read from localhost.localdomain failed. Terminating process. at /usr/share/perl5/Munin/Master/UpdateWorker.pm line 139
改めて、munin-node の動作確認をすると…以下の様なエラーがあることから、 munin-node.conf の allow 項目を修正する。
(( /var/log/munin/munin-node.log )) 2013/06/19-09:34:29 [3696] Denying connection from: 192.168.xx.xx
(( /etc/munin/munin-node.conf )) allow ^(127\.0\.0\.1|192\.168\.xx\.\d+)$
さらに、apache access の状況も確認できていない。 これは、apache の mod_status の問題。
(( /etc/apache2/mod-enabled/status.conf )) <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 ::1 Allow from 192.168.xx.0/24 ← 追加 </Location>