Python 3

Python3のテキストができました.

Python3のテキスト
無料で差し上げますので,意見や感想をくださいませ.
→ katsu_wm%mukogawa-u.ac.jp (’%’を’@’に変えるとメールアドレスになります)
ページ末尾のコメント入力欄(非公開形式)も使えます.(名前,メールアドレスなどは無しで大丈夫です)

公開されている情報が豊富なPythonですが,アプリづくりのための一通りの入門ができる書籍などが見当たらない上,Kivyの日本語の情報も少ないのでテキストを自前で作ることにしました.

特に,既に別の言語を習得している人が,手っ取り早くPythonに取り掛かるのに役立つと考えています.

Pythonには有用なライブラリ(モジュール)がたくさん公開されているので,いろんなモジュールの使い方を簡単に説明した「モジュールブック」みたいな本も書いているところです.(途中です)
モジュールブックは現在:
OpenCV,Pillow,pygame,Eel,NumPy,matplotlib,SymPy,hashlib, passlib, Cython, Numba, ctypes, PyInstaller, JupyterLab, json, urllib, zenhan, jaconv
について記述しています.

【公開しているテキストにつきまして】
ここに公開しているテキストは「フリーソフトウェア」とします.(著作権は保持しています)
商用,非商用問わずご使用ください.印刷,再配布共にしていただいて構いませんが,その際は内容の改変をせずにお願いします.
内容に不備がありましたら是非ご連絡ください.可能な限り迅速に修正して再配信いたしますが,テキスト内の「免責事項」に了承してください.

■ Pythonのテキストに掲載しているサンプルプログラム
→こちら

■ 「Python3モジュールブック」に掲載しているサンプルプログラム
→こちら

プログラム開発や教材作成の参考にしている書籍(広告リンクになっています)

—【テキスト本体の目次】—————————————————-
1 はじめに — 1
1.1 Pythonでできること — 1
1.2 本書の内容 — 1
1.2.1 本書の読み方 — 2
1.3 処理系の導入(インストール)と起動の方法 — 2
1.3.1 Python処理系のディストリビューション(配布形態) — 2
1.3.2 Python処理系の起動 — 2
1.3.3 対話モード — 3
1.4 使用するGUIライブラリ — 3
1.5 Pythonに関する詳しい情報 — 3
2 Pythonの基礎 — 4
2.1 スクリプトの実行 — 4
2.1.1 プログラム中に記述するコメント — 4
2.1.2 プログラムのインデント — 5
2.2 変数とデータの型 — 5
2.2.1 変数の開放(廃棄) — 6
2.2.2 数値 — 6
2.2.2.1 浮動小数点数の丸め — 8
2.2.2.2 数学関数 — 8
2.2.2.3 特殊な値:inf, nan — 9
2.2.2.4 多倍長精度の浮動小数点数の扱い — 10
2.2.2.5 分数の扱い — 12
2.2.2.6 乱数の生成 — 13
2.2.3 文字列 — 13
2.2.3.1 エスケープシーケンス — 13
2.2.3.2 raw文字列(raw string) — 14
2.2.3.3 複数行に渡る文字列 — 14
2.2.3.4 文字列の分解と合成 — 15
2.2.3.5 文字列の置換 — 16
2.2.3.6 文字の置換 — 16
2.2.3.7 大文字/小文字の変換と判定 — 17
2.2.3.8 文字列の含有検査 — 17
2.2.3.9 文字コード/文字の種別 — 18
2.2.4 真理値 — 19
2.2.5 ヌルオブジェクト — 19
2.2.6 型の変換 — 19
2.2.7 型の検査 — 20
2.2.8 基数の変換 — 20
2.2.8.1 n進数→10進数 — 20
2.2.8.2 10進数→n進数 — 21
2.3 データ構造 — 21
2.3.1 リスト — 21
2.3.1.1 リストの要素へのアクセス — 21
2.3.1.2 リストの編集 — 22
2.3.1.3 リストに対する検査 — 25
2.3.1.4 例外処理 — 26
2.3.1.5 要素の個数のカウント — 26
2.3.1.6 要素の整列 (1): sortメソッド — 27
2.3.1.7 要素の整列 (2): sorted関数 — 28
2.3.1.8 要素の順序の反転 — 28
2.3.1.9 リストの複製 — 29
2.3.2 タプル — 29
2.3.2.1 特殊なタプル — 30
2.3.3 セット — 30
2.3.3.1 集合論の操作 — 31
2.3.3.2 frozenset — 32
2.3.4 辞書型 — 32
2.3.5 添字(スライス)の高度な応用 — 33
2.3.6 データ構造の変換 — 34
2.3.7 データ構造に沿った値の割当て — 35
2.3.7.1 データ構造の選択的な部分抽出 — 36
2.3.8 データ構造のシャッフル — 36
2.3.9 データ構造へのアクセスの速度について — 36
2.4 制御構造 — 37
2.4.1 繰り返し(1): for — 37
2.4.1.1 rangeオブジェクト — 38
2.4.1.2 for文におけるelse — 39
2.4.1.3 forを使ったデータ構造の生成(要素の内包表記) — 39
2.4.1.4 イテレータ — 40
2.4.1.5 zip関数とzipオブジェクト — 41
2.4.2 繰り返し(2): while — 42
2.4.3 繰り返しの中断とスキップ — 43
2.4.4 条件分岐 — 43
2.4.4.1 条件式 — 44
2.4.4.2 各種の「空」値に関する条件判定 — 44
2.4.4.3 `is’による比較 — 46
2.5 入出力 — 47
2.5.1 標準出力 — 47
2.5.1.1 出力データの書式設定 — 47
2.5.1.2 sysモジュールによる標準出力の扱い — 48
2.5.2 標準入力 — 49
2.5.2.1 sysモジュールによる標準入力の扱い — 50
2.5.3 ファイルからの入力 — 51
2.5.3.1 バイト列の扱い — 54
2.5.3.2 バイト列のコード体系を調べる方法 — 55
2.5.3.3 指定したバイト数だけ読み込む方法 — 55
2.5.3.4 ファイルの内容を一度で読み込む方法 — 55
2.5.3.5 ファイルをイテレータとして読み込む方法 — 55
2.5.4 ファイルへの出力 — 56
2.5.5 標準エラー出力 — 56
2.5.6 パス(ファイル,ディレクトリ)の扱い — 58
2.5.6.1 カレントディレクトリに関する操作 — 58
2.5.6.2 ディレクトリ内容の一覧 — 58
2.5.6.3 ファイルのサイズの取得 — 58
2.5.6.4 ファイル,ディレクトリの検査 — 59
2.5.6.5 ファイル,ディレクトリの削除 — 59
2.5.6.6 実行中のスクリプトに関する情報 — 59
2.5.6.7 パスを扱うための更に別の方法:pathlib — 60
2.5.7 コマンド引数の取得 — 62
2.5.8 入出力処理の際に注意すること — 62
2.6 関数の定義 — 63
2.6.1 仮引数について — 63
2.6.1.1 引数の個数が不定の関数 — 63
2.6.1.2 関数呼び出し時の引数に `*’ を記述する方法 — 64
2.6.1.3 キーワード引数 — 64
2.6.2 変数のスコープ(関数定義の内外での変数の扱い) — 65
2.6.3 定義した関数の削除 — 66
2.7 オブジェクト指向プログラミング — 67
2.7.1 クラスの定義 — 67
2.7.1.1 コンストラクタ — 67
2.7.1.2 メソッドの定義 — 67
2.7.1.3 クラス変数 — 68
2.7.1.4 属性の調査 — 70
2.8 データ構造に則したプログラミング — 70
2.8.1 map関数 — 71
2.8.1.1 複数の引数を取る関数のmap — 72
2.8.1.2 map関数にzipオブジェクトを与える方法 — 73
2.8.2 lambdaと関数定義 — 73
2.8.3 filter — 75
2.8.4 3項演算子としての if~else… — 75
2.8.5 all, anyによる一括判定 — 76
2.8.6 高階関数モジュール:functools — 78
2.8.6.1 reduce — 78
3 KivyによるGUIアプリケーションの構築 — 79
3.1 Kivyの基本 — 79
3.1.1 アプリケーションプログラムの実装 — 79
3.1.2 GUI構築の考え方 — 79
3.1.2.1 Widget(ウィジェット) — 80
3.1.2.2 Layout(レイアウト) — 81
3.1.2.3 Screen(スクリーン) — 81
3.1.3 ウィンドウの扱い — 82
3.1.4 マルチタッチの無効化 — 82
3.2 基本的なGUIアプリケーション構築の方法 — 83
3.2.1 イベント処理(導入編) — 83
3.2.1.1 イベントハンドリング — 83
3.2.2 アプリケーション構築の例 — 84
3.2.3 イベント処理(コールバックの登録による方法) — 87
3.2.4 ウィジェットの登録と削除 — 88
3.2.5 アプリケーションの開始と終了のハンドリング — 89
3.3 各種ウィジェットの使い方 — 90
3.3.1 ラベル:Label — 90
3.3.1.1 リソースへのフォントの登録 — 92
3.3.2 ボタン:Button — 93
3.3.3 テキスト入力:TextInput — 93
3.3.4 チェックボックス:CheckBox — 94
3.3.5 進捗バー:ProgressBar — 94
3.3.6 スライダ:Slider — 94
3.3.7 スイッチ:Switch — 94
3.3.8 トグルボタン:ToggleButton — 94
3.3.9 画像:Image — 95
3.3.9.1 サンプルプログラム — 95
3.4 Canvasグラフィックス — 96
3.4.1 Graphicsクラス — 97
3.4.1.1 Color — 97
3.4.1.2 Line — 97
3.4.1.3 Rectangle — 97
3.4.1.4 Ellipse — 98
3.4.2 サンプルプログラム — 98
3.4.2.1 正弦関数のプロット — 98
3.4.2.2 各種図形,画像の表示 — 98
3.4.3 フレームバッファへの描画 — 100
3.4.3.1 ピクセル値の取り出し — 101
3.4.3.2 イベントから得られる座標位置 — 102
3.5 スクロールビュー(ScrollView) — 102
3.5.1 ウィジェットのサイズ設定 — 103
3.6 ウィンドウサイズを固定(リサイズを禁止)する設定 — 103
3.7 Kivy言語によるUIの構築 — 104
3.7.1 Kivy言語の基礎 — 104
3.7.1.1 サンプルプログラムを用いた説明 — 104
3.7.1.2 PythonプログラムとKvファイルの対応 — 106
3.8 時間によるイベント — 107
3.8.1 時間イベントのスケジュール — 107
3.9 GUI構築の形式 — 107
3.9.1 スクリーンの扱い: ScreenとScreenManager — 108
3.9.1.1 ScreenManager — 108
3.9.1.2 Screen — 108
3.9.2 アクションバー: ActionBar — 110
3.9.3 タブパネル: TabbedPanel — 111
3.9.4 スワイプ: Carousel — 112
4 実用的なアプリケーション開発に必要な事柄 — 114
4.1 日付と時間に関する処理 — 114
4.1.1 基本的な機能 — 114
4.1.1.1 日付,時刻の書式整形 — 115
4.1.1.2 datetimeのプロパティ — 115
4.1.2 timeモジュールの利用 — 116
4.1.2.1 時間の計測 — 116
4.1.2.2 プログラムの実行待ち — 117
4.2 文字列検索と正規表現 — 117
4.2.1 パターンの検索 — 117
4.2.1.1 正規表現を用いた検索 — 119
4.2.1.2 正規表現を用いたパターンマッチ — 120
4.2.1.3 行頭や行末でのパターンマッチ — 121
4.3 マルチスレッドとマルチプロセス — 122
4.3.1 マルチスレッド — 122
4.3.2 マルチプロセス — 123
4.3.2.1 ProcessPoolExecutor — 123
4.3.3 マルチスレッドとマルチプロセスの実行時間の比較 — 124
4.4 ジェネレータ — 125
4.4.1 ジェネレータ関数 — 125
4.4.2 ジェネレータ式 — 126
4.5 モジュールの作成による分割プログラミング — 127
4.5.1 モジュール — 127
4.5.1.1 単体のソースファイルとしてのモジュール — 127
4.5.2 パッケージ(ディレクトリとして構成するモジュール) — 128
4.5.2.1 モジュールの実行 — 129
4.5.3 モジュールが配置されているディレクトリの調査 — 130
4.5.4 \_\_init\_\_.pyについて — 130
4.6 ファイル内でのランダムアクセス — 132
4.6.1 ファイルのアクセス位置の指定(ファイルのシーク) — 132
4.6.2 サンプルプログラム — 132
4.7 データオブジェクトの保存と読込み: pickleモジュール — 134
4.8 バイナリデータの作成と展開: structモジュール — 136
4.8.1 バイナリデータの作成 — 136
4.8.2 バイナリデータの展開 — 136
4.8.3 バイトオーダーについて — 138
4.9 バイナリデータをテキストに変換する方法: base64モジュール — 139
4.10 execとeval — 141
4.10.1 名前空間の指定 — 141
4.10.2 eval関数 — 141
4.11 collectionsモジュール — 142
4.11.1 namedtuple — 142
4.12 エラーと例外の処理 — 142
4.13 使用されているシンボルの調査 — 143
4.14 with構文 — 144
4.15 処理環境に関する情報の取得 — 149
4.15.1 Pythonのバージョン情報の取得 — 149
4.15.2 platformモジュールの利用 — 149
4.15.3 環境変数の参照 — 150
5 TCP/IPによる通信 — 152
5.1 socketモジュール — 152
5.1.1 ソケットの用意 — 152
5.1.2 サーバ側プログラムの処理 — 153
5.1.3 クライアント側プログラムの処理 — 153
5.1.4 送信と受信 — 153
5.1.5 サンプルプログラム — 153
5.2 WWWコンテンツ解析 — 155
5.2.1 requestsモジュール — 155
5.2.1.1 リクエストの送信に関するメソッド — 155
5.2.1.2 取得したコンテンツに関するメソッド — 156
5.2.1.3 Sessionオブジェクトに基づくアスセス — 157
5.2.2 Beautiful Soupモジュール — 157
5.2.2.1 BSにおけるHTMLコンテンツの扱い — 158
6 外部プログラムとの連携 — 160
6.1 外部プログラムを起動する方法 — 160
6.1.1 標準入出力の接続 — 160
6.1.1.1 外部プログラムの標準入力のクローズ — 163
6.1.2 非同期の入出力 — 163
6.1.3 外部プロセスとの同期(終了の待機) — 165
6.1.4 外部プログラムを起動する更に簡単な方法 — 165
7 サウンドの入出力 — 167
7.1 基礎知識 — 167
7.2 WAV形式ファイルの入出力:waveモジュール — 167
7.2.1 WAV形式ファイルのオープンとクローズ — 167
7.2.1.1 WAV形式データの各種属性について — 168
7.2.2 WAV形式ファイルからの読込み — 168
7.2.3 サンプルプログラム — 168
7.2.4 読み込んだフレームデータの扱い — 169
7.2.5 WAV形式データを出力する例 — 170
7.2.6 サウンドのデータサイズに関する注意点 — 172
7.3 サウンドの入力と再生:PyAudioモジュール — 173
7.3.1 ストリームを介したサウンド入出力 — 173
7.3.2 WAV形式サウンドファイルの再生 — 174
7.3.2.1 サウンド再生の終了の検出 — 176
7.3.3 音声入力デバイスからの入力 — 176
A Pythonに関する情報 — 180
A.1 Pythonのインターネットサイト — 180
A.2 Pythonのインストール作業の例 — 180
A.2.1 PSF版インストールパッケージによる方法 — 180
A.2.2 Anacondaによる方法 — 181
A.3 Python起動のしくみ — 181
A.3.1 PSF版Pythonの起動 — 181
A.3.2 Anaconda Navigatorの起動 — 182
A.3.3 Anaconda Promptの起動 — 183
A.4 PIPによるモジュール管理 — 184
A.4.1 PIPコマンドが実行できない場合の解決策 — 185
B Kivyに関する情報 — 185
B.1 Kivyのインストール作業の例 — 185
B.2 Kivy利用時のトラブルを回避するための情報 — 186
B.2.1 Kivyが使用する描画APIの設定 — 186
B.2.2 SDLについて — 186
B.3 GUIデザインツール — 186
C Tkinter:基本的なGUIツールキット — 187
C.1 基本的な扱い方 — 187
C.1.1 使用例 — 188
C.1.1.1 ウィンドウサイズ変更の可否の設定 — 189
C.1.2 ウィジェットの配置 — 189
C.2 各種のウィジェット — 191
C.2.1 チェックボタンとラジオボタン — 191
C.2.1.1 Variableクラス — 192
C.2.2 エントリー(テキストボックス)とコンボボックス — 193
C.2.2.1 プログラムの終了 — 195
C.2.3 リストボックス — 195
C.2.4 テキスト(文字編集領域)とスクロールバー — 196
C.2.5 スケール(スライダ)とプログレスバーバー — 198
C.2.5.1 Vaviableクラスのコールバック関数設定 — 199
C.3 メニューの構築 — 199
C.4 Canvasの描画 — 201
C.4.1 描画メソッド(一部) — 201
C.4.2 図形の管理 — 204
C.5 イベントハンドリング — 206
C.5.1 時間を指定した関数の実行 — 208
C.6 複数のウィンドウの表示 — 209
C.7 ディスプレイやウィンドウに関する情報の取得 — 210
C.8 メッセージボックス(messagebox) — 211
C.8.1 アプリケーション終了のハンドリング — 213
D モジュールの取り扱いについて — 214
D.1 モジュールの読込みに関すること — 214
D.1.1 モジュール読込みにおける別名の付与 — 214
D.1.2 接頭辞を省略するためのモジュール読込み — 214
D.1.2.1 接頭辞を省略する際の注意(名前の衝突) — 215
D.2 各種モジュールの紹介 — 216
E サンプルプログラム — 217
E.1 リスト/セット/辞書のアクセス速度の比較 — 217
E.1.1 スライスに整数のインデックスを与える形のアクセス — 217
E.1.2 メンバシップ検査に要する時間 — 218
E.2 pathlibの応用例 — 221
—————————————————————————

—【モジュールブックの目次】————————————————
1 画像の入出力と処理 - 1
1.1 OpenCV - 1
1.1.1 動画像の入力 - 2
1.1.2 ユーザインターフェース - 2
1.1.3 フレームのファイルへの保存 - 3
1.1.4 静止画像の読込み - 3
1.1.5 色の分解と合成 - 4
1.1.6 画像の類似性の検査 - 5
1.1.6.1 AKAZE特徴量の算出 - 5
1.1.6.2 特徴量データの照合 - 6
1.1.6.3 サンプルプログラム - 6
1.2 Pillow - 8
1.2.1 画像ファイルの読込みと保存 - 8
1.2.1.1 EPSを読み込む際の解像度 - 9
1.2.2 Imageオブジェクトの新規作成 - 9
1.2.3 画像の閲覧 - 10
1.2.4 画像の編集 - 10
1.2.4.1 画像の拡大と縮小 - 10
1.2.4.2 画像の部分の取り出し - 11
1.2.4.3 画像の複製 - 11
1.2.4.4 画像の貼り付け - 11
1.2.4.5 画像の回転 - 11
1.2.5 画像処理 - 12
1.2.5.1 色の分解と合成 - 12
1.2.6 描画 - 12
1.2.7 アニメーションGIFの作成 - 14
2 GUIとマルチメディア - 15
2.1 pygame - 15
2.1.1 基礎事項 - 15
2.1.1.1 Surfaceオブジェクト - 15
2.1.1.2 アプリケーションの実行ループ - 15
2.1.2 描画機能 - 17
2.1.2.1 描画のサンプルプログラム - 20
2.1.2.2 回転,拡縮のサンプルプログラム - 21
2.1.3 キーボードとマウスのハンドリング - 23
2.1.4 音声の再生 - 24
2.1.5 スプライトの利用 - 25
2.2 Eel - 30
2.2.1 基礎事項 - 30
2.2.2 Python/JavaScriptで記述した関数の呼出し - 32
2.2.2.1 関数の戻り値について - 33
3 科学技術系 - 34
3.1 数値計算と可視化のためのパッケージ:NumPy / matplotlib - 34
3.1.1 配列オブジェクトの生成 - 34
3.1.1.1 多次元配列の生成 - 36
3.1.1.2 配列の要素へのアクセス - 36
3.1.2 データ列に対する演算:1次元から1次元 - 37
3.1.3 データの可視化:基本 - 38
3.1.3.1 2次元のプロット:折れ線グラフ - 38
3.1.3.2 複数のグラフの作成 - 41
3.1.3.3 グラフを画像ファイルとして保存する方法 - 44
3.1.4 乱数の生成 - 45
3.1.5 データの可視化:ヒストグラム,散布図 - 46
3.1.6 データ列に対する演算:\(n\)次元から1次元 - 47
3.1.7 データの可視化:3次元プロット - 48
3.1.7.1 ワイヤフレーム - 48
3.1.7.2 面プロット(surface plot) - 49
3.1.8 高速フーリエ変換(FFT) - 50
3.1.8.1 時間領域から周波数領域への変換:フーリエ変換 - 51
3.1.8.2 周波数領域から時間領域への変換:フーリエ変逆換 - 51
3.1.9 データの可視化:棒グラフ,グラフのアスペクトについて - 54
3.1.9.1 棒グラフのプロット - 54
3.1.9.2 プロットのアスペクト比の指定 - 54
3.1.10 フーリエ変換を使用する際の注意 - 54
3.1.11 行列の計算 - 55
3.1.11.1 行列の和と積 - 55
3.1.11.2 単位行列,ゼロ行列,他 - 55
3.1.11.3 行列の要素の編集 - 56
3.1.11.4 行列式と逆行列 - 56
3.1.11.5 固有値と固有ベクトル - 57
3.1.11.6 その他 - 57
3.1.12 入出力 - 58
3.1.12.1 配列オブジェクトのファイルI/O - 58
3.1.13 行列の比較 - 61
3.1.14 配列を処理するユーザ定義関数の実装について - 61
3.2 SymPy - 64
3.2.1 モジュールの読込みに関する注意 - 64
3.2.2 基礎事項 - 64
3.2.3 基本的な数式処理機能 - 67
3.2.3.1 式の型 - 69
3.2.4 解析学的処理 - 70
3.2.4.1 極限 - 70
3.2.4.2 導関数 - 70
3.2.4.3 原始関数 - 71
3.2.4.4 級数展開 - 72
3.2.5 各種方程式の求解 - 72
3.2.5.1 代数方程式の求解 - 72
3.2.5.2 微分方程式の求解 - 73
3.2.5.3 階差方程式の求解(差分方程式,漸化式) - 74
3.2.6 線形代数 - 74
3.2.7 総和 - 75
3.2.8 パターンマッチ - 76
3.2.9 数値近似 - 77
3.2.10 書式の変換出力 - 77
3.2.10.1 \rm \LaTeX  - 77
3.2.11 グラフのプロット - 77
3.2.11.1 グラフを画像ファイルに保存する方法 - 79
4 セキュリティ関連 - 80
4.1 hashlib - 80
4.1.1 基本的な使用方法 - 80
4.2 passlib - 80
4.2.1 使用できるアルゴリズム - 80
5 プログラムの高速化 - 82
5.1 Cython - 82
5.1.1 使用例 - 82
5.1.2 高速化のための調整 - 84
5.2 Numba - 85
5.2.1 基本的な使用方法 - 85
5.2.2 型指定による高速化 - 86
5.3 ctypes - 86
5.3.1 C言語による共有ライブラリ作成の例 - 87
5.3.2 共有ライブラリ内の関数を呼び出す例 - 87
5.3.3 引数と戻り値の扱いについて - 88
5.3.3.1 配列データの受け渡し - 90
5.4 PyInstaller - 93
5.4.1 簡単な使用例 - 93
5.4.1.1 単一の実行ファイルとしてビルドする方法 - 94
6 対話作業環境(JupyterLab) - 95
6.1 基礎事項 - 95
6.1.1 起動と終了 - 96
6.1.2 表示領域の構成と操作方法 - 96
6.1.2.1 ノートブックの使用例 - 97
6.1.2.2 カーネル(Kernel)について - 99
6.1.3 Notebookでのinput関数の実行 - 99
6.2 Markdownによるコメント表示 - 100
6.3 使用例 - 101
6.3.1 MathJaxによるSymPyの式の整形表示 - 101
6.3.2 IPython.displayモジュールによるサウンドの再生 - 102
7 その他 - 104
7.1 json:データ交換フォーマットJSONの使用 - 104
7.1.1 JSONの表記 - 104
7.1.2 使用例 - 104
7.2 urllib:URLに関する処理 - 105
7.2.1 他バイト文字の扱い(`\%’エンコーディング) - 105
7.2.1.1 文字コード系の指定 - 105
7.3 zenhan:全角⇔半角変換 - 106
7.4 jaconv:日本語文字に関する各種の変換 - 106
8 免責事項 - 108
—————————————————————————

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)