1. Top » 
  2. プログラミング全般

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

【Java】開発環境を活用してサーブレットを書く。

前々回ダウンロードした環境を前回設定しました。
今回は実際にそれらを利用してサーブレット/JSPを書いていきます。
とりあえずEclipseを起動させ、通常の状態にしておきます。

File→New→Other→Web→Dynamic Web Projectと進みます。

j2ee_03_01.jpg


次に、ProjectNameを入力します。
ここではよく使われる適当な名前「hoge」とでも設定しておきます。好きなモノでいいです。
その他の項目はデフォルトのままでFinishです。

j2ee_03_02.jpg


さて、Eclipseの通常画面に戻りました。
左側に出ているProjectExplorerの中にhogeというプロジェクトが出来ていることを確認します。
ProjectExplorerが出ていない場合は、Serverの時と同様で、Window→Shor Viewから表示させてください。
(たいていのモノを消してしまった場合、Window→Show Viewからもう一度表示させられます。)

また右上の部分でJava EEが選ばれていることも確認しておいてください。
この場所でメニューやボタンなどの配置をそれぞれのモードに変えることが出来ます。
よく使うモノとしてはJava、JavaEE、デバッグなどです。

j2ee_03_03.jpg


さて、プロジェクトhogeを右クリック→New→Servletと選択します。

j2ee_03_04.jpg


出てくるダイアログで作成するサーブレットの名前等の設定をします。ここでは

Java Package:hoge
ClassName:HelloServlet


とします。

j2ee_03_05.jpg



その後Finishとすると、いわゆるサーブレットのひな形が作成されて表示されます。
見てみましょう。

j2ee_03_06.jpg


さて、その中にはdoGetというメソッドが自動的に作成されていると思います。
このdoGetというメソッドがサーブレットのもっとも基本的なメソッドとなります。
ここを次のように書き直していきましょう。ただし、ソースファイルの先頭に

import java.io.PrintWriter;


を追加するのを忘れずに。

    protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=Windows-31J");
PrintWriter out = response.getWriter();

out.println("");
out.println(" ");
out.println("

Title

");
out.println("

");
out.println("Text output
");
out.println("日本語の例
");
out.println("

");
out.println("
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
");
out.println(" ");

}



Eclipseの場合、Ctrl-Sで上書き保存をするときに自動的にチェックされます。
特に赤色の×が周辺になければエラーがないコードということになります。
またCtrl+Shift+Fでコードを見やすいように整形することも出来ます。
(整形方法については自分で設定も出来ます。)

さて、このファイルはhogeプロジェクトのどこに保存されているのか言っていませんでした。
これはhoge→Java Resources: src→hoge→HelloServlet.javaというように見ることが出来ます。
HelloServletがファイル名、その前のhogeがダイアログで決めたパッケージ名です。


それではこのサーブレットを実行します。
上のようにして表示させたHelloServletを右クリック→Run As→Run on Serverを選びます。
初回実行時、どのサーバを用いるか聞かれるので、自分で用意したServerを選択します。
このダイアログ中、現在のプロジェクトは必ずこのServerを使うといったチェックボックスがありますから
チェックしておくと、毎回ダイアログが出なくなり便利です。


実行させると下の方にTomcatの起動メッセージが出ます。
すでにTomcatを起動していた場合、再起動するかどうかが問われますので
一応再起動しておくといろいろ安心です。

Tomcatが起動すると、内部ブラウザと呼ばれる確認用のブラウザが新しいタブで開かれます。
そこで実行結果を確認しましょう。

j2ee_03_07.jpg


おおおぉ。打ち込んだモノが出力されました。


ここまで非常に簡単ながら


  • 開発環境の用意

  • 開発環境の起動と準備

  • サーバの作り方

  • プロジェクトの作り方

  • サーブレットの作り方

  • サーブレットの実行



などを見てきました。
いかがでしたでしょうか。

次回はもう少し詳しく説明するか
もしくはせっかく準備しているので、データベース関連の話を絡めていきます。



category of Java:
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(一回目)
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(二回目)

【Haskell】ディレクトリ内を表示するlsをHaskellで書く

いわゆるlsコマンドまたはdirコマンドの簡単な部分だけを実装します。
ただし別の用途に使うことを前提としている話なので

 カレントディレクトリ .
 ペアレントディレクトリ ..

の二つについては表示から省くためにfilterをかけます。

import Directory

main = ( getDirectoryContents "." ) >>= printList

printList :: [String] -> IO()
printList ls = pList $ filter notCDPD ls
where
pList :: [String] -> IO ()
pList (x:xs) = do c <- getCurrentDirectory
putStrLn ( c ++ x )
pList xs
pList [] = putStr ""

notCDPD :: String -> Bool
notCDPD "." = False
notCDPD ".." = False
notCDPD other = True


bash-3.2$ ghc -o listing listing.hs
bash-3.2$ ./listing.exe
d:\taki\program\haskell\directorylisting.exe
d:\taki\program\haskell\directorylisting.hi
d:\taki\program\haskell\directorylisting.hs
d:\taki\program\haskell\directorylisting.o


このように。

基本的にはDirectoryに用意されている関数を使っているだけです。

getCurrentDirectory :: IO FilePath
 カレントディレクトリのパスを返す

getDirectoryContents :: FilePath -> IO [FilePath]
 現在のディレクトリ内のコンテンツをリストで返す。

FilePathというのはPreludeの中で書かれていて、Stringのことです。



category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)
【Haskell】コマンドライン引数の取得を活用する。
【Haskell】絶対パスからファイル名だけを取り出す
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.2)

【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.2)

とりあえず元々の機能を確認します。

ver.0
 標準入力からリストを受け取り、HTMLへと生成する
ver.1
 src.txtというファイルからリストを受け取り、htmlsrc.txtというファイルへ出力する

また新しく次のようなことが出来るようになりました。


  • ドラッグしてきた1つのファイルのパスを取得できる
  • ドラッグしてきた複数のファイルのパスを取得して標準出力へ出力できる
  • 絶対パスからファイル名に相当する場所を拡張子付きで取り出す


以上のことからVer.2として次のようなものを目指します。
ver.2
 ドラッグしてきたテキストファイルからリストを読み込み、HTMLへと整形する。
 出力先はhtml_(入力ファイル名.txt).txtという形にする

こんな感じです。
どうせなら複数ファイル同時読み込み同時出力を目指してもいいですが
とりあえず簡単なところで1ファイル限定と行きます。
さて、過去数回を参考にすると、main関数は次のように書くことが出来ます

※補足 次の関数はそれぞれ次のような関数でした。

getHtml
 一行ずつHTMLへ整形する関数
yenToSpace、split、reverse、head
 円マークをスペースに変える、スペースで絶対パスを分割する、処理をしてファイル名を取り出す

import IO
import System

header = "<hr size=\"1\">category of Haskell:"
hreftp = "http://parabola0.blog86.fc2.com/blog-entry-"
optemp = "html_"

main = do args <- getArgs
let ddfilepath = head args
ddfilename = head . reverse . words $ split ddfilepath
output = optemp ++ ddfilename ++ ".txt"
infile <- readFile ddfilepath
putStrLn infile
outhandle <- openFile output AppendMode
hPutStrLn outhandle header
hPutStr outhandle $ unlines $ map getHtml $ lines infile
hClose outhandle


今まで作成した関数をうまく使っています。
また記述が長くなりそうな部分はletを使ってローカル変数を宣言します。

ddfilepath
 D&Dしてきたファイルの絶対パス
ddfilename
 D&Dしてきたファイルのファイル名
output
 D&Dしてきたファイルの名前から作った出力先ファイル名

さて、これで準備完了です。
コンパイルしてsrc.txtを適当に用意します。

例 src_haskell.txt
  src_java.txt


srcには一行が 記事番号+タブ+タイトル で構成された情報が入っているのでした。
ここではそれぞれJavaとHaskellの記事についてリストを作ってみました。

これを出来たばかりの実行ファイルへD&Dすると

出力 html_src_haskel.txt.txt
   html_src_java.txt.txt


といったようなファイルが実行ファイルと同じディレクトリに作成されました。
作成されたHTMLソースを貼り付けて終了です。


※補足
二重拡張子、あまりかっこよくないですね。
簡単にとれるのですけど・・・

簡単に言うと、パターンマッチにピリオドも追加してスペースに変化させます。
するとファイル名の部分は一番後ろの一つ前になるので、そのリスト path を

path = ["d:", "taki", "program", "haskell", "blog", "src", "txt"]
head .tail . reverse path


のようにすればいい。(分かってるなら実装しなさい)


次回からはまた別のことをするか、それともまだ何かちょこまかするか。
おそらくどちらかです。




category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)
【Haskell】コマンドライン引数の取得を活用する。
【Haskell】絶対パスからファイル名だけを取り出す

【Haskell】絶対パスからファイル名だけを取り出す

ファイル名のリストを取り出せることは前回のことで分かった。
つまり入力ファイル名は、指定することなしにファイルを開くことに応用できる。
残りは、たとえば入力ファイル名がsrc_haskell.txtであれば
出力としてoutput_src_haskell.txt.txtのように、それに対応する結果を出力ファイルに書き出したい。
(うまくやれば拡張子を一つに出来るが、別に気にしなくてもいいかもしれない)

たとえばパス名というのは

d:\taki\program\haskell\src.txt


のような形で取得できる。ここからファイル名src.txtを得るにはどうすればいいか。
とりあえず次のようなやり方を考えた。


  1. ¥マークをスペースに変える
  2. 文字列をスペースで分けてリスト[String]として返す関数wordを通す
  3. リストとして [ ... "haskell", "src.txt"] のようなものを得る
  4. リストをひっくり返すreverseを通す ["src.txt", "haskell", ...]
  5. そのリストの先頭をheadで引っ張ってくる


つまり次のようにすればいい。
データはテスト。

test = "d:\\taki\\program\\haskell\\blog\\src.txt"
main = putStrLn $ head . reverse . words $ split test

split :: String -> String
split str = map yenToSpace test

yenToSpace :: Char -> Char
yenToSpace '\\' = ' '
yenToSpace x = x

これを動かすと次のように出力される。

d:\taki\program\haskell\blog\memo>ghc -o test test.hs

d:\taki\program\haskell\blog\memo>test.exe
src.txt


望み通りファイル名だけを取ってくることができた。





category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)
【Haskell】コマンドライン引数の取得を活用する。

【Haskell】コマンドライン引数の取得を活用する。

しばらく取り組んでいるブログに役立つプログラム作りのために、少し脇道にそれて頑張る。
普通にコマンドライン引数を取得して出力するだけなら

import System
main = do args <- getArgs
print args

こんな風に書ける。ちなみにこのプログラムは簡単に書くと

import System
main = getArgs >>= print

こんな風にも書ける。簡単バージョンだな。
またgetArgsの出力は文字列のリスト、[String]で得られる。

ところでGHCの吐き出すexeファイルにファイルを1つ、もしくは複数個D&Dすると
その絶対パスのリストが得られることが分かった。
これをうまく解析してやれば、Ver.1のプログラムをもう少し改善出来そうだ。
というわけでドラッグ&ドロップされたファイルのパスのリストの取得&出力をするプログラムを書く。

import System
main = do getArgs >>= printArgs
getChar >>= print

printArgs :: [String] -> IO ()
printArgs (f:l) = do putStrLn f
printArgs l
printArgs [] = putStr ""

このような関数定義はパターンマッチをうまく使うと綺麗に書ける。
(パターンマッチについてはまだ書いてないのでそのうち)

少し解説すると、一つ一つは簡略バージョンの描き方。
またgetCharとprintのコンビは、コマンドプロンプトがすぐに閉じないようにするために入れてある。


これをすると、1つまたは複数個のファイルをD&Dしたとき、そのパス名リストを出力してくれる。
また今回はgetArgsを使ったが、どうもgetContentsのままでもこれは出来るらしく
こういったのを組み合わせてブログの記事リスト作りプログラムを改良する。


category of Haskell:
Haskell】とても簡単なHaskellプログラムについて
Haskell】標準入力(stdin)を読み込むために
Haskell】結構頻繁に使う関数などの話
Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)

【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(二回目)

さて、前回の記事で環境をダウンロードして、解凍するまできました。
今回はこれを使って開発のテストを行っていきます。

1.まずはじめに
まずはじめにEclipseを立ち上げる。
(次のようなスプラッシュウィンドウが出る。表示はEclipseのバージョンによって異なる)
j2ee_02_01.jpg

初回起動時、次のようにどこにファイルなどを保存するかの指定が出来る。
これをWorkspaceといいます。前回作ったフォルダjavasrcを指定する。
また左下のチェックボックスにチェックを付けておくと、この場所で固定されます。
二回目以降も聞かれるのは多少面倒なので、とりあえず固定しておくといいです。
j2ee_02_02.jpg

さて、次のような画面が初期画面です。昔と比べて少し変わりましたね。
この画面に来たら、とりあえず右上の矢印を選んでください。Workbenchへ飛びます。
ワークベンチというのは、いわゆるプログラムを開発する画面のことです。
j2ee_02_03.jpg

そして次のようになります。ここまで来ると最初の段階が終わりです。
j2ee_02_04.jpg


2.Tomcatの設定をする
次にEclipseからTomcatをうまく利用するために設定する。
まずFile→New→Otherと進む。
j2ee_02_05.jpg

するとダイアログが出てくるので、この中のServerを選んでNextへ。
j2ee_02_06.jpg

Next後、Serverの種類としてApacheからTomcatのv5.5を選びNextです。
j2ee_02_07.jpg

基本的に設定はデフォルトでいいのですが、Installed Directoryとして
Apache Tomcat v5.5をダウンロードして解凍した場所を指定しておく。
j2ee_02_08.jpg

こうすることで下のView内のServerに今のServerが出てきます。
出てきていない場合はWindows→Show Vier→Serverを選んで出しておきます。
j2ee_02_13.jpg

ここからサーバを右クリックし、Startを選択します。
初回起動時、次のようにFirewallに引っかかるというメッセージが出るので、ブロックを解除します。
j2ee_02_14.jpg

ブロックを解除した後、再び右クリック→Restartとします。
その後ブラウザにてhttp://localhost:8080/にアクセスすると次のような画面が出ます。
(もしかしたら真っ白ページかもしれません)
いずれにしてもTomcatが起動していることが分かります。
j2ee_02_15.jpg

以上で基本設定を終わります。
SqliteやJDBCドライバはすぐには利用しないのでとりあえず保留です。
次回は実際にサーブレットとJSPを書きます。



category of Java:
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(一回目)

【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(一回目)

普段Javaのプログラムを書くとき、基本的にはEclipseを使うことが多い。
ごくまれにEmacsを使って書いているときもありますが、いちいちAPIを引くのも大変なので
コードアシスト&自動整形(Ctrl+Shift+F)がとても便利に感じられる。

サーブレット/JSPはサーバ上で動くJavaプログラムのようなモノで動的なもの。
動的なものというのは、要するにアクセスしたいという要求を出してからサーバ上で実行されるということ。
普通のWebページなどははじめからファイルがサーバ上においてある静的なものということになる。

サーブレットやJSPの開発するときに、プログラムを動作させるためにTomcatというプログラムを使う。
またサーブレットを開発すると、web.xmlを記述したり、適切な場所に配置したり、Tomcatを管理したりと
いろいろとやることが多くて、如何せん取っつきにくい。
(単純に言えば、本を見たりサイトを見て勉強する段階でこの捜査が面倒だ。)

というわけでEclipseの出番になるのだが、Eclipseを用いるとこういった作業を意識せずに
サーブレット/JSP開発をすることが出来るようになると考えていい。
というわけでその環境を整えるということについて知っていることをまとめた。



まずはじめに必要なものを取ってくる。
具体的に言うと

  • Eclipse本体(必要なら日本語化に必要なモノ。今回は使わない)
  • DBのソフト、今回はsqlite 3
  • DBに接続するためのJDBCドライバというもの
  • プログラムを動作させるTomcat本体
  • ※Java SDKがインストールされているパソコン
  • ※Javaの最低限の知識

この4つを準備する。(下二つはとりあえず前提)
以下、アクセス先は09年の09月15日現在です。

1.Eclipseの準備
アクセス先はhttp://www.eclipse.org/downloads/になる。
公式サイト、ダウンロードからEclipse IDE for Java EE Developers (189 MB)をダウンロード。
日本語化したい場合はEclipseのWikiなどを参考にする。
j2ee_02.jpg


2.Tomcatの準備
アクセス先はhttp://tomcat.apache.org/download-55.cgiになる。
とりあえずverとして5.5系を使うことにする、たぶん6.x系でも大丈夫。
とりあえず扱いやすいこともあってzipファイルをダウンロード。
j2ee_04.jpg


3.Sqlite&JDBC
これは別に必須ではないけれども、こういったアプリではDBへ接続するというのをよくやるのでとりあえず。
有名どころとしてはMySQLとPos・・・の2つがあるのだけれども、簡単に使えるSqliteを使う。
アクセス先はhttp://www.sqlite.org/download.htmlになる。
同様にzipをダウンロード、中には実行ファイルがただひとつ入っている。
j2ee_03.jpg

JDBCドライバのアクセス先はとりあえずhttp://www.zentus.com/sqlitejdbc/ここです。
JDBCにはいろいろ種類があるらしく、別にどれでもいいのですが、たまたまこれを使います。
j2ee_05.jpg

以上でダウンロード完了です。
おそらくEclipseのダウンロードが一番かかるはず。


配置&解凍などの作業
とりあえずblog用に環境を作りますので好きな場所に解凍してください。
今回はF:\blog_j2ee\以下に配置しています。

j2ee_06.jpg

解凍します。
またjavasrcというフォルダを作っておきます。

j2ee_07.jpg

以上で配置完了です。
次は開発環境をさらに整えていきます。

【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)

さて、前回の記事で作ったHaskellプログラム。いろいろと突っ込みどころがあります。
要するに「標準入力から読み込んで、HTMLソースを標準出力に出す」という制限の部分です。
だってあなた(自分)、ブログ書くときにコマンドプロンプト使うの?っていうことですよね。
確かにコマンドプロンプト自体はよく使うものですが、別にブログを書くときにまで使いたくはないですよね。
というわけでここを改善していきます。最低限利用できるプログラムにします。


どのように改良するのか。せっかくGHCはexeファイルを吐き出してくれる。
ですからファイルから読み込んでファイルから書き出すようないっぱしのプログラム形式にしてみたいわけです。
exeファイルとして使えるようになるので


  • exeファイルと同じところにあるsrc.txtというテキストファイルにリストを書いておく
  • このリストを読み出して、HTMLソースを作成する(前回のプログラム)
  • 最終的にexeファイルと同じところにあるhtmlsrc.txtに書き出す


このようにすればまだ使える感じがしてきますね、プログラムっぽいです。
というわけで前回のプログラムをうまく再利用しながらやっていきます。


前回のプログラムを再利用できるところ
getHtml :: String -> String
getHtml h = let wh = words h
number = head $ wh
title = head $ tail $ wh
in do "<a href=\""
++ hreftp
++ number
++ ".html\"><strong>" ++ title ++ "</strong></a>"

リストからHTMLソースにする部分。ここはそのまま使えます。
結局標準入力と標準出力を使う代わりにファイル入力とファイル出力を使えばいいのです。


ファイル入出力はIOパッケージで利用できるのですが、いわゆる例外が発生します。
こんなファイルありませんよ?とか、このファイルには書き込めませんよ?とかいうやつです。
こういった実行時例外などへの対処は、本当はちゃんと書かないといけないところだと思います。
がしかし、結局自分が使うプログラムであるから、手の抜けるところは手を抜くという方針です。
よってこういったところは少し目をつぶり、とにかく簡単なファイル入出力をします。
まず次のように宣言します。

import IO
infile = "src.txt"
output = "htmlsrc.txt"

IOを使えるように、また入力ファイル名と出力ファイル名を固定しておきましょう。
さて、次のようにファイル入出力を行うプログラムは書けます。

main = do cs <- readFile infile
outhandle <- openFile output AppendMode
hPutStrLn outhandle header
hPutStr outhandle $ unlines $ map getHtml $ lines cs
hClose outhandle

簡単ながら説明していきましょう。

1.もっとも簡単でシンプルなファイル入力
標準入力を取ってくるgetContentsというものがありました。
また実行時引数を取ってくるgetArgsというものもあります。
これと似たように、簡単なファイル入力にはreadFileという関数が利用できます。

cs <- readFile filename


このようにすることで、あたかもgetContentsしているようにファイルから入力できます。
前に言っているとおり、細かい例外の処理などはありません。
このようにして持ってきた入力csをver.0のように処理することでHTMLを生成できます。

2.簡単なファイル出力の準備
出力時、今回は現在存在しているファイルの末尾に書いていくという追加書き込みを利用します。
C言語風に言うと”a”というモードで、HaskellではAppendModeという表現がされます。
こういったものを扱うために、ハンドラと呼ばれるものを経由した書き込みを行います。
ハンドラの宣言は次のように行われています。

outhandle <- openFile output AppendMode


変数名outhandleで、openFileというのがデータコンストラクタです。
データコンストラクタについては【Haskell】C言語の構造体のようなものをHaskellで利用するで書きました。
このデータコンストラクタにファイル名とハンドラのモードを与えることでファイル書き込みのための準備をします。

3.実際にファイル出力をする場所
標準出力putStrLnとputStrに対応するファイル書き込みようの関数がhPutStrLn及びhPutStrです。

hPutStrLn handler STRING
hPutStr handerl STRING


のようにすることでSTRINGをhandlerで設定しているファイルに書き込むことが出来ます。


4.後片付け
書き込みを行った後、hCloseという関数でハンドラの後処理を行います。
これを行わないと書き込みがちゃんと完了しないといった現象が発生します。


実行
さて、このようにして作成したプログラムに、リスト

3 【Haskell】とても簡単なHaskellプログラムについて
8 【Haskell】標準入力(stdin)を読み込むために
36 【Haskell】結構頻繁に使う関数などの話
37 【Haskell】高階関数と型の定義について
489 【Haskell】リストの処理について
509 【Haskell】C言語の構造体のようなものをHaskellで利用する
511 【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)


をsrc.txtとして置いておき、プログラムを実行して生成されるファイルhtmlsrc.txtからのコピペを張って終わります。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)

【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)

Haskellの話のように、連続的に書いているような記事はよくあります。
そのとき、たとえばHaskellの記事であれば


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する


こんな感じの記事リストを付けていることがある。
実はこのリストは、いつもちまちまとHTMLのコードを自分で手打ちしている。
これを円滑に作成出来たらいいなぁと思ったことがあった。
せっかくHaskellを勉強しているので、これを題材としてプログラムを書いてみる。


このリストを作成するときに、次のような記事番号とタブ、記事タイトルが書かれたテキストファイルを適当に作る。

3	【Haskell】とても簡単なHaskellプログラムについて
8 【Haskell】標準入力(stdin)を読み込むために
36 【Haskell】結構頻繁に使う関数などの話
37 【Haskell】高階関数と型の定義について
489 【Haskell】リストの処理について
509 【Haskell】C言語の構造体のようなものをHaskellで利用する

このリストから上のリンクリストを作成するようなHaskellプログラムを作成する。
とりあえず簡単にするために、標準入力からこのリストを読み込み、標準出力へ出力する。
つまり

mbh.exe < src.txt > href.txt

のように使えるようにする。
まずは次のようにヘッダの部分(水平線の表示)と、リンクのひな形部分を定義しておく。

header = "<hr size=\"1\">category of Haskell:"
hreftp = "http://parabola0.blog86.fc2.com/blog-entry-"

標準入力を読むため、次のように書く。

main = do cs <- getContents
putStrLn header
putStrLn $ unlines $ map getHtml $ lines cs

標準入力から得られる上のテキストファイルのリストを一つずつ処理する。
つまり数値+タブ+タイトルの文字列からHTMLのリンクタグを返す関数getHtmlを作る。

getHtml :: String -> String
getHtml h = let wh = words h
number = head $ wh
title = head $ tail $ wh
in do "<a href=\""
++ hreftp
++ number
++ ".html\"><strong>" ++ title ++ "</strong></a>"

letなど、多少適当に書いていると思う。
(まだここら辺はあまりなれていないのでよく分からない感じもあったり)
これを利用すると次のようなHTMLのソースが出力される。

<hr size="1">category of Haskell:
<a href="http://parabola0.blog86.fc2.com/blog-entry-3.html"><strong>【Haskell】とても簡単なHaskellプログラムについて</strong></a>
<a href="http://parabola0.blog86.fc2.com/blog-entry-8.html"><strong>【Haskell】標準入力(stdin)を読み込むために</strong></a>
<a href="http://parabola0.blog86.fc2.com/blog-entry-36.html"><strong>【Haskell】結構頻繁に使う関数などの話</strong></a>
<a href="http://parabola0.blog86.fc2.com/blog-entry-37.html"><strong>【Haskell】高階関数と型の定義について</strong></a>
<a href="http://parabola0.blog86.fc2.com/blog-entry-489.html"><strong>【Haskell】リストの処理について</strong></a>
<a href="http://parabola0.blog86.fc2.com/blog-entry-509.html"><strong>【Haskell】C言語の構造体のようなものをHaskellで利用する</strong></a>

これをコピペすると、はいブログで使ってるようなリストのできあがり。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する

【Haskell】C言語の構造体のようなものをHaskellで利用する

Haskellは関数型言語であって、代入という概念がない
Schemeでも基本的にそうなのだけれども、Schemeの場合 set! などのように
!マークがついた命令=書き換えの命令というものが存在したので、代入のようなことは出来る。

HaskellもC言語のようにInt、Char、String、Boolなどいろいろな型がある。
それらを組み合わせて一つの型のように、C言語で言う構造体のように使うことも出来る。
ただし代入は出来ないので、最初に設定した値を変えることは出来ない。


まずC言語の構造体
typedef struct book{
char* name;
int pages;
} Book;

このように書けば、新しいBook型のデータの固まりが使える。
それぞれ

Book book;
strcpy(book.name, "Test Book Name");
book.pages = 100;

のように使える。

Haskellの場合
data Book = Book { name   :: String,
pages :: Int}

このように書く。ただ単にStringとIntの組ですよーということが言いたいのならば

data Book = Book String Int

とも書けるが、少し扱いにくくなる。
結局、扱いやすくするなら上のように、変数名にラベルをつけておくのがいい。

このとき
=の左辺にあるBookは新しい型の名前である。
=の右辺にあるBookをBook型のデータコンストラクタと呼ぶ。
型の名前もデータコンストラクタも、英大文字で始まる必要がある。

データコンストラクタは関連づけられている値を作成するときに使う関数のようなもの。
(細かいこと:データコンストラクタ自体も値を持つ。)
この場合、データコンストラクタBookはBook型の値を作るのに利用できる。
ただしデータコンストラクタの名前と型の名前は一致する必要はない。
ここでは分かりやすくするために一致させて書いている。

実際に値を作る
Haskellには代入がない。
よって最初に作成したときの値がずっと使われる。
最初に作成するのは、データコンストラクタを利用して次のように書ける。

book :: Book
book = Book "Usual Haskell Programming" 372

まずbook::Bookによって、変数bookがBook型であることを示す。なくてもいい。
次の一文によってデータを作成する。

Book "Usual Haskell Programming" 372


によって、nameの値がUsual Haskell Programmin、pagesの値が372であるBook型の固まりを作成している。
これをbookというBook型の変数に束縛することで、データを作成したことになる。

作成した型を利用する
型をdata構文によって作成したとき、自動的にアクセサが作られる。
アクセサとは型からそれぞれのメンバの値を取ってくるための関数のようなもの。
アクセサはメンバの名前と同じ名前の関数によって利用できる。つまり

name → name :: String を取得する関数
pages → pages :: Int を取得する関数


となる。

この関数は次のように利用できる。

main = do putStrLn $ show $ pages book
putStrLn $ name book
printBook

printBook = do putStr $ name book ++ " all pages:"
putStrLn $ show $ pages book

実行結果は次のようになる。

372
Usual Haskell Programming
Usual Haskell Programming all pages:372



372はpages関数で、次の名前はname関数で出力したモノ。
最後の文は自分で作った関数で出力したモノである。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。