Tracについて(http://trac.edgewall.org/より)

  • TracSubversionへのインターフェイスを提供する
  • Wikiと統合されていて、簡易なレポート機能もある
  • wiki markupを利用することができ、説明文やリンク、バグ間のリンク、タスク、ファイルの変更点を表現することができる
  • timelineはプロジェクトで発生した全てのイベントを時系列に表示する
  • roadmapは今後の工程、マイルストーンをリスト形式で表示する
  • http://trac.edgewall.org/wiki/TracGuide
    • User Guideに、クライアントユーザーの操作方法が掲載されている
  • http://trac.edgewall.org/wiki/TracWiki
    • Wikiの書式について、画面中央にリンクがある
    • TracLinksは要チェック
  • http://trac.edgewall.org/wiki/TracTimeline
    • Timelineについて、以下のイベントをトラックしている
      • Wiki pageが作成・変更された時
      • Ticketが発行・解決・クローズした時
      • SourceCodeがRepositoryにチェックインされた時
      • Milestoneが達成された時
    • それぞれのイベントは、そのイベントの詳細へリンクされている
    • TracIniで、動作を調節することができる
    • RSSもサポートしている
  • http://trac.edgewall.org/wiki/TracBrowser
    • RepositoryBrowserについて
    • ディレクトリやファイルの「Rev」をクリックすると、それに関する変更履歴を照会することができる(TracRepositoryLog)
    • リスト上部の「View revision(リビジョンを見る)」に適当なリビジョン番号を入力すると、そのリビジョンにおけるフォルダ構成を照会することができる
    • ディレクトリの左端の矢印をクリックすると、画面遷移せずにサブディレクトリが表示される
    • Keyboardの「j」「k」「Enter」を使えば、マウスレスな操作が可能になる
  • http://trac.edgewall.org/wiki/TracChangeset
    • ChangeSetについて
    • ChangeSetHeaderとDiffViewsの二つのパートがある
      • ChangeSetHeaderには、変更点がファイル毎に表示される
      • DiffViewsには、個々のファイルの変更点が表示される
      • inline styleかside-by-side styleを選択する(Header部右側の「View differences(diffを見る)」で調節)
    • 「Revision Log(リビジョンログ)」をクリックすると、そのファイルのどのリビジョンを比較するかの選択画面が表示される
    • その他、諸々
  • http://trac.edgewall.org/wiki/TracRevisionLog
    • RevisionLogについて
      • ChangeSetは、ファイルがコミットされる毎の差分情報
      • それより大きな差分照会(一番最初のリビジョンと最新リビジョン)をやる場合は、こちらを使う
    • RevisionLogEntryには、そのファイルの変更履歴がリスト化されている。
      • 一列目はラジオボタンで、差分照会したい場合は、ここで任意のリビジョンを指定する
      • 二列目は色による変更状態の表示、一つ前のリビジョンからどのようなタイプの変更がなされたか
      • 三列目は、そのリビジョンがコミットされた日付
      • 四列目は、リビジョン番号
      • 五列目は、ChangeSet番号(TODO これがどういう規則で割り振られるか?)
      • 六列目は、変更者
      • 七列目は、コミットされた時のメッセージ
    • 「View changes(変更箇所を見る)」ボタンを押すことで、一列目のコンボボックスで選択されたリビジョン間の差分を照会することができる
  • http://trac.edgewall.org/wiki/TracTickets
    • TicketSystemについて
    • 案件やバグをシンプルかつ効果的にトラックするためのツール
    • タスク、案件、バグ、保守・サポートなどの用途に使われる
    • ユーザーができるだけ簡単に参加し、利用できるような仕組みを提供している
    • それぞれのTicketは誰かに対してアサインすることができる(担当者を決められる)
    • Ticketに用意されている様々なフィールドを利用することで、より効果的な管理が可能になる
      • trac.iniで、コンボボックスの中身などを調節することができる
    • Ticketの説明やコメントでは、TracLinksやWikiFormattingを使うことができるのは重要な特徴だ
      • TracLinksを使って、他の案件やChangeSetsやファイルにリンクを張ることで、そのTicketの内容がより明確になり、容易に理解できるようになる
  • http://trac.edgewall.org/wiki/TracReports
    • あとで書く

Programming Methodology 25〜27

最後の三回分を視聴しました。データ構造の作り方から、並列処理の話、Javaの基本的な仕組みなどについて触れられ、最終回では、このクラスを終えた後に進むべき道についてアドバイスをしていました。

  • Social Network
    • profile/person
      • name(unique ID)
      • status
      • image
      • list of friends
    • friendship
      • reciptocal
      • 互いのリストに互いの情報が入る
      • 6次の隔たり(6-degrees separation)
    • これらをどのように表現するか?
  • Concurrency
    • multiple things at the same time
      • cycling through some things
    • Thread
      • Runnable Interfaceの実装
      • shared data

  • standard Java
    • mainメソッドから始まる(static)
    • その後、起動されたクラスのオブジェクトを生成して、処理を始める
    • JAR
      • Java ARchive
      • classes(cmpiled)
      • EclipseでのJARファイルの作成
    • Java関連の本の紹介

  • computer science
    • computer science is not computer programming
    • 次はCS106Bへ
      • How do you implement a hashmap?
      • recursion -> huge powerful concept
    • またはCS103へ
      • Discrete Math
      • Computability
    • CS107/CS108
      • low-level programming
      • Object-Oriented system/large apps
    • その他、コンピュータサイエンスの様々な分野について紹介
    • CS + business
      • 起業するという道もあることを示唆
      • Product Management/finance(computation problems)
    • CS + Bio
    • CS + Law
      • IP/copyright/digitalMedia
    • CS (+ CS)
      • programmer
      • engineer management
      • teaching
    • programmingはこれらのことをやるための入口

Programming Methodology 22〜24

三回分の講義を視聴しました。断片的なメモしか残すことができませんでしたが、それをメモしておきます。

第二十二回目は、GUIの続きということで、コンテナというコンポーネントを使って、GUIの要素を再帰的に表現する方法について述べられていました。

  • container/component(GUIの続き)
  • HashMap
    • HashMap inventory = new HashMap;
    • inventory.put(album.getName, album);
    • Album album = inventory.get("albumName");


第二十三回目は、助手の先生による探索やソートに関するお話でした。

  • Searching
    • Linear Search
      • takes a lot of time
    • Binary Search
      • ソート済みの配列で使う
  • Sorting


第二十四回目は、データ構造の作り方ということで、何をクラスやメソッドにするべきか、オブジェクト同士の関連をどのように扱うのかということに触れられていました。

  • data structure
    • principles
      • nouns -> classes
      • verbs -> methods
      • unique identifier
    • design
      • collection of objects
    • AlbumとSongの関連性
      • Songが様々Albumが保持する可能性あり
      • 一つのSongのオブジェクトは一つしか生成しない
      • Albumオブジェクトがそれを参照する
      • deepCopy/shallowCopy

Programming Methodology 20〜21

この二回は、GUIの作り方についてテキストボックスやボタンなどのコンポーネントを実際にプログラムしながら説明されていました。Java特有の事例ばっかりだったので、メモもかなり少なめです。

Programming Methodology 19

今回はインターフェイスについて語っていました。Java5.0以降の言語仕様については、あまり詳しく把握していなかったので、今回の講義はいろいろと得るものがありました。

  • Interface
    • set of methods
    • common functionality among set of classes
    • is-aの場合の、extendsを使う
    • Interfaceをimplementすると、そのinterfaceのmethodがあることを保障する
  • Map(Interface)
    • keyとvalueの組み合わせ
      • dictionaryの役割(wordsとしてのkeyを渡すと、definitionsとしてのvalueが返ってくる)
      • phone bookとしても捉えることができる
    • このような属性を抽象化したのがInterface
    • HashMap <- implement Map
      • templeteとして2つのtypeを指定する(keyとvalue)
      • Map dict = new HashMap();
      • Map phonebook = new HashMap();
      • オブジェクト生成時に実装クラスを指定して、操作はInterfaceで行なう
      • dict.put(key, value);
      • dict.get(key); -> keyに関連づけられているvalueが返ってくる/見つからなければnullが返る
    • Collection Hierarchy/Map Hierarchy
      • abstract concept
    • Iterator
      • list through set of values
      • ArrayList names = new ArrayList();
      • Iterator it = names.iterator();
      • while (it.hasNext()) { println(it.next()); }
      • HashMapの場合は、Iterator = dict.keySet().iterator();
      • no order、どういう順番でiterateされるかはわからないが、全ての要素を一度だけ訪れる
    • Iteratorを使ったfor文(Java5.0以降)
      • dict.keySet()のiteratorを使って、全要素を巡回する
      • for (String word: dict.keySet()) { println(word); }

Programming Methodology 16〜17

二回分の講義を視聴しました。この二回の講義を通じて、配列の扱い方について学びました。

  • Arrayについて
    • ordered
      • 順番に並んでいる
    • homogeneous
      • 全てが同じタイプ
  • i++
    • post increment
    • int x = 5; int y = x++;
    • xは6だが、yは5
    • pre incrementをやる時は、++i
  • Actual size/Effective size
    • Actual size -> declaredされたサイズ
    • Effective size -> really usingしているサイズ
  • Arrayは参照型のクラス
    • int[]をパラメータに渡せば、その参照が渡される
    • 他のメソッド内である一つの値を変えたら、メソッドを抜け出してもそのまま
    • int
      • array of array
      • matrix(2 dimention)
      • 二次元以上の配列を定義することもできる
  • ArrayListについて
    • サイズをオブジェクト生成時に指定する必要がない
    • Actual sizeとEffective sizeが同じ
    • Java5.0(Java1.5)以降では、templateを指定することができる
    • ArrayList strList = new ArrayList
      • strList.add("hello")で、配列の最後に要素が追加される
      • strList.size()で、配列のサイズを得られる
      • strList.get(i)で、指定した位置の要素を取得できる
    • boolean add( element);
      • ArrayListで生成されたら、ArrayListの各メソッドのに置き換えられる
    • ArrayList hold objects
      • primitive typeを保持することはできない
      • wrapperクラスに変換してArrayListに保持させる(Boxing)
      • Boxing/Unboxing -> Java1.5からは、これが自動的に行なわれる
      • ArrayList iList = new ArrayList();
      • int x = 5;
      • iList.add(x);
      • int z = iList.get(0);

Programming Methodology 18

今回は、実際にバグをつぶしていく過程を実演しながら、デバッグについて熱く語っていました。

  • 配列の復習
    • ArrayList
      • pros:dynamic resizing/other ops
      • cons:less efficient than array/syntax balky(pre 5.0)
    • array
      • fixed size
  • Debugging
    • 役割
      • Design -> Architect
      • Coding -> Engineer
      • Testing -> Vandal(プログラムを破壊しようと試みる)
      • Debugging -> Detective(破壊された原因を捜査して修正する)
    • Design -> Development -> Debugging -> Deployment
      • 先の工程に行くほど、修正するのに10倍のコストがかかる
      • Designの時点で見つけられるミスと比べると、Deploymentの時点で発見される問題は1000倍の負荷がかかってしまう
    • Bugの種類
      • bad values
      • faulty logic
      • unwarranted assumptions
    • 回避するには
      • simple
      • systematic
      • assumptions about problems
      • critical(批判的にコードを読む)
      • Don't panic!
    • Debuggingの方法
      • printlnを使う(メソッドや変数に対して)
      • Unit Test
    • EclipseでのDebuggingの実演
      • BreakPointを指定する
      • BreakPoint時点でのstackFrameが表示される
      • 変数の中身が表示される
      • 1step毎処理を進めてみる