ネットワークコンピューティング実習

URL


アクセスできたら、まず最初にブックマークに追加しておいてください。
講義ページ
https://lsnl.jp/l/netcompx

講義ページ (複数ページ版 (モバイル端末向け))
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/toc.html

[授業開始時に提出] 出席確認フォーム (パスワードが必要です)
https://lsnl.jp/app/lecture/attend/show/netcompx

[授業中に使用] クリッカー (パスワードが必要です)
https://lsnl.jp/app/lecture/clicker/show/netcompx

[授業中に提出] リフレクションシート (パスワードが必要です)
https://lsnl.jp/app/lecture/refl/show/netcompx

[自習後に提出] レポート送信フォーム (パスワードが必要です)
https://lsnl.jp/app/lecture/report/show/netcompx

講義ビデオ (パスワードが必要です)
https://lsnl.jp/video/netcompx/2024/

連絡用メイリングリスト (教員 + TA に届きます)
netcompx-staff[atmark]lsnl.jp
本文には、必ず学生番号・氏名・メールアドレス (@kwansei.ac.jp のもの) を明記してください。

担当教員

大崎 博之
関西学院大学 工学部 情報工学課程
E-mail: netcompx-staff[atmark]lsnl.jp

TA (ティーチングアシスタント)

江見 太一 M2 (大崎研)
稲吉 蓮 M1 (大崎研)
E-mail: netcompx-staff[atmark]lsnl.jp

ネットワークに関する疑問

Q1. インターネットを使えば、 メールしたり、 会話したり、 買物したり、 何でもできるのではないだろうか? 今のインターネットにできないことはあるだろうか? もしあるとすれはそれは何だろうか? できない理由は何だろうか?

Q2. 今、 ネットワーク研究の最先端では、 どんなネットワークが研究されているのだろうか? 新しいネットワークとはどのようなものだろうか? そのしくみはどうなっているのだろうか?

Q3. 新しいネットワークや、 その上でのネットワークサービスは、 どうやって生まれているのだろうか? 誰が、 どういう方法で生み出しているのだろうか? ハードウェア (端末、 デバイス) やソフトウェア (通信プロトコル、 アプリケーション) を毎回試作するのだろうか?

Q4. 新しいネットワークの研究に私も参加できるだろうか? 参加するためにはどんな知識や技術が必要だろうか? これまでに理工学部で学んだ内容は役に立つのだろうか? 中学や高校で学んだ基礎は役に立たないだろうか?

Q5. コンピュータシミュレーションとは何だろうか? どういうしくみで動くのだろうか? コンピュータシミュレーションで何がわかるのだろうか? また何がわからないのだろうか? それはなぜだろうか?

講義目的: 到達目標

講義目的: クラウドコンピューティング、 新しいネットワークアーキテクチャ、 新しいネットワークサービスなど、 ネットワーキングとコンピューティングの融合によって実現される「ネットワークコンピューティング」の基礎を、 実習によって深く理解する。

到達目標: 簡単なネットワークコンピューティング環境を構築、 実装、 テストできるようになる。

授業方法

講義およびコンピュータを用いた演習

成績評価

平常レポート

スケジュール

  2024/ 9/25 Debian GNU/Linux セットアップ
  2024/10/ 2 UNIX (UNIX とは、ユーザ権限、パッケージ管理)
  2024/10/ 9 Debian GNU/Linux セットアップ〜パッケージ管理
  2024/10/16 シェル (ファイル操作、リダイレクト、パイプ)
  2024/10/23 X ウィンドウシステム & ウィンドウマネージャ
  2024/10/30 エディタ (Emacs チュートリアル)
  2024/11/ 6 シミュレータ導入 (インストール、実行、可視化)
  2024/11/13 Python 言語 (1) (名前、変数、式)
  2024/11/20 Python 言語 (2) (文、スコープ、サブルーチン)
  2024/11/27 Python 言語 (3) (オブジェクト指向プログラミング)
  2024/12/ 4 シミュレータ解説 (1) (概要、エージェント)
  2024/12/11 シミュレータ解説 (2) (モビリティ、可視化)       
  2024/12/18 ソフトウェア設計・実装 (1)
  2025/ 1/ 8 ソフトウェア設計・実装 (2)



大崎が担当する科目に共通の連絡事項・アドバイス

注意事項、 教育方針、 学習のポイント、 病欠/公欠の時に何をすればよいか等を説明しています。

  大崎が担当する科目に共通の連絡事項・アドバイス
  https://lsnl.jp/~ohsaki/lecture/



Debian GNU/Linux のインストール

実習の流れ

1. 解説 (20 分)
2. 実習 (70 分)
3. リフレクションシート記入 (10 分)

チーム分けの方針

- いろいろな人とチームになる
- チームの人数は自由に決めてよい

態度目標

- しゃべる
- 質問する
- 説明する
- 動く (立ち歩く)
- チームで協力する
- チームに貢献する

内容目標

- VM 上に Debian GNU/Linux (bookworm) (amd64) をクリーンインストールできるようになる。

- CapsLock キーを Ctrl キーに割り当てられるようになる。

- コンソールのフォントを好みのものに変更できるようになる。

- ゲスト OS から自宅および大学の無線 LAN に接続できるようになる。

課題

課題 1

自身の PC に VirtualBox をインストールし、 ゲスト OS として Debian GNU/Linux (bookworm) (amd64) をクリーンインストールせよ。

デスクトップ環境 (GNOME、KDE 等)は「なし」でインストールせよ。 GUI やポインティングデバイスを使用せず、コンソールで一通りの操作を行え。

課題 2

CapsLock キーを Ctrl キーに割り当てよ。

課題 3

コンソールのフォントを好みのものに変更せよ。

課題 4

大学の無線 LAN に接続せよ。

ヒント

- ハイパーバイザには Oracle Virtual Box を推奨するが、こだわりがあるなら他の仮想化環境を使ってもよい。

Virtual Box
https://www.virtualbox.org/

- Debian GNU/Linux の リリースは bookworm、アーキテクチャは amd64 を使う。

Debian “bookworm” Release Information
https://www.debian.org/releases/stable/

- インストーラの ISO イメージは debian-12.7.0-amd64-netinst.iso を使うとよい。

debian-12.1.0-amd64-netinst.iso
http://ftp.kddilabs.jp/pub/debian-cd/current/amd64/iso-cd/

- キーボードの設定は /etc/default/keyboard ファイルに書く。

> diff -u /etc/default/keyboard.orig /etc/default/keyboard
--- /etc/default/keyboard.orig  2021-04-01 23:42:54.942990648 +0900
+++ /etc/default/keyboard       2021-07-25 06:38:43.408057698 +0900
@@ -5,6 +5,6 @@
 XKBMODEL="pc105"
 XKBLAYOUT="us"
 XKBVARIANT=""
-XKBOPTIONS=""
+XKBOPTIONS="ctrl:nocaps"
 
 BACKSPACE="guess"

- テキストエディタは nano を使うのが簡単。

- フォントの設定は /etc/default/console-setup ファイルに書く。

- コンソール用のフォントは /usr/share/consolefonts ディレクトリに格納されている。

- コンソールはそのままでは ISO-8859-1 しか表示できない (日本語は表示できない) ことに注意。

レポート課題 2024/09/25

実習終了後に自習を行い、 到達目標まで到達せよ。 疑問に思った点、 わからない点は各自で信頼できる文献を用いて調査せよ。

その後、「今週の作業内容」、 「『内容目標』をどの程度達成できた/できなかったか」、 「質問・要望・コメント」、 「感想」を「ネットワークコンピューティング実習」レポート送信フォームから送信せよ。

提出方法: 「レポート課題提出フォーム」から送信せよ。 レポートが正しく提出されると、レポートの控えが自身のメールアドレス宛に送信される。 レポートの控えは成績発表まで保存しておくこと。 レポートが再提出された場合は、 新しいほうを採点対象とする。

提出期限: 次回の授業開始の 48 時間前とする (例えば、 9/25(水) の課題であれば、 10/2(水) 9:00am の 48 時間前である 9/30(月) 9:00am)。 期限を過ぎたものは受理しない。

注意事項: 「質問・要望・コメント」は匿名にした上で公開する (講義ページに掲載する)。 公開されて困る内容は「質問・要望・コメント」等に含めないこと。 個人的な質問・相談等は「感想」の覧に記入せよ。

質問 要望コメント

- Debianの仮想環境を立てることには成功したのですがDevian desktopのインストールのところを消し方が分からずEnterで次に進んでしまい、Desktop画面とGNOMEを余分にインストールしてしまい、SSHサーバーをインストールすることができませんでした。この場合どのようにすれば講義動画の画面に戻ることができますか?

再インストールするのが一番簡単です。root で tasksel コマンドを実行すればタス
ク単位でモジュールの選択は可能です (が、いろいろよく分かっていない限りおすす
めしません)。

- Debianの仕様がわからに事が多く、基本的な操作もわかっていないことが多いため基本的な操作についての説明が少しほしい。

第 2 回、第 3 回で学びます。

- 講義ビデオを通して課題1〜3まで達成できました。課題4の解説もお願いしたいです。

第 2 回の「情報源」を見てください。

- ゲストOSから無線LANに接続するためには、領域実習Aで行ったWi-Fiの設定ファイルを書き換えるというような作業は必要ですか?

  いいえ。ゲスト OS は有線の Ethernet に接続していると思っています。



UNIX (UNIX とは、ユーザ権限、パッケージ管理)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- Debian GNU/Linux の主要なコマンドを理解する。

- デフォルトのシェルを fish に変更できるようになる。

- sudo コマンドを利用できるようになる。

- 端末マルチプレクサ (GNU screen) を利用できるようになる。

課題

課題 1

「Debian GNU/Linux リファレンスカード」のハードコピーを一部入手せよ (自分でプリントアウトしても、 誰かにプリントしてもらってもよい)。 便利そうなコマンドを 3 つ選び、 自身の計算機で試してみよ。

Debian GNU/Linux リファレンスカード
https://www.debian.org/doc/user-manuals#refcard

課題 2

fish をインストールし、 デフォルトシェルを fish に変更せよ。

課題 3

sudo パッケージをインストールし、 sudo コマンドを利用できるようにせよ。

課題 4

GNU screen パッケージをインストール・設定し、 仮想端末を利用できるようにせよ。

略解

課題 1

省略

課題 2

以下、# は root のプロンプトを、$ や > は一般ユーザのプロンプトを表す。
ohsaki はユーザ名 (実行する場合は自身のログイン名に変更する)。

root でログイン
# apt install fish
一般ユーザでログイン
$ chsh -s /usr/bin/fish
Password: ********
Ctrl-D でログアウトし、一般ユーザで再ログイン
> 

注意: 何をやっているか完全に理解するまでは、絶対に root のシェルを変更しない
こと。root のシェルの変更に失敗する (存在しないシェルを指定する) と一切ログ
インできなくなるので慎重に作業すること。

課題 3

root でログイン
# apt install sudo
ユーザ ohsaki を sudo グループに追加
# adduser ohsaki sudo
一般ユーザでログイン
root 権限で whoami コマンドを実行
> sudo whoami
  :
  :
[sudo] password for ohsaki: ********

課題 4

screen パッケージをインストール
> sudo apt install screen
~/.screenrc ファイルを作成
> echo 'escape ^Z^Z' >.screenrc
screen を起動
> screen

Ctrl-z → c: 新しいスクリーンを作成
Ctrl-z → SPACE: スクリーン切り替え

ヒント

- Alt + F1〜F4 でコンソールを切り替えられる。

- パッケージ管理は root 権限が必要。apt install でインストールできる。

- シェルの変更は chsh でできる。

- sudo コマンドを実行するには、ユーザが sudo グループに所属している必要がある。

- グループの変更は、再ログインするまで反映されない。

- GNU screen のエスケープキーは Ctrl-Z に変更するとよい。

情報源

- マニュアルページ

man man

- ドキュメント

/usr/share/doc/パッケージ名

- オンラインドキュメント

Linux distribution
https://en.wikipedia.org/wiki/Linux_distribution

Unix/Linux Command Reference
https://files.fosswire.com/2007/08/fwunixref.pdf

Debian リファレンス (特に、1 章 GNU/Linux チュートリアル)
http://www.debian.org/doc/manuals/debian-reference/index.ja.html

Debian 管理者ハンドブック
https://debian-handbook.info/browse/ja-JP/stable/index.html

Debian GNU/Linux リファレンスカード
https://www.debian.org/doc/user-manuals#refcard

The Linux Documentation Project
http://www.tldp.org/

サンプルセッション (参考: Vine Linux 上での実行例です)

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/02-session.html

コマンドの覚え方

ls    List Directory
      -l (Long), -a (All)
cat   conCATenate files (concatenate = 連結する)
      -n (Number)
cd    Change Directory
pwd   Print Working Directory
mkdir MaKe DIRectory
gcc   GNU Compiler Collection (もともとは GNU C Compiler)

レポート課題 2024/10/02

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

質問

- Unixが"."で始まるファイル名を隠す伝統を持っていたり、今回「.screenrc」を隠しファイルで作成した理由は何でしょうか?あっている使い方かわかりませんが、今回みたいに頻繁に書き換えるわけではない設定を変更するファイルを隠しファイルとして作成することで、lsコマンドでは表示されないようにするのは便利だと感じました。

「UNIX (のファイルシステム) を設計した人がそう設計したから」だと思います。

コメント

- 9月25日のCapsLockキーをCtrlキーに割り当てる課題を行ったあと、(Ctrlキーに割り当てた)CapsLockキー+Dでログアウトを試したところ、ログアウトはされるが(ホスト名) login: のあとに文字を入力できないことを確認したので共有します。調べた結果、私のパソコンでは、CapsLockキーを押すと「VK 240」というキーが送信されていることが分かりました。おそらくこれが原因であると考えています。「ctrl2cap」という、WindowsでCapsLockキーをCtrlキーに割り当てられるソフトを使うことで、クリーンインストールしたての状態でもCapsLockキーをCtrlキーとして機能することを確認しました。詳しい経緯は「どのような自習を行いましたか? 」の欄に記入しました。

Debian GNU/Linux セットアップ〜パッケージ管理

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

2024/09/25 および 2024/10/02 の内容目標をすべて達成できるようになる。

レポート課題 2024/10/09

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

質問

- 上記の通り、【Caps Lock】を一度押すと、キーボードが【Ctrl】キーが押されたままの状態になってしまいます。最初はWindows側の問題かと思いましたが、この現象はVM上でのみ発生します。調べたところ、固定キー機能が関係しているのではないかと考えましたが、詳細はよく分かりませんでした。試しに、固定キー機能の有効/無効を切り替える【Shift】キーを5回押す操作を試したところ、【Ctrl】キーが押された状態は解除されました。なぜ【Caps Lock】を押すとこのような現象が起こるのか、ご教授いただけますと幸いです。

 せっかくのアクティブラーニングですので、授業中に解決できている人に聞いてみてください。
 

要望

- 初回授業の際に話されていた、エミュレータについて興味があるため、それに関するお話を伺いたいです。

  どの話でしょう? ネットワークシミュレータなら 11/6(水) の実習で扱う予定です。



シェル (ファイル操作、リダイレクト、パイプ)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- 簡単なシェルスクリプトが書けるようになる

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/02.pdf

サンプルセッション (参考: Vine Linux 上の bash での実行例です)

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/03-session.html

課題

課題 1

/usr/bin ディレクトリに格納されているファイルの一覧を list というファイルに保存せよ。

課題 2

/usr/bin ディレクトリに格納されているファイルのうち、 m で始まるファイルの一覧を list-m というファイルに保存せよ。

課題 3

コマンド行で指定したディレクトリに格納されているファイルのうち、 ファイルサイズが最大のもののサイズとファイル名を表示するシェルスクリプトを作成せよ。

課題 4

コマンド行で指定した地域の、 今晩の天気予報を Web から取得し、 標準出力に表示するシェルスクリプトを作成せよ。

略解

課題 1

 > ls /usr/bin >list
 
 保存できているかの確認:
 > head list
 2to3-2.7
 411toppm
 7z
 7za
 7zr
 CuraEngine
 GET
 HEAD
 HTMLLinker
 JxrDecApp

課題 2

 > ls /usr/bin | grep '^m' >list-m
 
 保存できているかの確認:
 > head list-m
 m17n-db
 m4
 macptopbm
 madplay
 mag
 mail
 mail.mailutils
 mailq
 mailx
 make

課題 3

 プログラムの例
 https://lsnl.jp/~ohsaki/lecture/netcompx/2024/03-findmax.sh
 
 実行例:
 > chmod +x 03-findmax.sh
 > ./03-findmax.sh /usr/bin
 + dir=/usr/bin
 + shift
 + ls -l /usr/bin
 + awk { print $5, $9 }
 + sort -rn
 + head -1
 53756024 docker

課題 4

 プログラムの例
 https://lsnl.jp/~ohsaki/lecture/netcompx/2024/03-weather.sh
 
 実行例:
 > chmod +x 03-weather.sh
 > ./03-weather.sh sanda
 + area=sanda
 + shift
 + id=1de45589c3ffdf7ec3f72a09d94465bc89b562c10fdb719edc5140c935828285
 + lynx --dump https://weather.com/weather/tenday/l/1de45589c3ffdf7ec3f72a09d94465bc89b562c10fdb719edc5140c935828285
 + sed -n /^To\(night\|day\)/,/ mph/p
 Today
 
    78°/61°
    Partly Cloudy
    4%
    N 12 mph
 > ./03-weather.sh nisinomiya
 + area=nisinomiya
 + shift
 + id=0b564079717caa709f3a11a530951a66926be8f8f0227b6c2ccf18cd9da20f2d
 + lynx --dump https://weather.com/weather/tenday/l/0b564079717caa709f3a11a530951a66926be8f8f0227b6c2ccf18cd9da20f2d
 + sed -n /^To\(night\|day\)/,/ mph/p
 Today
 
    81°/67°
    Mostly Sunny
    2%
    N 12 mph

より深く学びたい人へ

(UNIX に限りませんが) オンラインドキュメントではなく、 書籍で知識を吸収することをおすすめします。 以下の本は特におすすめです。 特に上の 2 冊 (カーニハンとレイモンドの本) は「UNIX の哲学」を学ぶことができます。

- Brian W. Kernighan, Rob Pike, ``UNIXプログラミング環境,'' KADOKAWA, 2017.

- Eric S. Raymond, ``The Art of UNIX Programming,'' KADOKAWA, 2019.

- Shelley Powers, Tim O'Reilly, Jerry Peek, Mike Loukides, ``UNIX パワーツール,'' オライリージャパン, 2003.

レポート課題 2024/10/16

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

チャレンジ課題

- apt-cache search tetris を実行し、どのようなパッケージが存在するか見てみよ。

- ターミナル上でテトリス互換のゲームをプレイせよ。

- apt-cache search pacman を実行し、どのようなパッケージが存在するか見てみよ。

- ターミナル上でパックマン互換のゲームをプレイせよ。

- man ls を実行し、ls コマンドにどんなオプションがあるか見てみよ。

- ls(1) (ls コマンドの man ページ) 中に単語 color が何回登場するかを数えよ。

- /usr/bin 以下のコマンドのうち、Python のスクリプトであるもののコマンド名を列挙せよ。

- 現在の日経平均を表示する nikkei コマンドを作成せよ。

- fish のプロンプトを自分好みにカスタマイズせよ。

実況ビデオ 「テトリス互換ゲームを探して改造して遊んでみた」

GNU/Linux のターミナル上で実行できるテトリス互換ゲームを探し、 ソースコードに手を入れて、 既存のゲームを自分流に改造して楽しむ様子を収録したビデオです。

221012-tint.mp4 (01:03:59, 184 kb/s)
https://lsnl.jp/video/netcompx/2024/221012-tint.mp4

要望

- 実況ビデオ 「テトリス互換ゲームを探して改造して遊んでみた」を見ながら自分も同じようにやってみようと思い、tintをインストールするところまではできたのですが、そのあとのパスを通すという部分がよくわからず、tintを立ち上げることができなかったのでパスを通すということについて説明をしていただきたいです。また、cd /usr/games/lsとするとtint*と表示されファイルを開く方法が分からず、手詰まってしまったのでこの場合のファイルの開き方も教えてほしいです。

環境変数 PATH については以下を見てください。

1.5 シェルプロンプト
https://www.debian.org/doc/manuals/debian-reference/ch01.ja.html#_the_simple_shell_command

fish の場合は ~/.config/fish/config.fish 中で
set -x PATH /usr/local/bin /usr/bin /bin /usr/local/sbin /usr/sbin /sbin /usr/games
のように設定するのが一つの方法です。

コメント

- いつでもどこでも般若心経を唱えることができるシェルスクリプトを添付します。簡単なものですがシェルスクリプトの勉強と徳を積むことに活用してください

  以下に置きました。
  https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/hannya.sh



X ウィンドウシステム & ウィンドウマネージャ

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- X ウィンドウシステムを利用できるようになる

- ウィンドウマネージャ (xpywm) をインストールできるようになる。

- xpywm の基本的な操作法を理解し、ウィンドウに対する一般的な操作ができるようになる。

- xpywm のインストール場所および変更方法を理解し、簡単なカスタマイズができるようになる。

課題

準備

- sudo をインストールし、sudo コマンドが実行できる状態にしておく。

- fish をインストールし、デフォルトシェルを fish に変更しておく。

- LANG が ja_JP (日本語) になっていれば、以下を実行し、デフォルトロケールを en_US.UTF-8 に変更しておく。

> sudo dpkg-reconfigure locales

課題1

xpywm、 xpymon、 xpylog が利用可能な状態の X ウィンドウシステムを起動せよ。

課題2

xpywm のキーボードおよびマウス操作法を暗記せよ。

課題3

xpywm の文字およびフレームの色を自分好みのものにカスタマイズせよ。

課題4

Alt + Ctrl + 4 を押すと、以下の「Debian GNU/Linux Reference Card」を mupdf で開くように設定せよ。

Debian GNU/Linux Reference Card
https://www.debian.org/doc/manuals/refcard/refcard

略解

課題 1

もしまだなら、 事前に sudo コマンドのインストールと設定を済ませておく。

sudo コマンドのインストール・設定方法
# apt install sudo
# adduser 自分のログイン名 sudo ← 自分自身を sudo グループに追加する
いったんログアウト

インストール用スクリプトを wget で入手し、 シェル (sh) で実行する。 その後、 さまざまな設定ファイルを格納したアーカイブ (home.tgz) をホームディレクトリ上で展開する。

> wget -O - lsnl.jp/xpywm | sh
> tar xzvf home.tgz
> startx

home.tgz を展開すると、ホームディレクトリ以下の設定ファイルが上書きされることに注意せよ。

課題 2

以下に操作法の一覧がある。

xpywm
https://github.com/h-ohsaki/xpywm

課題 3

プログラム本体 (Python のスクリプト) xpywm の場所は which xpywm でわかる。

> which xpywm
/usr/local/bin/xpywm

このファイル xpywm 中の、 以下のような箇所

FRAME_COLOR = 'aquamarine1'
TITLE_COLOR = 'aquamarine3'

にある色名 (aquamarine1 や aquamarine3 など) を他の色名に書換えればよい。 X ウィンドウシステムが認識する色の名前は、

/usr/share/X11/rgb.txt

に書かれている。

xpywm の所有者は root のため、 (1) root の権限で書換える、 (2) ファイルの所有者を自分に変更する (chown コマンド)、 (3) ファイルを所有者以外でも書換えられるようにする (chmod コマンド)、 などの方法がある。

課題 4

mupdf パッケージをインストール。

> sudo apt install mupdf

PDF ファイルを取得し、mupdf で開けることを確認。

 > wget https://www.debian.org/doc/manuals/refcard/refcard; mupdf refcard 
 

~/.xpywmrc に以下の行を追加する。

KEYBOARD_HANDLER['4'] = {
    'modifier': X.Mod1Mask | X.ControlMask, 'command': 'mupdf ~/refcard &'
}

PDF ファイル refcard をホームディレクトリ以外にダウンロードした場合は上記のパス (~/) を変更する必要がある。 ~/.xpywmrc ファイルに間違いがあると xpywm (ウィンドウマネージャ) が起動しない (起動しようとしてエラーで終了する) ことに注意せよ。

UNIX 上で動作するウィンドウマネージャのリスト

The Comprehensive List of Window Managers and Compositors for Unix
https://www.gilesorr.com/wm/table.html

VirtualBox 上で X の解像度を変更する方法

VirtualBox 上で X Window System を起動すると、 デフォルトでは画面の解像度が 800x600 ピクセルになる。

X の設定ファイルを作成することで、 画面の解像度を変更することができる。

> wget lsnl.jp/xorg.conf      ← 設定ファイルをダウンロード
> cat xorg.conf               ← 設定ファイルの内容を確認
Section "Device"
  Identifier      "Configured Video Device" 
EndSection
Section "Monitor" 
  Identifier      "Configured Monitor"
EndSection 
Section "Screen"  
  Identifier      "Default Screen" 
  Monitor         "Configured Monitor"
  Device          "Configured Video Device" 
  SubSection "Display"
#     Modes "1920x1200"
    Modes "1280x1024"
  EndSubSection
EndSection
> sudo cp xorg.conf /etc/X11  ← 設定ファイルを /etc/X11/xorg.conf として保存 (新規作成)

レポート課題 2024/10/23

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

コメント

- 課題4について、error: cannot recognize version merkerwarning: trying to repair broken xrefwarning: repairing PDF documenterror: no objects foundmupdf: error: cannot open documentと表示されPDFが開けませんでした。

エラーメッセージを見る限り、正しい PDF ファイルではないのでしょう (壊れてい
る、別のファイル形式など)。

要望

- qutebrowserで日本語入力をする方法を教えていただけますか。

X ウィンドウシステムで日本語入力できるようにすればよい (そうすれば自動的に
qutebrowser でも日本語入力できるようになる) のですが、X ウィンドウシステムの
日本語入力はやや複雑です。

まず、Emacs 上で SKK で日本語入力できるようになることから始めるのがよいと思
います。

- どのようにすればよいかわからないチャレンジ課題もあったので、略解や解答例を出していただけると嬉しいです。また、調べても解決しなかったため、Alt+Ctrl+2,3の実行がうまく出来ない理由を教えていただけたら幸いです。

解答例は用意していないので、どうしてもわからない/できないものがあれば個別に
質問してください。Ctrl + Alt + 2 や Ctrl + Alt + 3 が実行できないのは、Emacs
や Firefox がインストールされてないからだと予想します。

チャレンジ課題

- X サーバの起動時に実行されるスクリプト ~/.xinitrc を読んでみよ。

- xlsfonts(1) を実行して、どのようなフォントが利用可能かを調べよ。

- xlsfonts -fn '-*-fixed-*' を実行して、どのような固定幅フォントが利用可能かを調べよ。

- 「urxvt -fn フォント名」によって好みのフォントで urxvt を起動せよ。

- X サーバのリソース設定ファイル ~/.Xdefaults を読んでみよ。

- ~/.Xdefaults を変更し、urxvt のカーソルおよび文字の色を好みのものに変更せよ。

- ~/.Xdefaults を変更し、Emacs のカーソルの色を好みのものに変更せよ。

- X サーバのキー定義ファイル ~/.Xmodmap を読んでみよ。

- xev(1) コマンドを用いて、Windows キーのキーコードを調べよ。

- ~/.Xmodmap を編集し、Windows キーを Meta_L キーに割り当てよ。

- ~/.xinitrc から起動している redshift が何をするプログラムかを調べよ。

- pkill redshift で redshift のプロセスを終了すると何が変化するか調べよ。

- ターミナル上で tail -f /tmp/xpywm.log を実行し、ウィンドウをいろいろ操作してみよ。ここで表示されるメッセージが何を意味するものかを推測せよ。

- xpywm の設定スクリプト ~/.xpywmrc を読んでみよ。

- Alt + Ctrl + F9 を押すと好みの音楽がシャッフル再生されるように設定せよ。

- Shift + Print を押すとデスクトップの画面ダンプを取得するように設定せよ。

- 18 ドットのビットマップフォントである ~lib/fonts/hiro18maru.bdf を読んでみよ。

- ~lib/fonts/hiro18maru.bdf の STARTCHAR 0065 から始まる行はフォント A の外形の定義である。データを書き換えて、A のフォントのデザインを好みのものに変更せよ。

エディタ (Emacs チュートリアル)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- Emacs の基本的な操作方法を習得し、ファイルを作成・編集できるようになる

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/03.pdf

課題

課題 1

Emacs をインストールせよ。

課題 2

Emacs のチュートリアルを起動し、 「もし Emacs が反応しなくなったら」までを実行せよ。

課題 3

「Hello!」という文字列が書かれた ~/foo.txt というファイルを Emacs のみを用いて作成せよ。

課題 4

Emacs のキーバインド一覧を表示し、 どのようなコマンドがあるかを眺めてみよ。 また、 (1) M-d、 (2) C-SPC、 (3) C-w、 (4) C-y というキー操作によってどのような処理が実行できるかを調べよ。

略解

課題 1

> sudo apt install emacs

課題 2

> Alt + Ctrl + 2 (Alt と Ctrl を押しながら 2 を押す、「emacs &」で起動してもよい)
> C-x RET l Japanese RET (言語環境を日本語に変更、M-x set-language-environment RET でもよい)
> M-h t (M-x help-with-tutorial RET でもよい)
※ C-x は Ctrl キーを押しながら x キーを押す
※ M-x は Alt キーを押しながら x キーを押す
※ RET は Enter キー (もしくは C-m)

課題 3

> C-x C-f foo.txt RET (M-x find-file foo.txt RET でもよい)
> Hello!
> C-x C-s (M-x save-buffer RET でもよい)
※ ~ はホームディレクトリを表す。

課題4

> M-h b (M-x describe-bindings RET でもよい)
> M-d: kill-word (単語単位の削除 (キル → キルリングに入るタイプの削除))
> C-SPC: set-mark-command (現在のポイント(カーソル位置)をマークする)
> C-w: kill-region (リージョン (マークとポイントの間) をキルする)
> C-y: yank (キルしたテキストをペーストする)

より深く学びたい人へ

(Emacs に限りませんが) オンラインドキュメントではなく、 書籍で知識を吸収することをおすすめします。 Emacs に関する良書は多くありませんが、 読むなら以下の本をすすめます。 「GNU Emacs マニュアル」は原文が GPL で公開されているので、 翻訳版も GPL で公開されています。

Richard Stallman, ``GNU Emacs マニュアル,'' 共立出版, 1988.
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/GNU_Emacs_Manual.pdf

GNU Emacs マニュアル 28.1
https://ayatakesi.github.io/emacs/28.1/html/index.html

ただし、 翻訳の質は共立出版のもののほうがはるかに良いです。

Debra Cameron, James Elliott, Marc Loy, Eric Raymond, Bill
Rosenblatt, ``入門 GNU Emacs 第 3 版, '' オライリー・ジャパン, 2007.

参考資料

GNUとは?
https://www.gnu.org/home.ja.html

自由ソフトウェアとは?
https://www.gnu.org/philosophy/free-sw.ja.html

チャレンジ課題

- shell-command (M-!) を用いて Emacs 上からコマンド「ls -l」を実行せよ。

- shell-command (M-!) を用いて Emacs 上からコマンド「man ls」を実行せよ。

- C-u M-! を用いて Emacs 上からコマンド「man ls」を実行せよ。「man ls」の出力はカレントバッファに挿入される。

- query-replace (M-%) を用いて、カレントバッファ内の文字列 file を FILE に置換せよ。

- 適当な段落に対して fill-paragraph (M-q) を実行し、段落を整形せよ。

- shell によって Emacs のバッファ内で fish を起動せよ。

- shell によって起動した fish でコマンド「ls -l」を実行せよ。

- shell によって起動した fish でコマンド「man ls」を実行せよ。

- コマンド「man ls」の出力を ~/ls.txt というファイルに保存せよ。

- 現在起動している Emacs において C-t がどのコマンドに割り当てられているかを調べよ。

- 現在起動している Emacs において forward-word がどのキーに割り当てられているかを調べよ。

- ~/.emacs の 141〜154 行目を変更しフォント (Emacs における face) の色を好みのものに変更せよ。

- 簡単な C 言語のプログラムを作成せよ。Emacs における c-mode の便利な機能を調べて、それらを試してみよ。

- 簡単な Python 言語のプログラムを作成せよ。py-mode の便利な機能を調べて、それらを試してみよ。

- make-frame-command (C-x 5 2) を実行し、新規にフレームを作成せよ。

- delete-frame (C-x 5 0) を実行し、現在のフレームを削除せよ。

レポート課題 2024/10/30

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

質問

- 大崎先生の授業形式は、アクティブラーニング型学習を体現したものだと感じています。この授業形式の主目的は、生徒同士が相互に助け合い、主体性、協働性、Mastery for serviceの精神を育むことだと認識していますが、その際の大崎先生の役割としてはどんなものがありますか?授業の指針を示すことでしょうか?それとも、生徒が興味を伸ばす道の選択肢、可能性を示してあげることでしょうか?

  アクティブラーニングが効果的に行われるように促進する (ファシリテートする) こ
  とだと思います。



シミュレータ導入 (インストール、実行、可視化)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- 「シミュレータ」および「エミュレータ」が何かを他人に説明できるようになる。

- 「エピデミックブロードキャスト」とは何かを他人に説明できるようになる。

- DTN シミュレータ (dtnsim) をインストールできるようになる。

- シミュレーション条件を変えて dtnsim を実行できるようになる。

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/04.pdf

課題

課題 1

「シミュレータ」および「エミュレータ」とは何かを、 それぞれの違いがわかるように説明せよ。

世の中にある○○シミュレータや○○エミュレータについて、 (1) それは本当にシミュレータ/エミュレータか、 (2) もしそうならそれはなぜか、 を考えて議論せよ。

課題 2

「エピデミックブロードキャスト」とは何かを説明せよ。

エピデミックブロードキャストがどういうものかを理解した後、 「エピデミックブロードキャストを使うと何ができそうか? (どんなアプリや用途に使えそうか?)」 を議論せよ。

課題 3

dtnsim をインストールせよ。

課題 4

dtnsim におけるエージェントの移動モデルを「グラフの CRWP」から「グラフ上のランダムウォーク」に変更してシミュレーションを実行せよ。

略解

課題 1

→ テキスト参照

課題 2

→ テキスト参照

課題 3

> sudo PIP_BREAK_SYSTEM_PACKAGES=1 pip3 install -U dtnsim
> dtnsim | cellx

課題 4

> dtnsim -h
option -h not recognized
usage: dtnsim [-v] [-s #] [-n #] [-r range] [-I id[,id]...] [-m mobility] [-p path] [-a agent] [-M monitor]
  -v            verbose mode
  -s #          seed of random number generator
  -n #          number of agents
  -r range      communication range [m]
  -I id[,id...] initial infected nodes
  -m mobility   name of mobility class (Fixed/FullMixed/LevyWalk/LimitedRandomWaypoint/RandomWalk/RandomWaypoint/graph.Fixed/graph.Sequential/graph.RandomWalk/grpah.CRWP)
  -p path       name of path class (NONE/Line/Grid/Voronoi)
  -a agent      name of agent class (CarryOnly/Random/Epidemic/P_BCAST/SA_BCAST/HP_BCAST/ProPHET)
  -M monitor    name of monitor class (Null/Log/Cell)
> dtnsim -m graph.RandomWalk | cellx

チャレンジ課題

- 「シミュレータ」という名称が付いたシステムやソフトウェアにどのようなものがあるか調べてみよ。それぞれについて、それらが本当にシミュレータの一種であるかを確認せよ。

- 「エミュレータ」という名称が付いたシステムやソフトウェアにどのようなものがあるか調べてみよ。それぞれについて、それらが本当にエミュレータの一種であるかを確認せよ。

- TCP/IP が、本当に通信網の分断に対して耐性がないかを実験で確認せよ。例えば、ISO イメージのような巨大なファイルのダウンロード中に Wi-Fi ルータの電源を ON/OFF してみよ。どのくらいの通信回線断であれば正常にダウンロードできるか調査してみよ。

- epidemic という英単語の意味を英英辞書で調べよ。

- 自身が使っている PC やスマートフォンで、ユニキャスト、マルチキャスト、ブロードキャストのどれが、どの程度使用されているかを調査せよ。

- 「which dtnsim」を実行することにより、dtnsim プログラムがどこにインストールされているかを調査せよ。

- 「sudo pip3 install dtnsim」によって、ファイルがどこにインストールされたかを調査せよ。

- pip3 コマンドを用いて dtnsim をアンインストールせよ。アンインストールされたことを確認した後、pip3 コマンドを用いて dtnsim を再度インストールせよ。

- エージェントの移動モデルをさまざまに変化させてシミュレーションを実行してみよ。それぞれの移動モデルにおいて、エージェントの移動パターンがどのように変化するかを観察せよ。グラフ上の移動モデルを使用する場合は、-p オプションによって経路もあわせて指定する必要があることに注意せよ。

- エージェントの通信プロトコルをさまざまに変化させてシミュレーションを実行してみよ。それぞれの通信プロトコルにおいて、通信特性がどのように変化するかを観察せよ。

- cellx ではオプションを指定することで、可視化方法をさまざまに変化させられる。以下のオプションを試してみよ。どのような目的の可視化の時に、どのようなオプションを指定すると望ましいかを考察せよ。

> cellx -h
option -h not recognized
usage: /usr/local/bin/cellx [-E] [-c #] [-M class] [-F rate] [-L rate] [-A alpha] [-m #] [file...]
  -E        enable macro expansion with cpp
  -c #      select color scheme
  -M class  monitor class (Null/SDL/SDL_Filter/PostScript) (default: SDL)
  -F rate   the number of frames per animation/fading
  -L rate   limit the frame rate (default: infinity)
  -A alpha  alpha for filtering effect (0 <= alpha <= 255)
  -m #  the number of frames to render (default: infinity)

-c 0〜7: カラースキームの変更
例: カラースキームを 1 番に変更
> dtnsim | cellx -c 1

-M class: モニターモジュールの指定
-A alpha: フィルタ効果の強さ (小さいほど残像が残る)
例: 残像を残すフィルタを有効にする
> dtnsim | cellx -M SDL_Filter -A 40

-L rate: フレームレートの上限
例: フレームレートを 30 フレーム/秒に抑える
> dtnsim | cellx -L 30

例: 上記の組み合せ
> dtnsim | -M SDL_Filter -A40 -L30

レポート課題 2024/11/06

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

Python 言語 (1) (名前、変数、式)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- Python の対話モード (REPL) を使えるようになる。

- Python で簡単な数値計算のプログラムが書けるようになる。

- Python のデータ構造 (数値・文字列・リスト・辞書・タプル) を使った簡単なプログラムが書けるようになる。

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/05.pdf

課題

課題 1

Python の対話モード (REPL) で 30 未満の素数の和および平均を計算せよ。

REPL - Python Interactive Shell
https://pythonprogramminglanguage.com/repl/

課題 2

Python の対話モード (REPL) で 30 未満の素数の二乗和を計算せよ。

課題 3

二次方程式 (a x^2 + b x + c = 0) の実数解を出力するプログラム qeq.py を作成せよ。 係数 a, b, c を qeq.py の引数として受け取り、 実数解を (r_1, r_2) の形式で表示せよ。 ただし、実数解が存在しない場合は (None, None) と表示せよ。

実行例:
> ./qeq.py 1 0 -4
(2.0, -2.0)
> ./qeq.py 2 0 -1
(0.7071067811865476, -0.7071067811865476) ← 1/sqrt(2)
> ./qeq.py 1 -4.6 4.08
(3.3999999999999995, 1.2000000000000002) ← 1.2 と 3.4
> ./qeq.py 1 1 1
(None, None) ← 解なし

課題 4

課題 3 を if 文を使わずに例外をトラップすることで実現する qeq-trap.py を作成せよ。

ヒント: math.sqrt の例外 ValueError を補足すればよい。

略解

課題1

> python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 2+3+5+7+11+13+17+19+23+29
129
>>> (2+3+5+7+11+13+17+19+23+29)/10
12.9
12.9
>>> ← Ctrl + D (EOF) で終了

(参考)
>>> 2+3+5+7+11+13+17+19+23+29
129
>>> _/10 ← _ で直前の演算結果を参照できる
12.9
>>> sum([2,3,5,7,11,13,17,19,23,29]) ← 総和を計算する関数 sum を使う方法
129
>>> l=[2,3,5,7,11,13,17,19,23,29]
>>> sum(l)/len(l)

課題2

>>> l=[2,3,5,7,11,13,17,19,23,29]
>>> s=0
>>> for v in l:
...     s+=v**2
... 
>>> s
2397
>>> ← Ctrl + D (EOF) で終了

(参考)
>>> sum(v**2 for v in l) ← ジェネレータを使う方法
2397
>>> sum(map(lambda v: v**2, l)) ← 関数 map を使う方法
2397

課題3

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-1/qeq.py

> wget https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-1/qeq.py
> chmod +x qeq.py
> ./qeq.py 1 0 -4
(2.0, -2.0)
> ./qeq.py 2 0 -1
(0.7071067811865476, -0.7071067811865476) ← 1/sqrt(2)
> ./qeq.py 1 -4.6 4.08
(3.3999999999999995, 1.2000000000000002) ← 1.2 と 3.4
> ./qeq.py 1 1 1
(None, None) ← 解なし

課題4

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-1/qeq-trap.py

チャレンジ課題

- Zen of Python を読んでみよ。自分が知っているプログラミング言語 (例えば C 言語や Java 言語) に当てはまるものはどれで、当てはまらないものはどれかを考えよ。

- 以下のプログラミング言語の系譜図を入手し、Python がどのようなプログラミング言語の影響を受けているかを確認せよ。また、自分が知っているプログラミング言語 (例えば C 言語や Java 言語) と Python は系譜図においてどのような関係になるかを調査せよ。

History of Programming Languages
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/PLhistory.pdf

- Wikipedia における ALGOL 言語の解説を読んでみよ。ALGOL 言語で書かれたプログラムを読み、Python 言語のプログラムとどこがどのように似ているか (または似ていないか) を分析せよ。

ALGOL
https://en.wikipedia.org/wiki/ALGOL

- Python 3 の最新版のソースコードを入手せよ。ダウンロードしたソースコードのアーカイブを展開し、ソースコードのアーカイブにどのようなファイルが含まれているかを確認せよ。アーカイブ中に、Python 学習の上で役立ちそうなどのようなファイルが含まれているかを調べよ。

Python Downloads
https://www.python.org/downloads/

- 最新版の Python 3 をソースコードからビルドせよ。Debian GNU/Linux で Python 3 をビルドするためには、ビルドに必要なパッケージをインストールする必要があることに注意せよ。

- Python 3 における識別子の仕様が説明されている、Python の公式ドキュメントを探せ。

- Python 起動直後に globals() 関数を実行し、どのようなグローバルシンボルが定義されているかを調べよ。また、「a=123」および「s = 'hello!'」を実行した後に、再度 globals() 関数を実行し、グローバルシンボルがどのように変化したかを確認せよ。その後、「del a」を実行し、再度 globals() 関数を実行することでグローバルシンボルがどのように変化したかを確認せよ。

- 変数の型は type() 関数で確認できる。type(123)、type(123.45)、type('Hello')、type(5/4)、type(True)、type(None)、type(24.8 / 12.4)、type(1 + 1 == 2) を実行し、それぞれの引数の型を確認せよ。

- Python の整数 (int) が無限精度であることを実験で確認せよ。例えば「1234 の 1234 乗」を計算してみよ。

- 実数 123.45 の整数部は int(123.45) によって取り出せる。int() 関数のリファレンスマニュアルを探して読んでみよ。int() 関数は何をするための関数かを調べよ。

- 変数 x の型が int の場合、x = float(x) によって float 型に変換できる。float() 関数を使用せずに整数を実数に変換する方法は他にどのようなものがあるかを考えよ。

- Python の文字列がイミュータブルであるのはなぜか。

- 文字列 Hello, World! を変数 s に格納せよ。変数 s の (1) 最初の文字、(2) 最後の文字、(3) 最初から 3 番目の文字、(4) 最初の 3 文字、(5) 最後の 3 文字を出力する方法を答えよ。

- 文字列 Hello, World! を変数 s に格納せよ。変数 s を構成する各文字を一文字ずつ順番に出力せよ。できるだけ簡潔なプログラムで実現せよ。

- 100 以下のすべての 7 の倍数 (7, 14, ..., 98) を昇順に格納したリストを機械的に作成し、変数 l に格納せよ。変数 l の (1) 最初の要素、(2) 最後の要素、(3) 最初から 3 番目の要素、(4) 最初の 3 つの要素、(5) 最後の 3 つの要素を出力する方法を答えよ。

- 100 以下のすべての 7 の倍数 (7, 14, ..., 98) を昇順に格納したリストを機械的に作成し、変数 l に格納せよ。変数 l に格納されているすべての値を順番に出力せよ。できるだけ簡潔なプログラムで実現せよ。

- Python におけるリストは、「データ構造とアルゴリズム」における「配列」と「リスト」の両方の特徴を持っている。「データ構造とアルゴリズム」における「配列」の利点・欠点と、「リスト」の利点・欠点は何か。

- Python におけるリストは、「データ構造とアルゴリズム」における「配列」と「リスト」の両方の特徴を持っている。どのようなデータ構造を用いればそのようなデータ構造が実現できるかを考えよ。

- Python の関数では、例えば return 1, 2, 3 によって 3 つの整数を呼び出し元に返すことができる。なぜこのようなことができるかを調べよ。そのためにまず、リファレンスマニュアルにおける return 文の説明を読んでみよ。その後、リファレンスマニュアルにおける tuple 型の説明を読んでみよ。

- 自分が知っているプログラミング言語 (例えば C 言語や Java 言語) で連想配列が利用できるかを調べよ。連想配列が使用できない場合は、非標準のライブラリ等を使用して連想配列が利用できるようになるかを調査せよ。

- C 言語で書かれたプログラムを入手せよ (自分で作成したプログラムがあればそれが望ましい)。そのプログラムを Python で書き直してみよ。

- 「プログラミング実習 III」の課題の中から、好きなものを一つ選び、そのプログラムを C 言語ではなく Python 言語で作成してみよ。C 言語と比較して、Python 言語での開発がどの程度楽になるか。

補足: Python に関する情報へのポインタ

Python のドキュメントは十分に整理・体系化されておらず、 特に、 Python を学び始めたばかりの頃はどのドキュメントを読めばいいのか、 どこに探している情報が書かれているかがわかりづらい。

最も参考になるのは、 Python の公式ドキュメントである。

Python の公式ドキュメント
https://docs.python.org/3/

Web ブラウザから参照できるのは良いことだが、 Web ブラウザの制約のため、 検索性や一覧性には欠ける。

man コマンドで python のマニュアルページを見ることができる。 ただし、 python プログラムの起動時オプションや環境変数に関する説明くらいしか書かれていない。

Python のマニュアルページ
$ man python3

Python の世界では、 (1) python を対話モードで起動し、 help() 関数によってヘルプモードに入ってからヘルプを参照する、 (2) Python に付属する pydoc コマンドを使ってコマンドラインからヘルプを参照する、 というのが普通の (標準で用意されている) ドキュメント参照方法である。

対話モードでヘルプを参照してみよう。

 % python3
 Python 3.7.1 (default, Oct 26 2018, 10:39:38)
 [GCC 6.3.0 20170516] on linux
 Type "help", "copyright", "credits" or "license" for more information.
 >>> help()
       
 Welcome to Python 3.7's help utility!
       
 If this is your first time using Python, you should definitely check out
 the tutorial on the Internet at https://docs.python.org/3.7/tutorial/.
       
 Enter the name of any module, keyword, or topic to get help on writing
 Python programs and using Python modules.  To quit this help utility and
 return to the interpreter, just type "quit".
       
 To get a list of available modules, keywords, symbols, or topics, type
 "modules", "keywords", "symbols", or "topics".  Each module also comes
 with a one-line summary of what it does; to list the modules whose name
 or summary contain a given string such as "spam", type "modules spam".
       
 help> len
 
 Help on built-in function len in module builtins:
 
 len(obj, /)
     Return the number of items in a container.
 
 help> list.index
       
 Help on method_descriptor in list:
 
 list.index = index(self, value, start=0, stop=9223372036854775807, /)
     Return first index of value.
     
     Raises ValueError if the value is not present.

残念ながら、 対話モードのヘルプは「ないよりはあったほうが良い」くらいで、 非常に分かりづらく、 使いづらい。 Python の初心者が対話モードのヘルプを使って知りたいことを調べる、 というのはほぼ絶望的である。

pydoc コマンドも同じようなものだ。 例を示そう。

 % pydoc3 len
 
 Help on built-in function len in module builtins:
 
 len(obj, /)
     Return the number of items in a container.
 
 % pydoc3 list.index
 
 Help on method_descriptor in list:
 
 list.index = index(self, value, start=0, stop=9223372036854775807, /)
     Return first index of value.
     
     Raises ValueError if the value is not present.

対話モードのヘルプも、 pydoc コマンドも、 初心者にとってあまり役立たない理由は、 (1) Python のクラス名やメソッド名を知っていなければドキュメントを見られない、 (2) 表示されるのがリファレンスマニュアルではなく、 クラスやメソッドの doc 文字列 (ソースコード中に記載されたコメントのようなもの) だからだ。

リストの index メソッドの説明は、 実はリファレンスマニュアルの「5. Data Structures」中にある。

5. Data Structures
https://docs.python.org/3/tutorial/datastructures.html?highlight=index

対話モードのヘルプや pydoc コマンドでは、 上記のような情報を (公式ドキュメントとして存在しているにもかかわらず) 参照できない。 対話モードのヘルプでは、 リファレンスマニュアルの一部は表示されるので、 余計に混乱する状況にある。

Python の入門書としては、 以下をおすすめする。 もっと薄い本や、 もっと安い本もあるが、 「内容が簡単そうか?」、 「値段が安いか?」 という基準で選ぶのではなく、 本の中身で選ぼう。

Bill Lubanovic, ``入門 Python 3,'' オライリージャパン, 2015.

レポート課題 2024/11/13

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

質問

- 要素を組み上げていくことで、複雑系を思い通りにプログラムすることはできますか?それとも、論理的にどうなっているかはわからないけど、なんか作ることができたというのが現状でしょうか?(例えばディープラーニングなど)

「思い通りに」が何なのかによります。例えば、オペレーティングシステムや Web
ブラウザは大規模ですが、構造化プログラミングやオブジェクト指向プログラミング
で思い通りのものが実現されています。一方、「脳のような高機能なシステムを作り
たい」という思いなら、どう作ればいいのか、そもそも作れるのかもわかっていない
状態だと思います。レシピがあれば作れる、レシピがなければ (不明なら) 作れない、
と同じだと思います。

- 自分の家では有線接続することが困難なのですが、wifiでしかネットワークに接続できない環境では家でサーバーを立てることは難しいでしょうか?

  いいえ。有線/無線は基本的に関係ありません。私の自宅サーバも無線接続です。



Python 言語 (2) (文、スコープ、サブルーチン)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- Python で、ループや条件判定を使った簡単なプログラムを書けるようになる。

- Python で、文字列や辞書を使った簡単なプログラムを書けるようになる。

- Python のジェネレータや関数 filter を使った簡単なプログラムを読めるようになる。

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/06.pdf

課題

課題 1

1 から 100 の整数のうち、「偶数でなく」かつ「3 で割り切れず」かつ「1 桁目の数字が 0 または 5 でない」ものを出力するプログラム num.py を示せ。

(実行例)
> ./num.py
1
7
11
13
17
19
23
29
31
37
41
43
47
49
53
59
61
67
71
73
77
79
83
89
91
97

プログラムのテンプレート
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-2/num-skel.py

課題 2

コマンド行から半角英数字で構成される文字列を読み込み、 文字列を構成する各文字の出現回数を表示するプログラム count.py を示せ。

(実行例)
> ./count.py hello
h 1
e 1
l 2
o 1
> ./count.py 'I am a Python programmer.'
I 1
  4
a 3
m 3
P 1
y 1
t 1
h 1
o 2
n 1
p 1
r 3
g 1
e 1
. 1

プログラムのテンプレート
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-2/count-skel.py

課題 3

課題 1 をジェネレータを使って記述した以下のプログラムを読み解け。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-2/num-generator.py

Generators
https://wiki.python.org/moin/Generators

課題 4

課題 1 を関数 filter を使って記述した以下のプログラムを読み解け。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-2/num-filter.py

Built-in Functions filter(function, iterable)
https://docs.python.org/3/library/functions.html#filter

略解

課題 1

サンプル
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-2/num.py

課題 2

サンプル
https://lsnl.jp/~ohsaki/lecture/netcompx/2024/python-2/count.py

課題 3

省略

課題 4

省略

チャレンジ課題

- Python の標準ライブラリのソースコードを眺めてみよ。プログラムのインデントには、空白またはタブのどちらが使われているか、また、インデントの深さはいくつかを調べよ。

- Python 言語のプログラムのインデントには、空白とタブのどちらを使うことが望ましいか。空白とタブのそれぞれの利点・欠点を考えてみよ。

- 空白 4 つのインデントと、空白 8 つのインデントを混在させたプログラムをいくつか作成してみよ。それらののプログラムを実行し、どのような場合にエラーになり、どのような場合にエラーにならないかを調査せよ。

- C 言語で書かれたプログラムを Python 言語に移植してみよ。C 言語のプログラムの行数と、Python 言語のプログラムの行数を比較せよ。C 言語と比較して、Python 言語だとどれくらい少ない行数でプログラムが書けるだろうか。

- プログラミング言語の「表現力」に関する以下の説明を読んでみよ。

Comparison of programming languages - Expressiveness
https://en.wikipedia.org/wiki/Comparison_of_programming_languages#Expressiveness

- テキスト中の、「range(n) は 0 から n - 1 までのリストを作成する組み込み関数である」という説明は厳密には誤りである。range() 関数の公式ドキュメントを読み、上の説明のどこが間違いであるかを答えよ。

- range() 関数を使用して、2〜100 までの偶数を表示するプログラムを示せ。

- REPL で「range(0, 10)」を実行すると何が表示されるかを確認せよ。同様に、「list(range(0, 10))」を実行すると何が表示されるかを確認せよ。これらの実行結果が異なる理由を説明せよ。

- REPL で「range(0, 10)」を実行すると何が表示されるかを確認せよ。同様に、「range(0, 10)[:]」を実行すると何が表示されるかを確認せよ。これらの実行結果が異なる理由を説明せよ。

- プログラミング言語における「式」と「文」の違いは何か。あるコード片が、式なのか文なのかはどうすれば見分けることができるかを考えよ。

- 変数 a と変数 b に 123 を代入する場合、C 言語では「a = b = 123;」のように書ける。Python 言語ではどのように書けばよいかを答えよ。また、なぜそのように書く必要があるのかの理由もあわせて答えよ。

- サブルーチン (subroutine)、手続き (procedure)、関数 (function)、サブプログラム (subprogram) それぞれの英単語の意味を、英英辞典で調べてみよ。それぞれの英単語のニュアンスがどのように異なるかを説明せよ。

- Python 言語で書かれた何らかのプログラムを入手し、そのプログラム中の関数定義を見てみよ。それらの関数は、意味としては、サブルーチン (subroutine)、手続き (procedure)、関数 (function)、サブプログラム (subprogram) のどの名称を使うのがふさわしいかを考えよ。

- テキスト 5.3 節のように、Python 言語では参照渡しができないため、関数呼び出しの副作用として引数の値を変化させるような関数は作れない。Python 言語で inc(x) のような処理を実現するためには、「x = inc(x)」のように書く以外にどのような方法があるかを考えよ。

- Python 言語では、C 言語の「ポインタ」に相当するものは利用できるかを調査せよ。

- 引数のデフォルト値 (テキスト 5.3 節) として、リストや辞書を指定することが望ましくない理由を調査せよ。

- Python では関数定義をネストすることができる (テキスト 5.3 節)。関数がネストできることの利点・欠点は何か。

レポート課題 2024/11/20

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

質問

- 私は日本語配列のキーボードを使用していますが、Emacsでキーボード入力しようとすると、US配列のキーボードとして認識されてしまいます。日本語配列に対応させることはできないのでしょうか。

もちろん可能です。以下のページを見てください。

Keyboard
https://wiki.debian.org/Keyboard

インストールやセットアップを解説した以下のビデオでも言及したような気がします。

講義ビデオ (パスワードが必要です)
https://lsnl.jp/video/netcompx/2024/

221019-debian-install.mp4
221019-debian-setup.mp4
221019-debian-setup2.mp4 

要望

- 安めのUSキーボードのノートPCの購入を考えています。おすすめのサイトなどあったら教えてください。

  私はいつも eBay で買っています。



Python 言語 (3) (オブジェクト指向プログラミング)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- オブジェクト指向プログラミングとは何か、他人に説明できるようになる。

- Python で簡単なクラスを書けるようになる。

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/07.pdf

課題

課題 1

以下の英文を「できるだけカナタナ語を使用せずに」日本語に訳せ。

Object-oriented programming
https://en.wikipedia.org/wiki/Object-oriented_programming

Object-oriented programming (OOP) is a programming paradigm based on
the concept of "objects", which can contain data and code: data in
the form of fields (often known as attributes or properties), and
code, in the form of procedures (often known as methods).

課題 2

「オブジェクト」と「クラス」の違いを、他の受講生がわかるように説明せよ。

課題 3

テキスト p. 5 を参考に、 0〜32,767 の疑似乱数を返す、 関数 myrand および関数 mysrand を手続き型プログラミングで実装せよ。 最初に mysrand(123) を呼び出し、 myrand() を 10 回呼び出した時の返り値をそれぞれ出力するプログラムを示せ。

課題 4

テキスト p. 7 を参考に、 0〜32,767 の疑似乱数を返す、 関数 myrand および関数 mysrand をオブジェクト指向プログラミングで実装せよ。 最初に mysrand(123) を呼び出し、 myrand() を 10 回呼び出した時の返り値をそれぞれ出力するプログラムを示せ。

略解

課題 1

回答の例:

オブジェクト指向プログラミング (OOP) は、 データとコードを含む「オブジェクト」という概念に基づくプログラミングパラダイムで、 データはフィールド (属性やプロパティと呼ばれることが多い) の形で、 コードはプロシージャ (メソッドと呼ばれることが多い) の形で格納される。

物体指向プログラム作成 (OOP) は、 資料と符号を含む「物体」という概念に基づくプログラム作成方法論で、 資料は領域 (「属性」や「所有物」と呼ばれることが多い)の形で、 符号は手続(「方法」と呼ばれることが多い)の形で格納される。

課題 2

(略解) オブジェクト指向プログラミングにおいて、 オブジェクトの型が「クラス」であり、 あるクラスの実体が「オブジェクト」である。

---- 電子情報通信ハンドブック: クラス [class]
クラス [class]

 クラスは Smalltalk-80 , C++ をはじめとする多くのオブジェクト指向言語において, 個々のオブジェ
 クト(インスタンス)を定義する雛型として使われるモジュールをいう.クラスは通常, 各インスタンス
 の内部状態を保持する変数(インスタンス変数)や, 各インスタンスについて実行可能な操作(メソッド)の
 定義を含んでいる.クラスの第三の役割として各インスタンスがサポートするプロトコル(メソッド名と
 各メソッドの引数や返値の型)を定めることがあげられ, 言語によってはこれをインタフェースという名称
 で独立に扱うこともできる.
(久野)

---- 電子情報通信ハンドブック: オブジェクト [object]
オブジェクト [object]

 オブジェクトは, 物理的, 概念的なまとまりをなす「もの」の機能や性質をモデル化した概念である.
 これは内部データと対応する手続きとをもつソフトウェア要素とみることができる.通常, 類似した機能を
 もつオブジェクトはクラスとしてまとめられ, 複数のオブジェクト間には階層関係を定義する.そし
 て, 継承機能によって上位オブジェクトの機能を下位オブジェクトに伝えることで情報の重複を避け, 
 利用法を明確化する.知識表現としてはフレーム, 意味ネットワークに近く, 応用システムにおいて
 は対象システムのモデル化にしばしば利用される.
(寺野)

課題 3

省略

課題 4

省略

チャレンジ課題

- 以下は python3(1) の DESCRIPTION を翻訳したものである。これをカタカナを使わない文章に書き直せ。

 Python はインタプリタ型の対話型オブジェクト指向プログラミング言語であ
 り、非常に明快な構文と驚くべきパワーを兼ね備えています。Python でのプ
 ログラミングの入門については、Python チュートリアルを参照してください。
 Python ライブラリリファレンスは、組み込みと標準の型、定数、関数、モジュー
 ルのドキュメントです。最後に、Python リファレンスマニュアルは、コア言
 語の構文とセマンティクスを(おそらく)詳細に記述しています。(これらの
 文書は以下のインターネットリソースから入手できます。また、あなたのシス
 テムにもインストールされているかもしれません。)
 
 Python の基本的な力は、C や C++ で書かれた独自のモジュールで拡張するこ
 とができます。ほとんどのシステムで、そのようなモジュールは動的にロード
 されます。Python はまた、既存のアプリケーションの拡張言語としても適応
 可能です。ヒントは内部ドキュメントを参照してください。
 
 インストールされた Python モジュールやパッケージのドキュメントは、
 pydoc プログラムを実行することで見ることができます。

- 「プログラム (program)」と「プログラミング (programming)」の違いは何か。英英辞典 (例えば Oxford Learner's Dictionary) でそれぞれの英単語の意味を調べた結果にもとづいて回答せよ。

- 英単語 object には複数の意味がある。object という英単語の意味を英英辞典で調べよ。また、「オブジェクト指向プログラミング」における object は、それらの中のどの意味か。

- 並列処理 (parallel processing) と並行処理 (concurrent processing) の違いは何か。

- Python 言語で並列処理を記述できるか? また、Python 言語で並行処理を記述できるか? 理由もあわせて答えよ。

- オブジェクト指向プログラミングで記述されていると思われる Python プログラムを入手せよ。そのプログラムが本当にオブジェクト指向プログラミングで記述されているかを確認せよ。確認した結果と、確認した方法の両方を答えよ。

- 並行処理を使用せずにオブジェクト指向プログラミングを実現することは可能か。理由もあわせて答えよ。

- Python の標準モジュールに含まれる random モジュールのソースコードを入手せよ。random.random() がオブジェクト指向プログラミングで実装されているかを調査せよ。

- テキスト p. 4 のプログラムでは // 演算子が使用されている。/ 演算子と // 演算子の違いを、Python の公式ドキュメントに書かれている説明を元に答えよ。

レポート課題 2024/11/27

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

- qutebrowserでパスワード補完できる機能を実装したいのですが、大崎先生はどのようにして実装したか教えていただきたいです。

  セキュリティに関する話なので、個別に回答します。



最終レポート課題 (実施報告書)

ミニプロジェクトを実施せよ。 ミニプロジェクト完了後に、 実施したミニプロジェクトについての実施報告書を提出せよ。 実施報告書の構成は以下の通りとせよ。

表紙 (タイトル、学生番号、氏名、メールアドレス、提出日、授業科目名、担当教員名など)
1. ミニプロジェクトの説明
1.1 概要 (ミニプロジェクトの概要を 1 パラグラフで要約)
1.2 背景 (ミニプロジェクト立案に至った経緯)
1.3 目標 (何を、どこまで達成するか)
1.4 意義 (ミニプロジェクトを実施する意義)
1.5 授業内容との関連性 (授業のどの内容と、どう関係しているか)
2. ミニプロジェクト実施状況
2.1 要約 (何が、どこまでできたか 1 パラグラフで要約)
2.2 成果物一覧 (実施によって得られたソフトウェア・文書・データのリスト)
2.3 成果物の説明
2.3.1 成果物 1 の説明 (機能説明、画面ダンプや動作例の説明など)
2.3.2 成果物 2 の説明 (機能説明、画面ダンプや動作例の説明など)
            :
2.4 未解決の課題 (何を、どこまで完了できなかったか、その理由は)
2.5 今後の課題 (今後の要検討項目や発展課題)
2.6 自己評価 (学習効果、完成度、新規性・創造性)
3 感想 (授業、課題、ミニプロジェクト等に関する感想)
参考文献
付録 (成果物のソースコード、文書、データなど)

実施報告書は PDF 形式で作成せよ。 ファイル名は final-report-<####>-<LASTNAME>.pdf (例: final-report-1234-ohsaki.pdf) とせよ。 #### には学生番号下 4 桁、 LASTNAME は名字とせよ。 構成以外の様式は自由とする。

提出方法: 2025/01/08 のレポートの添付ファイルとして、 「レポート送信フォーム」から提出せよ。 レポートが再提出された場合は、 新しいほうを採点対象とする。

提出期限: 2024/1/13(月) 9:00am (期限を過ぎたレポートは受理しない)

注意事項: 提出されたレポートは、 匿名にした上で、 他の受講者および来年度以降に大崎が担当する講義の受講者に公開する場合がある。 他の受講者に公開されて困る内容はレポートに含めないこと。

シミュレータ解説 (1) (概要、エージェント)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- シミュレーション条件を変えて dtnsim を実行できるようになる。

- エージェントの 2 つの通信方式 (CarryOnly と Epidemic) の違いを他人に説明できるようになる。

- 実行ファイルや Python のモジュールがどこに格納されているかを確認できるようになる。

- Python モジュールに動作確認のための print を埋め込めるようになる。

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/08.pdf

課題

事前準備

Debian のパッケージおよび dtnsim シミュレータ等をアップデートしておく。

> sudo apt update
> sudo apt upgrade
> sudo PIP_BREAK_SYSTEM_PACKAGES=1 pip3 install -U dtnsim

課題 1

dtnsim を以下の条件で実行せよ。 (1) エージェント数は 10、 (2) 移動モデルは RandomWaypoint、 (3) 経路制約なし、 (4) エージェントは CarryOnly。

メッセージ保有ノードが、 宛先ノードに直接接触した時にメッセージが中継されることを確認せよ。

課題 2

課題 1 において、 エージェントのクラスを Epidemic に変更してシミュレーションを実行せよ。 CarryOnly と Epidemic の違いによって、 メッセージの中継がどのように変化するかを確認せよ。

課題 3

プログラム dtnsim および Agent.CarryOnly クラスを定義している agent/carryonly.py がインストールされている場所を特定し、 それぞれのファイルの中身を確認せよ。

課題 4

課題 1 のシミュレーション実行中に、 各エージェントの情報を標準エラー出力にダンプせよ。

略解

課題 1

> dtnsim -n 10 -m RandomWaypoint -p NONE -a CarryOnly | cellx -L30

末尾の -L30 を変えると描画されるスピードを調整できる (-L30 で 30 フレーム/秒)

課題 2

> dtnsim -n 10 -m RandomWaypoint -p NONE -a Epidemic | cellx -L30

課題 3

> which dtnsim
/usr/local/bin/dtnsim
> python3
Python 3.11.2 (main, Mar 13 2024, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/ohsaki/lib/python', '/usr/lib/python311.zip', '/usr/lib/python3.11', '/usr/lib/python3.11/lib-dynload', '/usr/local/lib/python3.11/dist-packages', '/usr/lib/python3/dist-packages']
>>> import dtnsim.agent.carryonly
>>> dtnsim.agent.carryonly.__file__
'/usr/local/lib/python3.11/dist-packages/dtnsim/agent/carryonly.py'
>>> (Ctrl-D で終了)
> less /usr/local/bin/dtnsim
> less /usr/local/lib/python3.11/dist-packages/dtnsim/agent/carryonly.py

課題 4

例えば、 /usr/local/lib/python3.11/dist-packages/dtnsim/agent/carryonly.pyに以下のような変更を加えればよい。

--- carryonly.py.orig   2021-11-29 15:25:46.432520640 +0900
+++ carryonly.py        2021-11-29 15:24:30.312284452 +0900
@@ -190,6 +190,8 @@
         self.mobility.move(self.scheduler.delta)
         self.monitor.move_agent(self)
         self.forward()
+        import sys
+        print(self, file=sys.stderr)
 
     def flush(self):
         """Merge all newly-received messages with existing ones."""

> cd /usr/local/lib/python3.11/dist-packages/dtnsim/agent
> sudo cp carryonly.py carryonly.py.orig ← 元のファイルを別名で保存
> sudo chmod 666 carryonly.py ← 一般ユーザで書き込めるように
> emacs carryonly.py ← ファイルを編集

レポート課題 2024/12/04

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

質問

- emacs上でSKKで日本語入力をできるようにしたのですが、辞書を登録するのに苦戦しています。SKKの辞書の登録方法や仕組みについて教えてください。

  SKK では自動的に辞書登録がされます。授業中に簡単に説明します。



シミュレータ解説 (2) (モビリティ、可視化)

実習の流れ・チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- 乱数のシードを変化させて dtnsim を実行できるようになる。

- mobility.Fixed クラスのコードが読めるようになる。

- mobility.RandomWalk クラスのコードが読めるようになる。

- エージェントの移動モデルに簡単な変更が加えられるようになる。

テキスト

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/priv/09.pdf

課題

課題 1

dtnsim を以下の条件で実行せよ。 (1) エージェント数は 1、 (2) 移動モデルは Fixed、 (3) 経路制約なし、 (4) エージェントは CarryOnly。 乱数のシード (種) を変化させて何度か実行し、 乱数のシードによってエージェントの初期位置が変化することを確認せよ。

課題 2

テキストの 8.2 節を読み mobility/fixed.py のコードを理解せよ。 その後、 mobility/fixed.py を変更し、 エージェントが右下方向に等速度 (1 [m/s]) で移動するようにせよ。

課題 3

課題 1 において、移動モデルを RandomWalk に変更せよ。

課題 4

テキストの 8.3 節を読み mobility/randomwalk.py のコードを理解せよ。 その後、 mobility/randomwalk.py を変更し、 エージェントが水平方向にのみランダムウォークする (つまり一次元ランダムウォークする) ようにせよ。

課題

課題 1

> dtnsim -s 1 -n 1 -m Fixed -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 2 -n 1 -m Fixed -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 3 -n 1 -m Fixed -p NONE -a CarryOnly | cellx -L30

-s の引数がシード。シードの値によって生成される乱数の系列が変化する。

課題 2

--- mobility/fixed.py.orig      2021-08-23 12:00:54.498395785 +0900
+++ mobility/fixed.py   2021-12-06 21:48:28.322397148 +0900
@@ -51,4 +51,4 @@
 
     def move(self, delta):
         """Move the agent for the duration of DELTA."""
-        pass
+        self.current += V(delta, delta)

> dtnsim -s 1 -n 1 -m Fixed -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 2 -n 1 -m Fixed -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 3 -n 1 -m Fixed -p NONE -a CarryOnly | cellx -L30

初期状態から右下に等速移動するようになる (その後フィールドから出てゆく)。

課題 3

> dtnsim -s 1 -n 1 -m RandomWalk -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 2 -n 1 -m RandomWalk -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 3 -n 1 -m RandomWalk -p NONE -a CarryOnly | cellx -L30

課題 4

--- mobility/randomwalk.py.orig 2021-08-23 12:00:54.502395716 +0900
+++ mobility/randomwalk.py      2021-12-06 22:02:25.411949205 +0900
@@ -36,8 +36,10 @@
     def update_velocity(self):
         """Update agent's velocity using the velocity function."""
         vel = self.vel_func()
-        theta = random.uniform(0, 2 * math.pi)
-        self.velocity = vel * V(math.cos(theta), math.sin(theta))
+        if random.uniform(0, 1) <= .5: 
+            self.velocity = V(vel, 0)
+        else:
+            self.velocity = V(-vel, 0)
         self.wait = False
 
     def move(self, delta):

> dtnsim -s 1 -n 1 -m RandomWalk -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 2 -n 1 -m RandomWalk -p NONE -a CarryOnly | cellx -L30
> dtnsim -s 3 -n 1 -m RandomWalk -p NONE -a CarryOnly | cellx -L30

初期状態を中心とし、 水平方向にのみランダムウォークするようになる。

レポート課題 2024/12/11

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7

ソフトウェア設計・実装

実習の流れ

1. 解説 (10 分)
2. 実習 (課題 1、課題 2) (15 分)
3. 解説 (10 分)
4. 実習 (課題 3、課題 4) (45 分)
5. 成果発表 (10 分)
6. リフレクションシート記入 (10 分)

チーム分けの方針・態度目標

2024/09/25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-1

内容目標

- DTN シミュレータを利用したミニプロジェクトの案を出せるようになる。

- DTN シミュレータに関して不明な点を明らかにできるようになる。

- ミニプロジェクトを設定し、文字や図を用いて説明できるようになる。

- 設定したミニプロジェクトを他者に説明し、フィードバックを得られるようになる。

課題

課題 1

ネットワークシミュレータ dtnsim をベースにして、 「やってみたいこと」、 「できると面白そうなこと」、 「できると楽しそうなこと」、 「できると便利そうなこと」をできるだけ多く列挙し、 以下のフォームの「課題1」のシートに記入せよ。 1 人 1 個以上必ず記入すること。

課題 1 および課題 2 記入フォーム
TBA

課題 2

ネットワークシミュレータ dtnsim について、 「知りたいこと」や「よくわかってないこと」をできるだけ多く列挙し、 上記のフォームの「課題 2」のシートに記入せよ。 一人一個以上必ず記入すること。

課題 3

課題 1 および課題 2 をふまえて、 ミニプロジェクトの案を作成せよ。 A4 の紙に、 以下の情報を記入せよ。

- 学生番号 4 桁
- 氏名
- ミニプロジェクトのタイトル
- ミニプロジェクトを説明する絵
- 背景
- 動機
- 目的
- 手法
- 予想される問題

ミニプロジェクトの例
- DTN 通信プロトコルの性能評価
  - ルーティングアルゴリズムの評価 ★
  - エピデミックブロードキャストアルゴリズムの評価 ★
- DTN 通信プロトコルの設計・実装
  - 既存の (高性能な) ルーティングアルゴリズムの実装 ★★
  - 既存の (高性能な) エピデミックブロードキャストアルゴリズムの実装 ★★
  - 既存のルーティングアルゴリズムの実装 ★★★
  - 既存のエピデミックルーティングアルゴリズムの実装 ★★★
  - 高性能なルーティングアルゴリズムの考案と実装 ★★★★
  - 高性能なエピデミックブロードキャストアルゴリズムの考案と実装 ★★★★
- ネットワークシミュレータ高度化
  - シミュレーション情報のリアルタイム表示機能の追加 ★
  - シミュレーション結果集計機能の追加 ★
  - monitor.Cell への機能追加 (わかりやすく、美しく) ★
  - 3D アニメーション機能の追加 ★★★
  - ネットワークシミュレータ高速化・最適化 ★★★
  - インタラクティブ操作機能の追加 ★★
  - 他のプラットフォーム (例: Windows、OS X、iOS、Andoroid) への移植 ★〜★★★
  - ネットワークシミュレータのバグ発見および修正 ★

課題 4

課題 3 で作成した紙を、 他の受講者 2 人に説明し、 フィードバックを得よ。 フィードバックにもとづいて、 必要であればミニプロジェクトの案を修正せよ。 フィードバックをもらった人は、 紙の右下にサインをもらうこと。

最後に、 ミニプロジェクトの説明を撮影し、 以下のページからアップロードせよ。

講義「ネットワークコンピューティング実習」 答案提出フォーム
https://lsnl.jp/app/lecture/quiz/show/netcompx

実習中に完了しなかった場合は、 実習後にフィードバックをもらってからアップロードせよ。 その場合は、 受講者以外の人にフィードバックをもらっても構わない。

提出された「ミニプロジェクト説明」は他の受講者に公開する。 このため公開されて困る情報は含めないこと。

レポート課題 2024/12/18

「レポート課題 2024/09/25」と同じ。

https://lsnl.jp/~ohsaki/lecture/netcompx/2024/#10-7


Hiroyuki Ohsaki (ohsaki[atmark]lsnl.jp)