i117 プログラミング演習ii i117 programming …shinoda- プログラミング演習ii i117...
TRANSCRIPT
I117 プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI)
小原 泰弘 / Yasuhiro Ohara
スケジュール / SCHEDULE
1. 2011/06/07(Tue): プログラミングの基礎 / Basic of Programming
2. 2011/06/09(Thu): 基本データ構造 / Fundamental data structures
3. 2011/06/14(Tue): メモリ管理1 / Memory Management 1
4. 2011/06/16(Thu): メモリ管理2 / Memory Management 2
5. 2011/06/21(Tue): デバッグ / Debugging
6. 2011/06/23(Thu): ソフトウェア開発環境1 / Software Development Env. 1
7. 2011/06/28(Tue): ソフトウェア開発環境2 / Software Development Env. 2
8. 2011/06/30(Thu): 木 / Data Structure : Tree
9. 2011/07/05(Tue): ハッシュ / Data Structure: Hash
10. 2011/07/07(Thu): プログラム理解1 / Understanding Programs 1
11. 2011/07/12(Tue): プログラム理解2 / Understanding Programs 2
12. 2011/07/14(Thu): スクリプト言語1 / Script Language 1
13. 2011/07/19(Tue): スクリプト言語2 / Script Language 2
14. 2011/07/21(Thu): その他の言語 / Other Languages
15. 2011/07/26(Tue): 試験 / Examination
課題(自由課題) / FINAL REPORT
自由課題 free topic
提出: The deadline: 7/26(Tue) Submit
the source code, and the report. by e-mail: [email protected] by 7/26(Tue) 23:59.
例) サウンドファイルの変換プログラム / Sound file converter ウェブクローラー / web crawler カレンダープログラム(CalDAVコマンド群) calendar program 新しいシェル・エディタ・ウィンドウマネージャー new shell, editor, window
manager 圧縮解凍・暗号化アルゴリズム、rsyncの実装 encrypt/decrypt, rsync 形態素解析を利用した人工無能プログラム markov-chain program
レポートには高度な考察・議論を。The final report must have deep consideration
今日の目次 / TODAY'S INDEX
python
PYTHON
PYTHON
高級、高機能寄り。 無名関数 関数のインスタンス(クロージャ) カリー化
関数型言語より簡易。 シェル寄りの文法
C sh Perl
手続き型言語
関数型言語
純粋型 非純粋型
Java Ruby Python
C++ Erlang LISP Scheme
ML OCaml Haskel
オブジェクト指向
PYTHONとは
スクリプト言語のひとつ 超高級言語(very-high-level language)と謳っている 名前は,英BBC放送のコメディ番組 “Monty Python’s
Flying Circus” (モンティ・パイソン空を飛ぶ)に由来 以下の機能・特徴を備える
Cなどよりも優れたエラーチェック機能 動的配列や辞書などのビルトインデータタイプ クラスベースオブジェクト指向 動的型付け ガベージコレクション インデントベースのステートメントグルーピング 関数型言語由来のラムダ式
PYTHONのバージョン
Python 2.x 現在,最も広く使われているバージョン 最新バージョンは,2.7 本講義では2.x系列のPythonについて解説
Python 3.x いくつかの言語仕様的な変更が行われている 後方互換性が無く,Python 2.x 用のプログラムは,Python
3.x のインタプリタでは動作しない 現在のところ,あまり普及はしていない
PYTHONの実装
CPython Cで書かれている Pythonインタプリタというと,普通,このCPythonのことを指す
JPython Javaで書かれている Java VM上で動作
PyPy Pythonで書かれたPythonインタプリタ
IronPython C#で書かれている .NETフレームワーク上で動作
Unladen Swallow CPythonを高速化する目的で作られている LLVMを用いたJITコンパイラを内包
Stackless Python マイクロスレッド,コルーチン,タスク間の通信チャネル,タスクシリアライズなど,並行処理のための拡張を行ったPythonの変種・方言
Eve Online,Second LifeなどのMMORPGや,CiscoのメールゲートウェイであるIronPortなどで利用されている
HELLO WORLD!
標準出力への出力は,print命令で行う pythonインタプリタを起動し,インタラクティブシェル中で実行した例
インタラクティブシェルから抜けるには,Ctrl+Dを入力 もちろん,スクリプトファイルを指定して実行することも可能
Pythonファイルの拡張子は,.pyとなる
$ python >>> print ‘Hello World’ Hello World!
$ cat hello.py print ‘Hello World’ $ python hello.py Hello World!
HELLO WORLD! IN PYTHON 3.X
Python 3.x では 出力は print() 関数で行う >>> print(‘Hello World’) Hello World!
PYTHONスクリプトを実行可能にする
Shellスクリプトと同様に,1行目に #! でスクリプトのインタプリタを指定し,実行権限を付加することで実行可能となる
$ cat hello.py #!/usr/bin/env python print ‘Hello World’ $ chmod +x hello.py $ ./hello.py Hello World!
スクリプトファイルの文字エンコーディング
Pythonでは様々な文字エンコーディングでスクリプトを書ける
ASCII以外の文字コードを利用する際には,文字コードを指定する必要がある 文字コードの指定は,# -*- coding: encoding -*- で行う UTF-8で指定した例
$ cat morning.py #!/usr/bin/env python # -*- coding: utf-8 -*- print u‘おはよう日本’ $ ./morning.py おはよう日本
PYTHONでの文字列と文字エンコーディング
文字列の演算 部分文字列の取得 多倍長言語とUnicode型
文字列の扱い
文字列は,’ か “ で囲う.どちらでも構わない どちらも同じ意味となる
文字列中に,” や ‘ を使いたい場合は,エスケープシーケンスの\を使う \”は’,\”は”,\n は改行,\tはタブ,\\は\となる
“Hello World!” ‘Hello World!’
>>> print “Hello \”World!\”” Hello “World!” >>> print ‘Hello\\World!’ Hello\World! >>> print ‘Hello\nWorld!’ Hello World
文字列の演算
文字列の結合は + で行う
繰り返しは * で行う
文字列長はlen()で取得
>>> ‘Hello’ + ‘World!’ ‘HelloWorld!’
>>> ‘Hello’ * 5 'HelloHelloHelloHelloHello'
>>> len(‘Hello’) 5
部分文字列の取得
部分文字列の取得は,[]演算子で行う 先頭の文字は0文字目となる :で範囲を指定可能
-1 で一番最後の文字,-2で最後から二番目の文字・・・ というようになる
>>> word = ‘Hello’ >>> word[1] # 1文字目 ‘e’ >>> word[1:4] # 1文字目から3文字目 ‘ell’ >>> word[:3] # 0文字目から2文字目 ‘hel’ # 範囲指定の左辺の省略は先頭を意味 >>> word[1:] # 1文字目以降 ‘ello’ # 範囲指定の右辺の省略は最後尾を意味 >>> word[:-2] # 先頭から,最後からの3文字目まで ‘hel’
UNICODEの扱い Python 2.x では文字列はバイト単位で扱われる
文字列はバイト単位で扱う str 型となる 日本語などの多バイト言語は unicode 型となる.u’hello’ と先頭に u を付けると unicode 型となる type関数で型を確認してみる
str 型と unicode 型の違い
>>> type('hello') <type 'str'> >>> type(u'こんにちは') <type 'unicode'>
>>> ‘こんにちは’[0] # 1バイト単位で扱われる '\xe3' >>> u‘こんにちは’[0] # 1文字単位で扱われる u'\u3053’ >>> len('こんにちは') 15 # 15バイト >>> len(u'こんにちは') 5 # 5文字
UNICODE IN PYTHON 3.X
Python 3.x の文字列は,全てUnicodeとなる バイト単位で扱う型とリテラル
str 型(2.x) bytes 型 (3.x) ‘hello’ b’hello’ Python 2.6 以降は,前方互換性のめに,b’hello’ という表記も可能
Unicode文字で扱う型とリテラル unicode 型(2.x) str 型 (3.x) u’hello’ ‘hello’
UNICODE型とSTRの変換
unicode型をバイト列に変換するには,encode() メソッドを利用 引数に変換する文字エンコードを指定
バイト列からunicode型に変換するには,unicode() 関数を利用 第一引数に変換するバイト列,第二引数にバイト列の文字エンコードを指定
>>> u‘こんにちは’.encode(‘utf-8’) # UTF-8に変換 '\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf’ >>> u‘こんにちは’.encode(‘sjis’) # Shift-JISに変換 '\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd'
>>> unicode('\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd', 'sjis') u'\u3053\u3093\u306b\u3061\u306f' >>> print unicode('\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd', 'sjis') こんにちは
PYTHONの型,データ構造
list型 deque型 set型 tuple型 dict型
LIST 型
C言語での配列に近いデータ構造 リストの定義は [] で行う
[]演算子で,要素にアクセス
[:]でリストの一部分を取得
>>> foo = ['apple', 'orange', 100, 200] >>> foo ['apple', 'orange', 100, 200]
>>> foo[2] 100
>>> foo[1:3] ['orange', 100] >>> foo[:2] ['apple', 'orange']
LISTの演算
リスト同士の結合は + で行う
リストの要素への代入も可能
>>> foo = ['apple', 'orange', 100, 200] >>> foo + ['banana', 500] ['apple', 'orange', 100, 200, 'banana', 500]
>>> foo ['apple', 'orange', 100, 200, 'banana', 500] >>> foo[1] = 'cherry' >>> foo ['apple', 'cherry', 100, 200, 'banana', 500] >>> foo[2:3] = [300, 400] >>> foo ['apple', 'cherry', 300, 400, 200, 'banana', 500]
LIST 型のメソッドによるリスト操作 様々なリスト操作の方法
>>> a = [66.25, 333, 333, 1, 1234.5] >>> print a.count(333), a.count(66.25) # 値の数を数える 2 1 >>> a.insert(2, -1) # 2番目に-1を挿入 >>> a [66.25, 333, -1, 333, 1, 1234.5] >>> a.index(333) # 333が初めに登場する位置を調べる 1 >>> a.remove(333) # 初めに登場する333を要素から削除 >>> a [66.25, -1, 333, 1, 1234.5] >>> a.reverse() # 逆順に並べ替える >>> a [1234.5, 1, 333, -1, 66.25] >>> a.sort() # ソートする >>> a [-1, 1, 66.25, 333, 1234.5] >>> len(a) # リストの長さを取得 5
LISTを用いたスタック
appendとpopを用いるとスタックが実現可能 >>> stack = [3, 4, 5] >>> stack.append(6) # 最後尾に6を追加 >>> stack.append(7) # 最後尾に7を追加 >>> stack [3, 4, 5, 6, 7] >>> stack.pop() # 最後尾の値を取り出す 7 >>> stack [3, 4, 5, 6] >>> stack.pop() 6 >>> stack.pop() 5 >>> stack [3, 4]
DEQUE 型
キューは効率化のためdeque型を利用 >>> import collections # collectionsモジュールを読み込み >>> queue = collections.deque([1, 2, 3]) # キューを初期化 >>> queue deque([1, 2, 3]) >>> queue.append(4) # 最後尾に4を追加 >>> queue.append(5) # 最後尾に5を追加 >>> queue deque([1, 2, 3, 4, 5]) >>> queue.popleft() # 先頭の要素を取り除く >>> queue.popleft() >>> queue deque([3, 4, 5])
SET 型
重複なしの非整列集合を定義可能な型 挿入・検索が高速に行える
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana’] >>> fruit = set(basket) # set型を作成 >>> fruit set(['orange', 'pear', 'apple', 'banana']) >>> ‘orange’ in fruit # ‘orange’が存在するかを True # 高速に検索 >>> 'crabgrass' in fruit False >>> fruit.add(‘peach’) # ‘peach’ を追加 >>> fruit set(['apple', 'banana', 'orange', 'peach', 'pear']) >>> fruit.remove(‘orange’) # ‘orange’ を削除 set(['apple', 'banana', 'peach', 'pear'])
TUPLE 型
list 型と似ているが,tuple 型は要素が不変となる データベースのレコード,座標を表すデータ構造など,長さなどが変化しないデータ列として利用
tupleを用いると,複数のデータを一つに扱うことが可能.C言語の構造体に近い考え
>>> point = 10, 30 # tuple を作成 >>> point (10, 30) >>> point[0] # 0番目の要素を参照 10 >>> x, y = point # x, y にtupleの値を代入 >>> x 10 >>> y 30
DICT 型
KeyとValueのペアを格納可能な型.辞書 Keyとして利用可能な型
文字列 数値 文字列か数値のみからなるタプル
>>> fruit = {‘orange’: 100, ‘apple’: 200} # 辞書を作成 >>> fruit[‘orange’] # key ‘orange’ の値を取得 100 >>> fruit[‘orange’] = 300 # ‘orange’ の値を変更 >>> fruit {'orange': 300, 'apple': 200} >>> fruit[‘banana’] = 500 # 新たに ‘banana’ を追加 >>> fruit {'orange': 300, 'apple': 200, 'banana': 500} >>> del fruit[‘apple’] # ‘apple’を削除 >>> fruit {'orange': 300, 'banana': 500}
PYTHONの制御構文
インデントベースのステートメントグルーピング ifによる条件分岐 forを用いたループ
リストの反復処理 辞書の反復処理 range()を用いた処理
continueとbreak文 pass文
インデントベースのステートメントグルーピング
Pythonではステートメントのグループングはインデントを基準に行う インデントはスペース4つとなる C言語とPythonの比較
誰が書いても,似たような字下げスタイルになる C言語の場合,K&Rスタイル,GNUスタイル,BSDスタイル,などなど様々な宗教がある
C言語の場合 if (a == b) { a = b * 2; printf(“%d\n”, a); }
Pythonの場合 if a == b: a = b * 2 print a
IF文
C言語のif文とほぼ同じ
>>> x = 3 >>> if x < 0: ... print ‘x is less than zero’ ... elif x == 0: ... print ‘zero’ ... elif x == 1: ... print ‘single’ ... else ... print ‘more’ ... more
FOR文
for文はC言語のforとかなり違うので注意 リストや文字列などのデータ列に対して反復する
>>> animal = [‘dog’, ‘cat’, ‘bird’] >>> for a in animal: # ループ毎にanimalの要素が順にaに代入される ... print a ... dog cat bird
FOR文によるDICTの操作
dictのkeys()メソッドにより,Keyのリストを取得して行う
iteritems()メソッドにより行う.3.x系の場合は,items()
>>> fruit = {'orange': 100, 'apple': 200, 'banana': 400} >>> for f in fruit.keys(): ... print f, ‘: ‘, fruit[f] ... orange : 100 apple : 200 banana : 400
>>> fruit = {'orange': 100, 'apple': 200, 'banana': 400} >>> for k, v in fruit.iteritems(): ... print k, ‘: ‘, v ... orange : 100 apple : 200 banana : 400
RANGE()関数
range()関数を用いると,特定範囲を表すリストを作成可能
>>> range(10) # 0から9までのリストを作成 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(3, 10) # 3から9までのリストを作成 [3, 4, 5, 6, 7, 8, 9] >>> range(3, 20, 4) # 3から20までのリストを作成 [3, 7, 11, 15, 19] # ただし,ステップ幅は4となる
C言語的なインクリメントベースのFOR
range()関数を用いて行う
ただし,値が大きい場合はxrange()関数を用いる xrange()関数は,リストを生成しないため効率的
>>> month = [‘April’, ‘May’, ‘June’, ‘July’] >>> for i in range(len(month)): ... print i, month[i] ... 0 April 1 May 2 June 3 July
CONTINUEとBREAK
ループから抜けるためにはbreakを利用 ループの次の先頭に進むためにはcontinueを利用
>>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, 'equals', x, '*', n/x ... break ... else: # C言語などと違い,for文にもelse文が使える ... # else以下は全てのリストが反復されなかった場合に実行される ... print n, 'is a prime number' ... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3
PASS文
pass文は何もしない インデントベースのため,必要になる時がある
>>> while is_func(): # is_func()が真になるまで繰り返し ... pass # ループの中は何もしない
PYTHONの関数
defによる名前付き関数 デフォルト引数 キーワード引数 可変長引数 アンパック引数リスト
lambda式による無名関数 関数の特殊化,カリー化,クロージャ
特殊化:関数を引数によって特別扱いすること(C++から) カリー化:
2引数の関数f(x, y)に対して、「gがfのカリー化」だとは、 f(x, y) = g(x)(y) が常に成立すること
クロージャ:無名関数の関数内定義(関数への変数参照)
高階関数:関数を引数として受け取る関数 €
f : X ×Y →Z
€
g : X →(Y →Z)
関数定義
def で定義 関数内で定義した変数は,関数内でのみ有効 返り値は,return で返す
>>> def twice(x): # defで,関数を定義 ... return x * 2 # return で返り値を設定 ... >>> twice(100) # 関数呼び出し 200 >>> twice(45) 90 >>> x # xのスコープはtwice関数内のみ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name ‘x’ is not defined
デフォルト引数
引数の値を予め指定しておくことが可能 デフォルト値を持つ引数は,引数の後ろに配置する必要がある(C言語と同じ)
>>> def n_times(x, n = 2): # n倍する関数を定義 ... return x * n ... >>> n_times(40) # nを指定しないと n = 2 となる 80 >>> n_times(40, 3) # nを指定した場合 120
キーワード引数
引数名を指定して渡すことも可能 引数の順番を考えなくて良い
>>> def person(name, age): ... print 'name = ' + name ... print 'age = ' + str(age) ... >>> person(‘Alice’, 16) # 普通に呼び出し name = Alice age = 16 >>> person(age = 18, name = ‘Bob’) # 引数を指定して呼び出し name = Bob age = 18
可変長引数
キーワードありの引数は ** で指定 キーワードなしの引数は * で指定
>>> def var_args(*args, **kargs): ... print args ... print kargs ... >>> var_args(1, 2, 3, 'foo', 'bar', name = 'Alice', age = 20) (1, 2, 3, ‘foo’, ‘bar’) # キーワードなしの引数 {‘age’: 20, ‘name’: ‘Alice’} # キーワードありの引数
アンパック引数リスト
既に引数がリスト形式や,辞書形式で表されていた場合,* や,** を用いてそのまま渡すことが可能 リストの例
辞書の場合
>>> range(2, 7) # 普通の呼び出し [2, 3, 4, 5, 6] >>> args = [2, 7] >>> range(*args) # リストのまま引数に渡した呼び出し [2, 3, 4, 5, 6]
>>> def n_times(x, n): ... return x * n ... >>> args = {'n': 100, 'x': 3} >>> n_times(**args) # 辞書のまま引数の渡した呼び出し 300
LAMBDA式
lambda(ラムダ)式は無名関数を記述するために利用 n_times() 関数と等価なラムダ式
lambdaは式なので,計算結果がそのまま返り値となる defの場合は,関数なので,return で結果を返す必要がある
>>> f = lambda x, n: x * n >>> f(10, 4) 40
関数の特殊化,クロージャ 特殊化
いくつかの引数を固定し,新たな関数を生成すること.カリー化と似た考え
クロージャ 変数のスコープを,それが定義された箇所で解決する関数
n倍する関数を特殊化した例 >>> def n_times_f(n): # n倍する関数を作成する高階関数 ... return lambda x: n_times(x, n) # nのスコープに注目 ... >>> f1 = n_times_f(2) # 2倍する関数を作成 >>> f1(10) 20 >>> f1(15) 30 >>> f2 = n_times_f(5) # 5倍する関数を作成 >>> f2(10) 50 >>> f2(15) 75
高階関数
関数を返す関数 関数を引数に取る関数 ソート時に比較関数を引数に渡した例
2変数(x, y)を引数に取り,大小比較する関数をsort()に渡す x < y, x == y, x > y のときに,-1, 0, 1 と返す関数を渡すと昇順にソート可能
>>> people = [('Bob', 20), ('Carol', 15), ('Alice', 17)] >>> people [('Bob', 20), ('Carol', 15), ('Alice', 17)] >>> people.sort() # 何も指定しないと,タプルの第一要素が初めに比較に >>> people # 使われる [('Alice', 17), ('Bob', 20), ('Carol', 15)] >>> people.sort(lambda x, y: x[1] - y[1]) # 第二要素を比較に >>> people # 用いた例 [('Carol', 15), ('Alice', 17), ('Bob', 20)]
PYTHONの関数プログラミング
filter map reduce リスト内包表記
FILTER
リストから特定条件を満たす値のみ取り出す filter(func, list)
funcがフィルタ用関数 listが対象となるリスト
リストから2と3で割り切れる値を取り除く例 >>> def f(x): ... return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]
MAP
リストの各要素に演算を施す map(func, list)
funcが演算用関数 listが対象となるリスト
リストの全要素を3乗する例
>>> def cube(x): ... return x**3 # ** はべき乗の演算子 ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
REDUCE
2要素ずつの処理を繰り返し行い,その結果を返す reduce(func, list, init)
funcは処理関数 listは対象となるリスト initは初期値
リストをフラットにする例 >>> reduce(lambda x, y: x + y, ... [[1, 2, 3], [4, 5], [6, 7, 8]], ... []) [1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3] + [4, 5] step 1:
[1, 2, 3, 4, 5] + [6, 7, 8] step 2:
[1, 2, 3, 4, 5, 6, 7, 8] result:
[6, 7, 8] + []
リスト内包表記
数学的な記法で集合の記述が可能 { x * x | x ∈ L} をリスト内包表記で書いた例
{ x * x | x * x > 20, x ∈ L} をリスト内包表記で書いた例
>>> [x * x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x * x for x in range(10) if x * x > 20] [25, 36, 49, 64, 81]
PYTHONのモジュール
スクリプトファイルとモジュール dir()関数によるモジュール内オブジェクトの確認 様々なインポート方法
スクリプトファイルとモジュール
Pythonでは1つのスクリプトファイルを,1つのモジュールとみなす
モジュールの例 my_echo.pyファイルを作成し,echo()関数を作成
my_echoのecho関数を呼び出す
$ cat my_echo.py def echo(word): print word
$ python >>> import my_echo # モジュールをインポート >>> my_echo.echo(“Hello World!”) # モジュール内の関数を呼び出し Hello World!
授業まとめ
スケジュール / SCHEDULE
1. 2011/06/07(Tue): プログラミングの基礎 / Basic of Programming
2. 2011/06/09(Thu): 基本データ構造 / Fundamental data structures
3. 2011/06/14(Tue): メモリ管理1 / Memory Management 1
4. 2011/06/16(Thu): メモリ管理2 / Memory Management 2
5. 2011/06/21(Tue): デバッグ / Debugging
6. 2011/06/23(Thu): ソフトウェア開発環境1 / Software Development Env. 1
7. 2011/06/28(Tue): ソフトウェア開発環境2 / Software Development Env. 2
8. 2011/06/30(Thu): 木 / Data Structure : Tree
9. 2011/07/05(Tue): ハッシュ / Data Structure: Hash
10. 2011/07/07(Thu): プログラム理解1 / Understanding Programs 1
11. 2011/07/12(Tue): プログラム理解2 / Understanding Programs 2
12. 2011/07/14(Thu): スクリプト言語1 / Script Language 1
13. 2011/07/19(Tue): スクリプト言語2 / Script Language 2
14. 2011/07/21(Thu): その他の言語 / Other Languages
15. 2011/07/26(Tue): 試験 / Examination
課題(自由課題) / FINAL REPORT
自由課題 free topic
提出: The deadline: 7/26(Tue) Submit
the source code, and the report. by e-mail: [email protected] by 7/26(Tue) 23:59.
例) サウンドファイルの変換プログラム / Sound file converter ウェブクローラー / web crawler カレンダープログラム(CalDAVコマンド群) calendar program 新しいシェル・エディタ・ウィンドウマネージャー new shell, editor, window
manager 圧縮解凍・暗号化アルゴリズム、rsyncの実装 encrypt/decrypt, rsync 形態素解析を利用した人工無能プログラム markov-chain program
レポートには高度な考察・議論を。The final report must have deep consideration