CSV to HTML

for VisualWorks 7.7 with Jun784

総理大臣

下記の単純なCSV(Comma-Separated Values)から、ここのリンクをたどって得られるページのHTML(HyperText Markup Language)を生成してください。
在位期間から在位日数をきちんと求め、縮小画像から画像をたどれるように構成してください。

人目,代,氏名,ふりがな,在位期間,出身校,政党,出身地,画像,縮小画像
39,61-63,佐藤 榮作,さとう えいさく,1964年11月9日〜1972年7月7日,東京帝国大学 法学部,自由民主党,山口県,images/039.jpg,thumbnails/039.jpg
40,64-65,田中 角榮,たなか かくえい,1972年7月7日〜1974年12月9日,中央工学校,自由民主党,新潟県,images/040.jpg,thumbnails/040.jpg
41,66-66,三木 武夫,みき たけお,1974年12月9日〜1976年12月24日,明治大学 法学部,自由民主党,徳島県,images/041.jpg,thumbnails/041.jpg
42,67-67,福田 赳夫,ふくだ たけお,1976年12月24日〜1978年12月7日,東京帝国大学(東京大学) 法学部,自由民主党,群馬県,images/042.jpg,thumbnails/042.jpg
43,68-69,大平 正芳,おおひら まさよし,1978年12月7日〜1980年6月12日,東京商科大学(一橋大学),自由民主党,香川県,images/043.jpg,thumbnails/043.jpg
44,70-70,鈴木 善幸,すずき ぜんこう,1980年7月17日〜1982年11月27日,農林省水産講習所(東京海洋大学),自由民主党,岩手県,images/044.jpg,thumbnails/044.jpg
45,71-73,中曾根 康弘,なかそね やすひろ,1982年11月27日〜1987年11月6日,東京帝国大学(東京大学) 法学部,自由民主党,群馬県,images/045.jpg,thumbnails/045.jpg
46,74-74,竹下 登,たけした のぼる,1987年11月6日〜1989年6月3日,早稲田大学 商学部,自由民主党,島根県,images/046.jpg,thumbnails/046.jpg
47,75-75,宇野 宗佑,うの そうすけ,1989年6月3日〜1989年8月10日,神戸商業大学 中退,自由民主党,滋賀県,images/047.jpg,thumbnails/047.jpg
48,76-77,海部 俊樹,かいふ としき,1989年8月10日〜1991年11月5日,早稲田大学 第二法学部,自由民主党,愛知県,images/048.jpg,thumbnails/048.jpg
49,78-78,宮澤 喜一,みやざわ きいち,1991年11月5日〜1993年8月9日,東京帝国大学(東京大学) 法学部,自由民主党,広島県,images/049.jpg,thumbnails/049.jpg
50,78-79,細川 護熙,ほそかわ もりひろ,1993年8月9日〜1994年4月28日,上智大学 法学部,日本新党,熊本県,images/050.jpg,thumbnails/050.jpg
51,80-80,羽田 孜,はた つとむ,1994年4月28日〜1994年6月30日,成城大学 経済学部,新生党,長野県,images/051.jpg,thumbnails/051.jpg
52,81-81,村山 富市,むらやま とみいち,1994年6月30日〜1996年1月11日,明治大学 政経学部,日本社会党,大分県,images/052.jpg,thumbnails/052.jpg
53,82-83,橋本 龍太郎,はしもと りゅうたろう,1996年1月11日〜1998年7月30日,慶應義塾大学 法学部,自由民主党,岡山県,images/053.jpg,thumbnails/053.jpg
54,84-84,小渕 恵三,おぶち けいぞう,1998年7月30日〜2000年4月5日,早稲田大学 大学院 政治学研究科,自由民主党,群馬県,images/054.jpg,thumbnails/054.jpg
55,85-86,森 喜朗,もり よしろう,2000年4月5日〜2001年4月26日,早稲田大学 第二商学部,自由民主党,石川県,images/055.jpg,thumbnails/055.jpg
56,87-89,小泉 純一郎,こいずみ じゅんいちろう,2001年4月26日〜2006年9月26日,慶應義塾大学 経済学部,自由民主党,神奈川県,images/056.jpg,thumbnails/056.jpg
57,90-90,安倍 晋三,あべ しんぞう,2006年9月26日〜2007年9月26日,成蹊大学 法学部,自由民主党,山口県,images/057.jpg,thumbnails/057.jpg
58,91-91,福田 康夫,ふくだ やすお,2007年9月26日〜2008年9月24日,早稲田大学 政治経済学部,自由民主党,群馬県,images/058.jpg,thumbnails/058.jpg
59,92-92,麻生 太郎,あそう たろう,2008年9月24日〜2009年9月16日,学習院大学 政治経済学部,自由民主党,福岡県,images/059.jpg,thumbnails/059.jpg
60,93-93,鳩山 由紀夫,はとやま ゆきお,2009年9月16日〜2010年6月8日,スタンフォード大学 大学院 経営工学,民主党,北海道,images/060.jpg,thumbnails/060.jpg
61,94-94,菅 直人,かん なおと,2010年6月8日〜2011年9月2日,東京工業大学 理学部,民主党,山口県,images/061.jpg,thumbnails/061.jpg
62,95-95,野田 佳彦,のだ よしひこ,2011年9月2日〜2012年12月26日,早稲田大学 政治経済学部,民主党,千葉県,images/062.jpg,thumbnails/062.jpg
57,96-98,安倍 晋三,あべ しんぞう,2012年12月26日〜2020年9月16日,成蹊大学 法学部,自由民主党,山口県,images/057.jpg,thumbnails/057.jpg
63,99-99,菅 義偉,すが よしひで,2020年9月16日〜2021年10月4日,法政大学 法学部,自由民主党,秋田県,images/063.jpg,thumbnails/063.jpg
64,100-,岸田 文雄,きしだ ふみお,2021年10月4日〜,早稲田大学 法学部,自由民主党,広島県,images/064.jpg,thumbnails/064.jpg

ヒント(手続き的)

たたき台となるようなクラス(けっして良好なプログラムではありませんが)を作っておきました。ダウンロードして読み込む(次のプログラムを実行する)と、ここのリンクをたどって得られるページを作るところまでゆけます。(注意:プロキシサーバを介してインターネット接続している場合には、JunURL requestInternetConnectionを実行し、インターネット接続ダイアログで必要な設定を行ってから、下記のプログラムを実行してください。)

| aString aURL aFilename |
aString := 'http://www.cc.kyoto-su.ac.jp/~atsushi/Programs/VisualWorks/CSV2HTML/20090902.st'.
aURL := JunURL named: aString.
aURL exists ifFalse: [^self error: 'URL not found: ' , aURL asString].
aFilename := Filename defaultDirectory construct: aURL asURI tail.
aURL downloadTo: aFilename.
aFilename exists ifFalse: [^self error: 'Can not download: ' , aURL asString].
JunControlUtility
    assert: [(aFilename withEncoding: #UTF_8) readStream]
    do: [:aStream |
        Transcript cr; show: 'Filing in from:'; crtab; show: aFilename asString.
        aStream fileIn]
    ensure: [:aStream | aStream close]
CSV2HTML4PrimeMinisters example2

配役(キャスティング)

ヒントにそって作成すると、次のダイアグラムに示すような手続き的なプログラムになります。プログラムを調べると、writeTableBodyOn: aStreamが煩雑なコードになっていますので、それをなんとか整然とさせようと、すぐにメソッドの修正に着手してしまいがちです。

20090902

オブジェクト的なプログラムに変容させるには、メソッド(手続き)の整理整頓などは後回しにして、まずは登場人物(登場オブジェクト)の策定をしましょう。配役を決める(キャスティングが大切な)のです。たとえば以下のように、リーダ、ダウンローダ、ライタ、テーブル、属性群、タプルのクラスを登場させ、入出力を司る抽象クラスにテーブル渡しにすることを明言します。これらの登場オブジェクトは、すべて総理大臣(PrimeMinisters)という名前空間に閉じ込められるものとしてデザインしてみます。

20091007

まだまだけっして良好なプログラムにはなっていませんが、上記のデザインを採用したプログラムを作っておきました。さぁ!さらに再デザインとリファクタリングを続けてゆきましょう。

| aString aURL aFilename |
(Store.Registry packageNamed: 'Translators')
    ifNotNil: [:aPackage | aPackage unloadFromImage].
aString := 'http://www.cc.kyoto-su.ac.jp/~atsushi/Programs/VisualWorks/CSV2HTML/20091007.st'.
aURL := JunURL named: aString.
aURL exists ifFalse: [^self error: 'URL not found: ' , aURL asString].
aFilename := Filename defaultDirectory construct: aURL asURI tail.
aURL downloadTo: aFilename.
aFilename exists ifFalse: [^self error: 'Can not download: ' , aURL asString].
JunControlUtility
    assert: [(aFilename withEncoding: #UTF_8) readStream]
    do: [:aStream |
        Transcript cr; show: 'Filing in from:'; crtab; show: aFilename asString.
        aStream fileIn]
    ensure: [:aStream | aStream close]
PrimeMinisters.Table example1; example2

再構成(リファクタリング)

HTMLを書き出すところで、writeTableBodyOn: aStreamが煩雑なコードになっているのは、入力形式(CSVのテーブルのレコード構造)と出力形式(HTMLのテーブルのレコード構造)が異なることに起因しています。入力用のテーブルから出力用のテーブルへと変換するトランスレータというクラスを登場させて再デザインしてみましょう。

20091104

下記のプログラムを評価してください。かなりいい感じになってきたプログラムを読み込むことができます。PrimeMinisters.Translator example1; example2で実行してみましょう。このプログラムを注意深く読んで、さらに良好なプログラムをめざしてください。

| aString aURL aFilename |
(Store.Registry packageNamed: 'Translators')
    ifNotNil: [:aPackage | aPackage unloadFromImage].
aString := 'http://www.cc.kyoto-su.ac.jp/~atsushi/Programs/VisualWorks/CSV2HTML/20091104.st'.
aURL := JunURL named: aString.
aURL exists ifFalse: [^self error: 'URL not found: ' , aURL asString].
aFilename := Filename defaultDirectory construct: aURL asURI tail.
aURL downloadTo: aFilename.
aFilename exists ifFalse: [^self error: 'Can not download: ' , aURL asString].
JunControlUtility
    assert: [(aFilename withEncoding: #UTF_8) readStream]
    do: [:aStream |
        Transcript cr; show: 'Filing in from:'; crtab; show: aFilename asString.
        aStream fileIn]
    ensure: [:aStream | aStream close].
(#{PrimeMinisters.Translator} value) example1; example2

for VisualWorks 7.7 with Jun784

Javaで作るためのJavaスケルトンアーカイブとPythonで作るのためのPythonスケルトンアーカイブを置いておきます。直前のSmalltalkプログラムのように、総理大臣の情報を記したCSVファイルからWebページに変換するプログラム自体をダウンロードして、それをコンパイルし、そして、起動して、当該の結果を得るところまで、これら一連の仕事をすべて含むようにJavaプログラムとPythonプログラムの双方をこしらえる【メタプログラミングする】ことができたならば、百点満点になります。

おまけとしてJavaドキュメントも置いておきます。ただし、メタ系を含んでいないJavaドキュメントです。Javaプログラム(コメント込みで約1,200行)を作成する際の参考にしていただければ幸いです。また、完全なPythonドキュメントはPythonスケルトンアーカイブを展開したディレクトリの中でmake pydocを行って得ることができます。Pythonプログラム(コメント込みで約450行)はJavaプログラムよりも簡潔になります。

複数の人たち(気心が知れた仲間たち)とProjectドキュメントアーカイブを用いながら開発プロジェクトに勤しんでいただき、Smalltalk、Java、Python、これら3つのオブジェクト指向プログラミングを堪能してください。

さらに、総理大臣単純なCSV(ダブルクォートを含まない)変換した結果に加えて、複雑なCSV(ダブルクォートを含む)でも変換した結果を得られるようにしていただけるとマッチベター(much better)です。

さらに、さらに、徳川幕府単純なCSV(Comma-Separated Values)から、ここのリンクをたどって得られるページのHTML(HyperText Markup Language)を生成できるはずです。オブジェクト指向における差分の外在化を上手に行ってください。たとえ、複雑なCSV(ダブルクォートを含む)であっても、ここのリンクをたどって得られるページのHTML(HyperText Markup Language)を生成できるようにしましょう。

おきばりやしとくれやす!


Updated: 2021/10/21 (Created: 2009/08/28) KSU AokiHanko