%=====================================================================
% 秋田高専 5E 計算機応用 テキスト
%テーマ 練習(5) 関数
%    本テキストの内容
%        ・GnuplotとC言語からの操作
%          ・
%          ・
%          ・
%          ・
%          ・
%          ・
%          ・
%
% last updated 2005.7.4
%    created by  Masashi Yamamoto
%     e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,theorem,float}
\usepackage{listings, jlisting, html}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm偶数ページ
\textwidth 160mm
\newcommand{\command}[1]{「\texttt{#1}」}
\newcommand{\tw}[1]{\texttt{#1}}
\newcommand{\vm}[1]{\boldsymbol{#1}}
\newcommand{\diff}[0]{\mathrm{d}}
\newcommand{\pdiff}[3]{
 \if 1#1 \frac{\partial #2}{\partial #3}
 \else \frac{\partial^{#1} #2}{\partial #3^{#1}}\fi
}
%
\renewcommand{\lstlistingname}{リスト}
\lstset{language=C,%
        basicstyle=\footnotesize,%
        commentstyle=\texttt,%
        classoffset=1,%
        keywordstyle=\bfseries,%
	frame=tRBl,framesep=5pt,%
	showstringspaces=false,%
        numbers=left,stepnumber=1,numberstyle=\footnotesize%
	}%
%
\begin{htmlonly}
\usepackage{verbatimfiles}
 \providecommand{\lstinputlisting}[2][]{\verbatimlisting{#2}}
\end{htmlonly}
%
\begin{document}
\title{C言語の学習\\リダイレクト・パイプライン・gnuplot}
\author{山本昌志\thanks{独立行政法人　秋田工業高等専門学校　電気工学科}}
\date{2004年7月7日}
\maketitle
%
%=====================================================================
\section{本日の学習内容}
%=====================================================================
本日の内容は、以下の通りである。
\begin{itemize}
 \item UNIXの便利な機能であるリダイレクトとパイプ
 \item グラフ作成ソフトウェアーgnuplotの使い方とC言語からの操作
\end{itemize}
%
%
%=====================================================================
\section{リダイレクト}
%=====================================================================
標準入出力(キーボードとディスプレイ)先をファイルに変更することをリダイレクトと言
う。ディスプレイの出力をファイルに保存したい場合に有効である。

リダイレクトを用いるためには、UNIXのターミナルからの以下のようにコマンドを入力す
る。ここの\tw{command}は、実行ファイル名やUNIXコマンドのことである。
%
\begin{itemize}
 \item 標準出力をhogehogeというファイルに変更する場合(ファイルは新規作成)
       \begin{quote}
           \tw{command > hogehoge}
       \end{quote}
%           
 \item 標準エラー出力をhogehogeというファイルに変更する場合(ファイルは新規作成)
       \begin{quote}
           \tw{command 2> hogehoge}
       \end{quote}
%
 \item 標準入力の変わりに、hogehogeというファイルを使う場合(ファイルは新規作成)
	\begin{quote}
           \tw{command < hogehoge}
	\end{quote}
\end{itemize}

例えば、カレントディレクトリーのファイルの情報を、file.txtというファイルに記録し
たければ、
\begin{quote}
 \tw{ls -l > file.txt}
\end{quote}
とすれば良い。実際に実行してみて、その内容を確認せよ。
%
%
%=====================================================================
\section{パイプライン}
%=====================================================================
UNIXのコマンドの大部分は、標準入力(キーボード)からデータを受け取り、標準出力に処
理した結果を出力するようになっている。例えば、
%
\begin{quote}
 \begin{verbatim}
	ls -l
 \end{verbatim}
\end{quote}
%
などである。このように、コマンドをフィルターと呼ぶ。

複数のコマンドを使って、処理したいデータがある場合、UNIXではコマンドを接続することができ
る。標準出力から出てくるデータを次のコマンドの標準入力に渡すのである。例えば、
%
\begin{quote}
 \begin{verbatim}
	ls -l | sort -n +4
 \end{verbatim}
\end{quote}
%
のようにするのである。最初のコマンドで、カレントディレクトリーのファイルとディレ
クトリーの情報を調べ、次のコマンドでファイル容量の順に並べている。

このようにコマンドを連結する機能をパイプラインという。そして、連結する \tw{|} を
パイプという。あたかも、パイプにデータが流れているかのようである。もちろん、2個
以上のコマンドの連結が可能である。
%
%=====================================================================
\section{gnuplot}
%=====================================================================
%---------------------------------------------------------------------
\subsection{gnuplotとは}
%---------------------------------------------------------------------
本講義のメインテーマである数値計算では、大量の数値を扱うことが多い。いちいち紙に
書き写すことは不可能なので、ハードディスクに保存されるのが普通である。ハードディ
スクに保存されたデータは、適当に処理され、グラフや絵として出力されることが多い。
本講義でもグラフを書くことが多々あり、そのプログラムを書く必要がある。グラフィッ
クライブラリーを使うこともできるが、手間がかかる。そこで、グラフ作成ソフトウェアー
gunplotを使うことにする。ここでは、その取り扱い方法を述べる。

gnuplotは簡単に2D、3Dのグラフが作成できるフリーのソフトウェーである。単純なグラ
フから、学術論文用の高品質なグラフまで作成可能で、世界中で使われている。本当の読
み方は「ニュープロット」ではあるが、「グニュープロット」と呼ばれることも多い。こ
れは、Free Software Foundation (FSF)が進めているGNUプロジェクト\footnote{Unixに
似た フリーソフトウェアの完全なオペレーティングシステムの作成を目指す。}とは関係が無い。

UNIXに限らず、WindowsやMachintoshでも動作する。さらに、EXCELとくらべものにならな
いくらい美しいグラフを書くことができる。しかも、フリーである。卒業研究のグラフ作
成に使うのが良いだろう。

マニュアル類は、webにたくさんある。情報が必要になれば、以下のサイトを調べるのが
良いだろう。
\begin{quote}
\htmladdnormallink{http://t16web.lanl.gov/Kawano/gnuplot/}{http://t16web.lanl.gov/Kawano/gnuplot/}

\htmladdnormallink{http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/gnuplot-intro/}{http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/gnuplot-intro/}
\end{quote}
%---------------------------------------------------------------------
\subsection{操作方法}
%---------------------------------------------------------------------
簡単な操作方法を述べるが、本当は、先ほど示したwebページを見て各自学習する方が良
い。
%--------------------------
\subsubsection{起動と終了}
%--------------------------
まずは、gunplotを立ち上げてみよう。以下のコマンドを端末に入力する。
%
\begin{quote}
 \begin{verbatim}
	$ gnuplot
 \end{verbatim}
\end{quote}
%
すると、gnuplotが立ち上がり、コマンド入力画面になる。まずは、三角関数のグラフを
書いてみよう。以下のコマンドを入力する。
%
\begin{quote}
 \begin{verbatim}
	gnuplot> plot sin(x)
 \end{verbatim}
\end{quote}
%
$\sin$関数のグラフが描けただろう。次に、ヘルプを見たければ、
%
\begin{quote}
 \begin{verbatim}
	gnuplot> help
 \end{verbatim}
\end{quote}
%
とする。webページの方が圧倒的に分かり易いが、ネットに接続されていない環境の場合、
このヘルプや役立つ。gnuplotを終了するときには、
%
\begin{quote}
 \begin{verbatim}
	gnuplot> exit
 \end{verbatim}
\end{quote}
%
とする。
%--------------------------
\subsubsection{グラフの描画}
%--------------------------
以下のようにすると、いろいろなグラフがかける。練習せよ。
%
\begin{quote}
 \begin{tabular}{p{30mm}l}
  $x^3+x+1$ & \tw{plot x**3+x+1} \\
  $x^{0.5}$ & \tw{plot x**0.5} \\
  $\log_e(x)$ & \tw{plot log(x)} \\
  $\log_{10}(x)$ & \tw{gnuplot> plot log10(x)} \\
  $e^x$ & \tw{gnuplot> plot exp(x)}
 \end{tabular}
\end{quote}
%

3次元グラフも簡単にかける。3次元グラフの場合、右マウスでドラッグすると視点を変え
ることができるのでおもしろい。
%
\begin{quote}
 \begin{tabular}{p{30mm}l}
  $x^2+y^2$ & \tw{splot x**2+y**2} \\
  $x\sin(x+y)$ & \tw{splot x*sin(x+y)} \\
 \end{tabular}
\end{quote}
%

3次元グラフで隠線処理が必要であれば、\tw{set hidden3d}とする。また、表示するデー
タ点は、\tw{set isosample}で設定する。たとえば、以下のよ
うにすれば、隠線処理し、x方向とy方向とも40点のデータを出力する。
%
\begin{quote}
 \begin{verbatim}
	gnuplot> set hidden3d
	gnuplot> set isosample 40,40
	gnuplot> splot exp(0.5*(-x*x-y*y))*cos(x*x+y*y)
 \end{verbatim}
\end{quote}
%
%----------------------------------
\subsubsection{ファイルのデータの描画}
%----------------------------------
ファイル処理を学習した時に作成した、三角関数表をグラフにする。表は、各行に
$\theta$と$\sin\theta$、$\cos\theta$、$\tan\theta$の値が書き込まれていたはずであ
る。ファイルになっているデータをグラフ化するときには、\tw{plot}コマンドを使う。
引き続いて、ダブルクォーテーションでファイル名を囲む。最後に、\tw{using}を使って
x座標とy座標が書かれている列を示す。具体的には、
%
\begin{quote}
 \begin{verbatim}
	gnuplot> plot "trifunc.txt" using 1:2
 \end{verbatim}
\end{quote}
%
とする。各データ点を線で結びたければ、
%
\begin{quote}
 \begin{verbatim}
	gnuplot> plot "trifunc.txt" using 1:2 with line
 \end{verbatim}
\end{quote}
%
とする。複数のデータを一度に描くためには、
%
\begin{quote}
 \begin{verbatim}
	gnuplot> plot "trifunc.txt" using 1:2 with line, 
	              "trifunc.txt" using 1:3 with line,
	              "trifunc.txt" using 1:4 with line 
 \end{verbatim}
\end{quote}
%
とする。ただし、改行しないで(Enterキーを押さない)記述する必要がある。プロットす
るレンジを変えたい場合は、\tw{set xrange[ymin:ymax]}をつかう。
%
\begin{quote}
 \begin{verbatim}
	gnuplot> set yrange[-1.5:1.5]
	gnuplot> plot "trifunc.txt" using 1:2 with line, 
	              "trifunc.txt" using 1:3 with line,
	              "trifunc.txt" using 1:4 with line 
 \end{verbatim}
\end{quote}
%

%---------------------------------------------------------------------
\subsection{gnuplotのコマンド}
%---------------------------------------------------------------------
gnuplotは世界中で使われおり、便利な機能がたくさんある。使い方は、各自調べよ。
%
%---------------------------------------------------------------------
\subsection{C言語からgnuplotを操作する}
%---------------------------------------------------------------------
%-----------------------------
\subsubsection{パイプを使う方法}
%-----------------------------
gnuplotをC言語のプログラム制御するには、パイプを使うのが最も簡単である。C言語の
プログラムで、パイプを開いて、それをgnuplotに接続するのである。後は、C言語のプロ
グラムがgnuplotを操作するコマンドをパイプに流すのである。

UNIXでは、パイプを使うことにより、かなり複雑な動作も簡単に記述できる。そのパイプ
を開くためには、ファイルポインターが必要である。そのための変数を用意する。パイプ
の先もファイルとして扱われるのである。
%
\begin{quote}
 \tw{FILE *hoge;}
\end{quote}
%

次にgnuplotを立ち上げて、そこにパイプを接続する必要がある。パイプの情報のファイ
ルポインターで示される。
%
\begin{quote}
 \tw{hoge = popen("gnuplot -persist","w");}
\end{quote}
%
\tw{popen()}関数がパイプを開く命令である。

パイプを通して、gnuplotにコマンドを送るのは\tw{fprintf()}関数を使う。
%
\begin{quote}
  \tw{fprintf(hoge, "plot sin(x)");}
\end{quote}
%

終了時には、開いたパイプは閉じるのが礼儀である。
%
\begin{quote}
  \tw{pclose(hoge);}
\end{quote}
%
%
\begin{quote}
 \begin{itemize}
  \item[\textbf{[練習1]}]この一連の流れを、C言語のプログラムで実現せよ。
 \end{itemize}
\end{quote}
%
%
%--------------------------
\subsubsection{プログラム例}
%--------------------------
リスト\ref{prog:gnuplot}にgnuplotをC言語から制御したプログラム例を示す。
%
\lstinputlisting[caption=パイプを使ったgnuplotの制御,label=prog:gnuplot]
{program/gnuplot.c}
%
%======= 参考文献 =====================================================
\bibliographystyle{junsrt}
\bibliography{reference} 
%=====================================================================
\end{document}
