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

1. URL
2. 担当教員
3. TA (ティーチングアシスタント)
4. ネットワークに関する疑問
5. 講義目的: 到達目標
6. 授業方法
7. 成績評価
8. スケジュール
9. 大崎が担当する科目に共通の連絡事項・アドバイス
10. Debian GNU/Linux のインストール
11. UNIX (UNIX とは、ユーザ権限、パッケージ管理)
12. Debian GNU/Linux セットアップ〜パッケージ管理
13. シェル (ファイル操作、リダイレクト、パイプ)
14. X ウィンドウシステム & ウィンドウマネージャ
15. エディタ (Emacs チュートリアル)
16. シミュレータ導入 (インストール、実行、可視化)
17. Python 言語 (1) (名前、変数、式)
18. Python 言語 (2) (文、スコープ、サブルーチン)
19. Python 言語 (3) (オブジェクト指向プログラミング)
20. 最終レポート課題 (実施報告書)
21. シミュレータ解説 (1) (概要、エージェント)
22. シミュレータ解説 (2) (モビリティ、可視化)
23. ソフトウェア設計・実装

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でしかネットワークに接続できない環境では家でサーバーを立てることは難しいでしょうか?

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


[<16. シミュレータ導入 (インストール、実行、可視化)] [>18. Python 言語 (2) (文、スコープ、サブルーチン)]