2008年度 生物情報科学実験I Java基礎 ガイダンス
講師
- 中谷 洋一郎 (nakatani 'at' cb.k.u-tokyo.ac.jp)
- ゲノム進化
- 斉藤 太郎 (leo 'at' cb.k.u-tokyo.ac.jp)
- データベース分野
Teaching Assistants (TA)
- 佐々木 惇 (Atsushi Sasaki)
- 吉村 淳 (Jun Yoshimura)
講義時間中はTAが常駐しています。質問は遠慮なくTAに。親切に教えてくれます。
講義の内容
- 講義資料
- すべてWeb上に置いてあります http://www.xerial.org/wiki/lecture/2008/Java/Index
- Java言語を用いて、プログラムの書き方、組み立て方を学びます。内容としては、 教養課程の山口先生の計算機プログラミングIの授業に相当しますが、この演習では、オブジェクト指向を中心に、最初から現代的なプログラムの書き方を学びます。
講義の方針
プログラムを書く練習を重視します。講義を聞きながら、実際にコンピュータでプログラムを書いてみて、学習を進めてください。
ノートPCの貸出
演習ではノートPCを貸し出せます。自宅に持ち帰って使用することもできます。その場合は、学籍番号、氏名を演習担当者に届け出ること。夏の集中講義終了までには返却すること。
ただし、演習用のノートPCは2Kgを超える重さですので、持ち歩きには適していません。自宅に自分のPCがある場合は、Eclipseのworkspaceの中身だけをUSBメモリ(1G以上のものが数千円で買えます)に保存して持ち帰り、Eclipseをインストールして使うとよいでしょう。
対象レベル
プログラムを書いたことがない人。既にプログラムを書いた経験のある人には、発展課題を用意します。
授業の目標
- Javaプログラムの書き方、Javaのためのツールの使い方に親しむ。
- 簡単なプログラムの動作を理解できるようにする
- クラス・オブジェクト指向とは何かを理解し、その概念を用いてプログラミングできるようにする
- メモリとはなにか。プログラム中でメモリをどのように扱っているかを学ぶ
- データ構造について学ぶ
- テストコードの作成について学ぶ
- 作成したプログラムをパッケージ化する(Jarファイルの作成)を学ぶ
アプリケーションの作成
- テキスト、文字列の処理
- コマンドライン引数の処理
- ファイルの読み書き
- ネットワークに接続し、Webの情報を取得する
- データベースにデータを保存、検索
- 画像を描く
- GUIアプリケーションの作成
発展
- Webアプリケーションを作成する
成績評価
- 毎回、レポート課題を課します。その成績で採点します。
- 出席はとりません。ただし、出席した人のみ、その場で講師、TAの人にわからない部分を教えてもらえます。
- プログラムが動かない場合など、メールでの応対は非常に難しいので、授業中に質問できるように
レポートの提出方法
以下のWebサイトよりレポートを提出する
- レポート提出サイト http://lecture.utgenome.org/java2008
- New User?をクリックし、学生証番号、氏名(日本語、英語、どちらでも)、メールアドレス、好きなパスワードを入力すると、レポートを送信できるようになります。
- 登録確認のメールが届きますので、メール中のリンクをクリックしてください。
- 提出期限を過ぎると提出できない仕組みになっています(したがってその回のレポートは採点されません)
- 1つの課題につき、1つのファイルを送れるシステムです。プログラムのソースコード全体など複数のファイルになる場合は、圧縮して一つのファイルにまとめてから、送信します。
- ソースコード(Javaファイル)を提出してもらいます。コメントを記入し、どのようなプログラムを書いたかわかるようにすること。
参考図書
Javaの学習はWebによる情報(英語)が豊富ですので、あえて本を購入しなくてもJavaプログラムの書き方は学ぶことができます。
日本語の資料
東京大学教養課程での、プログラミングの授業の資料です。独習用教材として秀逸。
英語の資料
プログラミング言語の資料は英語によるものが豊富です。また、プログラミング関連の技術は日進月歩なので、日本語に正しく翻訳されるまでには時間がかかります。今のうちから、英語で読むトレーニングを積むことをお勧めします。プログラミングの上達の秘訣は、英語の資料を読めるようになること、と言っても過言ではありません。
- The Java Tutorials
- このサイトだけで十分Javaを学べる。Javaでできることを幅広く解説している。
- Java API Documentation http://java.sun.com/javase/ja/6/docs/ja/api/
- Javaに最初から備わっているライブラリの目録、使い方
- Javaの魅力は、既存のライブラリ、そのドキュメントが充実していること。Javaでは、ネットに接続、マルチスレッド(並列)プログラミングがとても手軽にできる
- Eclipseからは、クラス名にマウスを合わせてShift+F2で参照できる
コーディングを上達させるために読むとよい本
- Refactoring - Improving the Design of Existing Code
- Martin Fowler, et al.
- Javaのコードの品質(変化への強さ、コードの読みやすさ)を向上するために必須
- Java魂 プログラミングを極める匠の技
- Jack Shirazi
- Javaでコーディングするときのコツ、作法に詳しい
- Java言語で学ぶデザインパターン入門
- 結城 浩
- Javaでプログラミングするときによく出てくる、様々な典型的なパターン(クラスの構成:デザインパターン)が解説されている。先人の知恵の集大成。
- しかし、必ずしもここに出てくるパターンに当てはめればよいというわけではなく、個々のデザインパターンにも利害得失がある(コードの規模が大きくなってきたときの拡張のしやすさ、性能、コードの読みやすさの違いなど)
- Java言語で学ぶデザインパターン入門 マルチスレッド編
- 結城 浩
- マルチスレッド(並列)計算プログラムを書くときの、デザインパターン。
- Eclipseクックブック
- Eclipseの使い方、便利な機能などを手っ取り早く学ぶのに良い。
- Eclipseの英語のマニュアルをまじめに読めば、一応同様の情報は手に入る
コンピュータサイエンスの入門書
コンピュータサイエンスを知らずして、高速なプログラムを書くことは難しいです。また、大きなデータを扱うことの多いバイオインフォマティクスでは、書いたプログラムがデータのサイズに対して安定して動く(scalable)であることを示す必要があります。そのために、コンピュータサイエンスの知識は必須です。
ここに紹介してある本は、情報科学科の図書室(理学部7号館3階)で読むことができるでしょう。
- コンピューターの構成と設計 第3版 上・下巻
- パターソン&ヘネシー
- CPUでマシン語レベルの演算がどのように行われているか、メモリ・キャッシュへのアクセス仕組みについて知るための貴重な良書。ここに書かれている知識がないと、CPU、メモリなどの性能を限界まで引き出したプログラムを書くことは難しい。
- 計算理論の基礎
- Michael Sipser
- 計算することとは何か(オートマトン、計算能力について)。計算の時間、空間的な複雑さ(計算量、NP完全性)について、大学から学ぶのにちょうどよい教科書
- Computers adn Intractability - A Guide to the Theory of NP-Completeness
- Michael R. Garey and David Johnson
- 問題の難しさ(計算量)のクラス(NP完全性など)を証明するために必要な知識が得られる。巻末に、計算量が既知の問題のリストがあるが、これは未知の問題の計算量を調べるときに非常に有用。
- Algorithm Design
- Jon Kleinberg and Eva Tardos
- アルゴリズムを組み立てるときの基本的な考え方、広く知られている手法をカバーしている教科書。動的計画法など、アプローチを知らないと、0から思いつくことは難しい解法などが紹介されている。
- Introduction to Algorithms
- Thomas H. Cormen and Charles E. Leiserson
- 基本的なアルゴリズム(データ構造、グラフ探索、幾何アルゴリズムなど)の辞書。計算量などコンピュータサイエンスの基礎を手早く学ぶための章も充実。
- Database Management Systems. Third Edition
- Raghu Ramakrishnan and Johannes Gehrke
- とても読みやすいデータベースの教科書。データベースシステムがどのように実装されているか、また、その性能を決める要因となるものが何かを理解できる。データベースを多く扱うバイオインフォマティクスの研究を進める上では、ぜひとも読んでおきたい本。
さらなる極みへ
プログラム開発でぜひとも習得しておきたいツール
数万行〜10万行規模のプログラムが書けるようになると、立派なプログラマです。しかし、コードが大きくなると管理も難しくなります。ソースコードを管理しきるためのツールがSubversionとMavenです。
- Subversion
- ソースコードの共有、履歴管理のためのシステム。バージョン管理を知らずして、プロのプログラマは名乗れません。オープンソース開発では必須となっているツールです。
- バージョン管理の概念を理解するまでは時間がかかりますが、慣れればコード開発の上で強力な武器となります
- Subversionの使い方の解説
- Maven
- Javaには世界中で開発された多くのライブラリがあります。それらを手早くダウンロードして、即座に使えるようにするためのツールがMavenです。コンパイル、プログラムのパッケージ化などの多くの作業を自動化してくれます。
並列・分散プログラミング
マルチコア(1チップの中にCPUが複数)の時代では、スレッドを用いた並列プログラミングでさらにCPUの性能を引き出すことができます。
MPI
- MPIは、複数マシン間でのデータ通信を交えたプログラムを書くためのインターフェースです。
Map-Reduce: 分散計算のためのフレームワーク
- Googleでは、Map-Reduceという仕組みで、数千・数万台規模のクラスタマシンを同時に使ったプログラムを実行させています。マシン間通信、分散実行などの手間をプログラマではなく、フレームワーク側が担うことで、短いコードで、並列性を引き出しています。
- Hadoop
- GoogleのMap-Reduceの仕組みを、オープンソースで実装しようという試み。開発スピードが速く、だんだん実用に近いレベルになってきています。
超分散のプログラムをよどみなく実行するためには、計算に使うデータ(ファイルなど)も、クラスタマシン間で分散して保存し、複製を作ることでデータの冗長性(データの紛失を防ぐ)を上げ、計算するマシンに近い位置にデータが配置されるようにする必要があります。Google File Systemがその一例で、Hadoopでも、分散ファイルシステムHDFSを実装しています。
ゲノムブラウザを作る
- UTGB Toolkit http://utgenome.org/
- 森下研究室で開発された、個人用ゲノムブラウザを開発するためのツールキット。Javaで実装されており、データベース機能を備えたWebサーバーを数分で立ち上げることができます。
他のプログラミング言語にも挑戦
スクリプト言語
JavaはEclipseがあればそれなりに快適にコーディングができますが、テキストエディタ1つで簡単なプログラムを簡単に仕上げる、という用途には向いていません。そのような場合は、スクリプト言語と呼ばれるプログラミング言語を学ぶとよいでしょう。
- Perl
- Ruby
などがよいかと思います。PerlはCPANライブラリが充実していること。Rubyは言語がすっきりしていて、きれいなコードが書きやすいというメリットがあります。
高性能を目指して
よりCPU、メモリの性能を考慮してプログラムを書く場合には、現時点では、C, C++などの言語を学習する必要があります。
C++では、
- STL (Standard Template Library)
- Boost http://boost.org
の2つのライブラリの使い方が必須でしょう。

