Link

文字列操作とソケット通信(演習編)

講義時間中は、基本的にここに書かれているものを作っていってください。 一問完成するごとに見せてもらえるとありがたいです。 また、わからないことがあれば気軽に聞いてください。

話し合い歓迎です。隣同士わからないところを聞き、わかるところを教えてあげてください。また他の先輩などがいればその人に聞いてももちろんかまいません。今後そういったことが増えていくと思います。


Q1 C言語で文字列処理

【問題】  ふり子さんはお母さんから雑な買い物リストを渡されました。買うものと値段がスペース区切りで交互に書いてあります。  ふり子さんが財布に入れるべき金額を求めてくれるアプリをC言語で作成しましょう。

【出力例】青字は入力例

りんご 100 レモン 140 しょうゆ 200 ポテチ 100 ボールペン 88

-> Total cost is 628 yen!



Q2 はじめてのpython

【問題】  ふり子さんは生まれて初めてpythonを書ける喜びを噛み締めつつ、大きな声で挨拶をしました。 名前を入力すると挨拶を返してくれるアプリをpythonで作成しましょう。

【出力例】青字は入力例

What is your name?: Furiko
Nice to meet you, Furiko!



Q3 pythonで文字列処理

【問題】  Q1で作成したプログラムをpythonで作成しましょう。

【出力例】青字は入力例

りんご 100 レモン 140 しょうゆ 200 ポテチ 100 ボールペン 88

-> Total cost is 628 yen!



Q4 JSONを使ってみよう

【問題】  ロボット制御において、データをロボットから定期的に受信するコードはよく書かれます。他にも、様々なサービスのAPIにアクセスしてデータを取ってきてアプリ内部で使いたいこともあるでしょう。  このときにデータをやり取りする形式として近年よく使われているのがJSONです。  以下に、あるロボットから取得したデータのJSONファイル(という設定)のリンクを示します。

https://gist.github.com/furikake6000/cb5f5671f158fcd16b6e12d796d14295

 このファイルから座標情報のみを取り出すコードをpythonで書いてください。  ただし、座標情報が存在しない場合にはきちんとその旨を表示するようにしてください。


【ヒント】  pythonの標準ライブラリにJSONに関するものがあります。ググるとすぐ出てきますが、どうしても分からなければ聞いてください。

# JSON ファイルからデータを取り出す
info = open('robot_info.json', 'r') # JSONファイルを開く
dict = json.load(info) # 辞書型の変数に格納



Q5 遠隔ロボット

【問題】  ふり子さんは1次元空間を自由に移動できるロボットを完成させました。  あと作るべきは遠隔操作するスクリプトです。    クライアント(遠隔操作を行うPC)上で「go」と打つと1目盛り前へ、「back」と打つと1目盛り後ろへ移動する操作プログラムを作成してください。  移動対象となるロボット (サーバー側) のスクリプトは以下のリンクからDL可能です。

https://gist.github.com/furikake6000/8ef15d354cc5f1f4acabb5e26aba3d89

 スクリプトは移動命令を受信するごとに移動を実行し、移動後の座標(1次元なのでスカラー値)を出力します。  スクリプトはローカルで実行して構いませんが、ロボットのスクリプトは書き換えずにソケット通信で移動を行ってください。(リモートで実行する場合、アドレスは書き換えてください。)

【出力例】緑字はクライアント側の入力

※これはロボット側の出力です

Welcome to Furi Robot ver1.0 system!
Waiting for client…
Connection established! Addr: 127.0.0.1

go

現在のFuriRobotの座標: 1

back

現在のFuriRobotの座標: 0

back

現在のFuriRobotの座標: -1

back

現在のFuriRobotの座標: -2


【ヒント】 制御情報を記述したデータを JSON 形式に変換し,さらにバイト列 に変換して送信する

data = {ここに制御情報を記述}
jdata = json.dumps(data) # JSON 形式に変換
bdata = jdata.encode() # バイト列に変換

【メモ】 127.0.0.1 :自身を指すIPアドレス



Q6 チャットアプリ(宿題)

【問題】  チャットアプリを作成してください。  使用する言語はC言語でもpythonでも、他のものでもかまいません(python推奨ですが)。また、講座ではsocketを使いましたが、WebSocketなどの別ライブラリを使用してもかまいません。

 チャットアプリの定義は以下のとおりです。

  • 2つの端末がワイヤレスに接続されている
  • 端末上で文章を打ち込みエンターキーを押すことで、相手の端末上に同じ文章を表示させられる(文章が送れる)
  • 1回の通信で少なくとも256文字の文章が送れる
  • 日本語に対応している(文字化けしない)

 それ以外の機能に関しては自由につけてください。ただし採点対象ではありません。そもそも採点がありません。



q6.py & q7.py のメモ

並列処理が必要 ex:) fork, multiprocess, thread …



Q7 ブロードキャストアプリ(おまけ問題)

※この問題はおまけなのでやってもやらなくてもいいです。暇つぶしです。

【問題】  ふり子さんの密かな夢はバーチャルYouTuberになることです。  ふり子さんは本格派なので、どうせなら配信アプリから自作したいと思い立ちます。しかし流石に動画配信アプリは難しいので、まずは文字情報のみを送れるアプリを作成することにしました。  サーバー1台に対して複数のクライアントが接続する形で、片方向のブロードキャストアプリを作成してください。サーバーに入力された文字を複数のクライアントに表示することができたら完成です。

【つまりどういうこと?】  Q6のチャットアプリを複数人対応させれば十分条件を満たします。



Q8 C言語のソケット通信(おまけ問題)

※この問題はおまけなのでやってもやらなくてもいいです。暇つぶしです。

【問題】  今回の講義資料では「C言語でソケット通信をするのは大変」とだけ述べていますが、実は本来C言語のソケット通信についてもやる予定でした。単純に書く時間がありませんでした。ここでお詫び申し上げます。  C言語で通信処理を実装するメリットはその処理速度にあります。いざpythonでコードを書いてから、やっぱり遅いからCで書き直そうということもあります(とはいえ通信環境の悪さや無駄なコードのほうがボトルネックになることが多いですが)。

 Q5「遠隔ロボット」のコードをCに書き直してみてください。100回データを送信した際の速度について、pythonとCで比較してみてください。またもし環境があれば、ローカルではなく無線LANで接続した2台のPC間の通信で同じ比較をしてみてください。