問 1 情報通信における符号化の意義と問題
(500字以内)
符号化(coding)の意義を二分し、問題点を示す。
(1)一つは、情報を「伝送信号」へ変換することである。たとえば電話で声を送ると、伝送方法に適した信
号変換(音圧→電圧→標本化・量子化→多重化)が行われる。変換は予め決めたコード(規程)によって行わ れ、逆の順序で復号すれば、もとの情報を復元できる可能性がある。復号側は、コードを知らないと復号でき
ない(文字化けや暗号)。特許等の権利を保護するために、コードが公開されていない通信機器もある。 (2)もう一つは、情報の品質制御を行うことである。Shannon(1948)が示すように、一定の帯域において伝
達可能な情報量が大きいことは即ち誤り可能性も大きく、情報量が小さいことは、誤り可能性が低いといえ
る。情報に誤り訂正符号など冗長性を加えることで情報の正確さを強くすることができる。逆に、伝送量を
大きくするためにはデータ圧縮用のコードを利用するが、伝送速度の安定性や情報の復元可能性は低下する。
ルータでパケットの圧縮をすると、遅延のためG.729のcodecでIP電話が使えないことがあるのも、環境に 応じたコード選択の重要さを示す一例である。
■ 参考資料
• Sami Nuuttila, Coding and Encryption in Telecommunication (Lecture material), http://users. utu.fi/samnuutt/CET/CETLMP02.pdf
• Claude E. Shannon, The Mathematical Theory of Communication (1948), http://cm.bell-labs. com/cm/ms/what/shannonday/shannon1948.pdf
1
問 2 AWK,Perl などのテキスト処理言語について、基本的な特徴、基本機
能、用途。
(300字以内)
【特徴】テキスト処理言語は、テキスト処理に適した命令セットを持ち、シェル言語よりも複雑で、コンパ
イル言語よりも文法は簡単である。言語の習得が容易で、簡潔なスクリプトで複雑なテキスト処理が可能であ
る。また、インタープリタ言語であるので、ハードウエアやOSなどの実行環境への依存性が低く、デバッグ も容易である。
【機能・用途】ファイルもしくは標準入力より読み込んだテキストを逐一、パターンマッチにより置き換え
処理するのが基本的な機能であり、テキストデータを印字や表示するための整形処理(レポートの作成など) を行ったり、他のプログラムから呼び出して、テキストデータの受け渡しや加工に使われること(CGIなど) も多い。
問 3 ログの処理
1
実装した機能a. rnagaokaがログインした回数
b. rnagaokaが使用した時間合計(loginからlogoutまで) c. その他
■ プログラムの拡張方針
1. 例題のログのほかに、一般的なlast(1)コマンドの出力も処理できるようにする。 2. ユーザ名をコマンドラインから引数として取る。
(例)
$ last | ./login2.plx -u user
3. ログの入力は、ファイルからも標準入力からも取得できるようにする。
(例)
$ last | ./login2.plx -u hijiri
$ ./login2.plx -u hijiri last.log
4. ユーザのログイン時間帯別のヒストグラムを作成する。
babababababababababababababababababababab
ログイン中のユーザの取り扱い
このままだと、以下の2つの結果が異なるログイン回数を返すことがある。
$ last|grep hijiri|wc -l
$ last|./login2.plx -u hijiri
なぜならば、last(1)は、現在ログイン中のユーザの情報も表示するからである。 hijiri pts/0 10.0.0.67 Thu Oct 24 22:51 still logged in
今回はログイン時間が確定している情報のみを計算の対象とした。
2
実行環境• RedHat Linux 8.0 (perl v5.8.0 built for i386-linux-thread-multi)
• SunOS 5.9 sparc (perl v5.6.1 built for sun4-solaris-64int)
3
参考資料• Miquel van Smoorenburg (1999), LAST,LASTB(1) manual
3
4
実行結果✓ ✏
[hijiri@sarah hijiri]$ ./login2.plx reidai.log Error: usage login2.plx -u user [file]
[hijiri@sarah hijiri]$ ./login2.plx -u rnagaoka reidai.log rnagaoka, 4 time(s) for 5:23.
HR freq. 0 1 1 | HR freq. 0 1 1
=== ===== +---+---+ | == ===== +---+---+
0: 0 | 12: 0
1: 0 | 13: 1 ######################
2: 0 | 14: 0
3: 0 | 15: 0
4: 0 | 16: 1 ######################
5: 0 | 17: 0
6: 1 ###################### | 18: 0 7: 1 ###################### | 19: 0
8: 0 | 20: 0
9: 0 | 21: 0
10: 0 | 22: 0
11: 0 | 23: 0
✒ ✑
✓ ✏ [hijiri@sarah hijiri]$ ssh [email protected] last\|./login2.plx\ -u\ hijiri
[email protected]’s password: hijiri, 140 time(s) for 611:07.
HR freq. 0 10 20 | HR freq. 0 10 20
=== ===== +---+---+ | == ===== +---+---+
0: 10 ############ | 12: 7 ########
1: 1 # | 13: 7 ########
2: 0 | 14: 13 ###############
3: 0 | 15: 6 #######
4: 0 | 16: 8 #########
5: 0 | 17: 9 ##########
6: 0 | 18: 2 ##
7: 0 | 19: 11 #############
8: 0 | 20: 10 ############
9: 2 ## | 21: 18 #####################
10: 6 ####### | 22: 20 ########################
11: 2 ## | 23: 8 #########
✒ ✑
✓ ✏
[hijiri@sarah hijiri]$ ssh [email protected] last\|./login2.plx\ -u\ winwin [email protected]’s password:
winwin, 34 time(s) for 4:04.
HR freq. 0 3 6 | HR freq. 0 3 6
=== ===== +---+---+ | == ===== +---+---+
0: 4 ################ | 12: 0
1: 1 #### | 13: 0
2: 0 | 14: 0
3: 0 | 15: 0
4: 0 | 16: 0
5: 0 | 17: 2 ########
6: 0 | 18: 6 ########################
7: 1 #### | 19: 6 ########################
8: 1 #### | 20: 4 ################
9: 0 | 21: 2 ########
10: 0 | 22: 3 ############
11: 0 | 23: 4 ################
✒ ✑
5
5
入力に利用したデータ last (一部)✓ ✏
winwin ftpd19543 fe092234.fl.Free Tue Oct 22 21:12 - 22:12 (01:00) winwin ftpd19350 fe092234.fl.Free Tue Oct 22 20:21 - 20:58 (00:37) winwin ftpd19326 fe092234.fl.Free Tue Oct 22 20:18 - 20:20 (00:02) hijiri pts/0 10.0.1.245 Tue Oct 22 16:39 - 17:17 (00:38) hijiri pts/1 takayuki.ktroad. Mon Oct 21 17:52 - 17:53 (00:00) miya ftpd16126 fe038163.fl.Free Mon Oct 21 15:20 - 15:20 (00:00) miya ftpd16106 fe038163.fl.Free Mon Oct 21 15:10 - 15:10 (00:00) hijiri pts/1 takayuki.ktroad. Mon Oct 21 14:19 - 14:31 (00:12) hijiri pts/1 takayuki.ktroad. Mon Oct 21 10:29 - 10:31 (00:01) winwin ftpd15349 user83.ktroad.ne Mon Oct 21 07:45 - 08:00 (00:15) shop ftpd15346 user83.ktroad.ne Mon Oct 21 07:44 - 07:44 (00:00) netdonya ftpd15340 user81.ktroad.ne Mon Oct 21 07:38 - 07:53 (00:15) shop ftpd15332 user79.ktroad.ne Mon Oct 21 07:25 - 07:41 (00:15) hijiri pts/0 c83202.tctv.ne.j Sun Oct 20 20:22 - 23:23 (1+03:00)
✒ ✑
例題のログ(reidai.log)
✓ ✏
rnagaoka servantes Thu Jun 22 13:18-13:24 (00:06) takuto donquijote Thu Jun 22 12:40-15:22 (02:42) yamanaka lamancha Thu Jun 22 09:24-15:33 (06:09) pep zenon Thu Jun 22 09:18-13:24 (04:05) rnagaoka sancho Thu Jun 22 07:49-08:21 (00:32) rnagaoka donquijote Thu Jun 22 06:39-09:12 (02:32) root servantes Thu Jun 22 06:38-08:52 (02:13) guest ppp.dokoka.ne.jp Thu Jun 22 06:15-06:23 (00:08) rnagaoka servantes wed Jun 21 16:12-18:25 (02:13) brown math.open.ac.uk wed Jun 21 15:36-16:40 (01:04)
✒ ✑
スクリプト(1/2)
✓ ✏
#!/usr/bin/perl
# 問3回答 (login2.plx)
# copyleft (c)2002 Hijiri Umemoto, <[email protected]>
if ($ARGV[0] = ’-u’ && $ARGV[1] ) { # スイッチの有無を検査
$user = $ARGV[1]; if ($ARGV[2] ) {
open($HANDLE, $ARGV[2]); } else {
$HANDLE = ’STDIN’; # ファイル名の指定がなければ
} # 標準入力
} else {
printf ("Error: usage login2.plx -u user [file]\n"); exit -1;
}
# 最近のOSは空白を許容するものもが多い. 空白が含まれるとすれば、
# フィールドのデリミタとして空白のみを採用することはできない。
# 例題のログも、空白で区切られているとはいうものの、ログイン名
# やホスト名の長短にかかわらず、各フィールドの先頭位置が常に固定
# されているから、その実は固定長レコードであることが伺える。
# lastでは、8文字以上のログイン名は、最初の8文字しか表示しない。
$user = pack("A8", $user); ## ユーザ名を空白で8文字に埋める
while(<$HANDLE>){ chomp;
# $user ユーザ名
# \s+[a-zA-Z]{3} 曜日
# \s[a-zA-Z]{3} 月
# \s+\d{1,2} 日
# \s+(\d{1,2}):\d{1,2} 時:分 ($1=時)
if (/^$user\s+.+\s+[a-zA-Z]{3}\s[a-zA-Z]{3}\s+\d{1,2}\s+(\d{1,2}):⇒
⇒\d{1,2}.+\s+\((\d*)\+?(\d\d):(\d\d)\)\s*$/) {
$kaisu++; # ログイン回数の計上
$jikoku[$1]++; # ログイン時間帯の計上
$jikan += $2 * 24 * 60; # 「日」単位を分になおして加算
$jikan += $3 * 60 + $4; # 「時」単位は分になおして加算 }
✒} ✑
7
スクリプト(2/2)
✓ ✏
if (defined @jikoku < 1) { # ログイン記録がない場合、終了 printf "no record.\n";
exit 0; }
printf "%s, %d time(s) for %d:%02d.\n", # ログイン回数と時間の表示 unpack(’A8’,$user), $kaisu, int($jikan / 60), $jikan % 60;
if ($HANDLE ne ’STDIN’) { close ($HANDLE); }
$saidai = $saidaichi = $i = 0;
while ($i < 24) { # 一番多くログインした時間帯を探す
if ($saidaichi < $jikoku[$i]) {
$saidai = $i;
$saidaichi = $jikoku[$i]; }
$i++; }
$keisu = 22 / $jikoku[$saidai]; # 表の幅に合わせた棒グラフの倍率
# ここからグラフ(ヒストグラム)の印字 print "\n";
printf "HR freq. 0 %5d %5s | HR freq. 0 %5d %5s\n", int($jikoku[$saidai] / 2 + 0.5), $jikoku[$saidai],
int($jikoku[$saidai] / 2 + 0.5), $jikoku[$saidai];
print "=== ===== +---+---+ | == ===== +---+---+\n";
$i = 0;
while ($i <12 ) {
printf "%2d: %5d %-24s| %2d: %5d %-24s\n",
$i, $jikoku[$i], ’#’ x ($jikoku[$i] * $keisu),
$i+12, $jikoku[$i+12], ’#’ x ($jikoku[$i+12] * $keisu);
$i++; }