ホーム » 2013 » 6月 » 19

日別アーカイブ: 2013年6月19日

2013年6月
« 5月   7月 »
 1
2345678
9101112131415
16171819202122
23242526272829
30  

最近の投稿(電子情報)

アーカイブ

カテゴリー

リストへの追加と挿入

テスト返却にて、嫌味も織り交ぜながらの解説の後、 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>