13-1. まとめ

第1回

Gitはプログラムなどの編集ファイルを対象にしたセーブポイントを作る ようなシステムです。 commit した状態をすべて整理して保存します。 但し、commit していない状態でpullしたりブランチを切り替えたりすると、 編集中のファイルを失うことになりますので、十分に練習して下さい。

第2回

git の共用のリポジトリを作るには git init --bare --sharedを実行する。 push では、そのディレクトリにサブディレクトリを含め全てが入る。 同じリポジトリのURLはどのように指定しても良いので、 file:///, ssh://などで指定する他、サーバ側にプロトコルを入れて http://, や git:// も使用できる。

オブジェクト指向の基本項目を扱った。 オブジェクト同士の比較は、各プログラミング言語固有の問題。 一般に、オブジェクト指向では変数は参照を示すので、等号は等価ではな く、同一性を表す。 例えば、文字列オブジェクトにおいて、同じ内容の文字列であっても、別々 に作成されたのであれば、等号は偽となる。

講義では取り上げてなかったが、等号の扱いすらプログラミング言語の仕 様の影響を受ける。

例えば、C言語では以下のプログラムでは異なる番地が表示される。

  
#include <stdio.h>
int main(void){
  const char a[]="abc";
  const char b[]="abc";
  printf("%p %p\n",a,b);
  return 0;
}

一方Javaでは以下のプログラムは1個目と2個目だけ同一の番地を返す。

  
class Test {
    public static void main(String[] arg){
	String a="abc";
	String b="abc";
	String c=new String("abc");
	System.out.printf("%x %x %x\n",
			  System.identityHashCode(a),
			  System.identityHashCode(b),
			  System.identityHashCode(c)
			  );
    }
}

このため、テストでは比較が成功したが、外部データとの比較で失敗する ようなことが起こる。

Java ではルートクラスの java.lang.Object に比較のメソッド equals を定義し、 各オブジェクトクラスでオーバライドして 使うようになっているが、C++のような演算子をオーバライドする言語だ と、オブジェクトクラスの作成時に等号などもオーバライドすることが期 待される。

第3回

オブジェクトの不等号は Java では java.lang.Comparable インタフェースの compareTo メソッドを使うことになっている。 しかし、不等号から自然に等号が導かれるため、 equals と hashCode と矛盾 が無いように定義する必要がある。

hashCode は異なるオブジェクトはなるべく異なるような整数値を返すメ ソッドで、比較を高速に行うのに役立つ。 hashCode が異なるオブジェクトは異なるオブジェクトである。 hashCode の作成法には様々な定石がある。

第4回

現代のプログラミング手法として、スパイラル手法がある。 これは、設計、作成、テストのサイクルを何度も繰り返してプログラムを していく手法である。 これを実現させるツールとして、自動ユニットテストツール xUnit があ る。 オブジェクト指向プログラミングにおいては、クラスごとの単体テストの 自動化そのものがオブジェクト指向の有用性の一つとなる。 Java 用の JUnit は 2017 年に version 5 となっている。

さらに、「テストファースト」という手法がある。 これは、プログラムを作成する前にテストプログラムを作成する手法で、 入出力の仕様と、プログラムのロジックを分離する効果があるため、プロ グラム作成のロジックの整理を促す効果がある。

第5回

オブジェクト指向のもう一つのメリットは継承クラスの活用である。 活用には、単なるプログラムの共有の他、様々なデザインパターンが開発 されている。 特に、継承を前提として、メソッドを定義するものの実装をしない抽象ク ラスの活用方法として、テンプレートデザインパターンを紹介した。

第6回

よく使う手法だがやや高度な話題。 ストラテジデザインパターンの一例として、Comparator の紹介。 オブジェクトの比較方法を取り替えて、異なる並べ替えを行う。 その際、完成している並べ替えプログラムに対して、比較基準を与える Comparator オブジェクトをパラメータとして渡す。 このようにプログラムの一部の動作を後からオブジェクトとして渡す手法 がストラテジデザインパターンである。

現代プログラミング言語では、この比較基準などの一つの関数をリテラル として記述できるようラムダ式(無名関数)という記法が導入されていま す。 Java ではさらに型推論が導入され、入出力の型宣言も省略する記法も使 用できる。 Comparator にもラムダ式を使うことができる。

第7回

Java ではマルチコアを用いた粒度の小さい並列計算の機構として、 Stream 型によるMapReduceが導入された。 これは、データの集まりである Stream に対して、ラムダ式を与えること により、 各要素にラムダ式を施した値のStreamを作る Map 操作と、各要素のラム ダ式に対する集計値を計算する Reduce 操作を並列処理により実現する。

Javaでデータの集まりを扱う手法は配列、Collection(List,Mapなど)、 Stream の3種類となった。それぞれ、扱い方や効率が異なる。

第8回

Java で粒度の大きい並列処理として、 Thread の 作り方、管理の仕方などの使用法の基礎を学んだ。

第9回

複数のプロセスが共有データをアクセスする場合、処理に矛盾が生じない ように競合を解消する、排他制御の必要がある。 アトミック、セマフォの考え方を学んだ。

第10回

Android のアプリケーションの基礎を学ぶために、サンプルプログラムを 改造した。 講義当時はサンプルプログラムがうまく動作しなかった。 本日、git://edu.net.c.dendai.ac.jp/git/spro/10/2 に改訂版を載せた。

Android のプログラミングでは、Activity クラスに多くのメソッドが実 装されているため、Activity に全てのプログラムを記述してしまいがち になる。 1クラス1責務を実現するために、責務ごとにクラスを作成し、Activity クラスで this を引数に渡し、特定のメソッドは割り当てられた責務のク ラスからだけ呼び出されるようにする。

Android は起動プロセスが何段階もあるため、起動時、画面が切り替わっ た時などの状態を意識して、どのメソッドでどの動作を記述するか意識す る。

第11回

Android のリアルタイムゲームの作成方法を学ぶ。 スマートフォンはマルチコアなので、並列プログラミングを前提とする。 Activity のメソッドのうち、他プロセスで呼び出してはいけないのはユー ザ操作イベント関連である。 そのため、Activity ではユーザ操作イベントを共有変数に反映し、一方、 画面描画とゲームロジックはそれぞれ別プロセスとする。 それぞれでゲームオブジェクトへの排他制御を行う。

また、リアルタイム処理の仕方として、毎呼び出しで1stepの動作を記述 するのではなく、前回呼び出し時の時刻を覚えておいて、経過時間を計算 し、それに応じた時間の処理を行うようにする。

第12回

ネットワークサーバの並列化について学んだ。 基本的には accept したら、得られた Socket を Thread の引数として起 動するモデルである。

終わりに

並列処理の基礎的な事項について説明しました。 複雑な処理に耐えうるものではありませんが、 定石の暗記よりも、どのような切り口で並列処理の動作を見ると、その解 決法にたどり着けるかという、処理の捉え方が重要だと思います。 様々なプログラミング体験を積み、複雑な問題を解決できるようなスキル を身に着けて下さい。