hikiutils 0.2.3.13 → 0.2.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/hikiutils.gemspec +2 -1
  3. data/hikiutils_bob/Rakefile +30 -16
  4. data/hikiutils_bob/code.hiki +9 -30
  5. data/hikiutils_bob/figs/hikiutils_bob.002.jpeg +0 -0
  6. data/hikiutils_bob/figs/hikiutils_bob.007.jpeg +0 -0
  7. data/hikiutils_bob/figs/hikiutils_bob.pdf +0 -0
  8. data/hikiutils_bob/hikiutils_bob/hikiutils_bob.002.jpeg +0 -0
  9. data/hikiutils_bob/hikiutils_bob/hikiutils_bob.007.jpeg +0 -0
  10. data/hikiutils_bob/hikiutils_bob.key +0 -0
  11. data/hikiutils_bob/latex_all.hiki +33 -8
  12. data/hikiutils_bob/latex_dir/code.aux +7 -14
  13. data/hikiutils_bob/latex_dir/code.log +28 -0
  14. data/hikiutils_bob/latex_dir/code.tex +13 -31
  15. data/hikiutils_bob/latex_dir/hikiutils_bob.log +59 -50
  16. data/hikiutils_bob/latex_dir/hikiutils_bob.pdf +0 -0
  17. data/hikiutils_bob/latex_dir/hikiutils_bob.synctex.gz +0 -0
  18. data/hikiutils_bob/latex_dir/hikiutils_bob.toc +29 -29
  19. data/hikiutils_bob/latex_dir/latex_all.aux +19 -16
  20. data/hikiutils_bob/latex_dir/latex_all.log +28 -0
  21. data/hikiutils_bob/latex_dir/latex_all.tex +34 -9
  22. data/hikiutils_bob/latex_dir/sync.aux +16 -16
  23. data/hikiutils_bob/latex_dir/sync.tex +4 -4
  24. data/hikiutils_yamane/Rakefile +14 -2
  25. data/hikiutils_yamane/abstract.hiki +3 -3
  26. data/hikiutils_yamane/discussion.hiki +9 -0
  27. data/hikiutils_yamane/hikiutils_yamane.hiki +8 -10
  28. data/hikiutils_yamane/introduction.hiki +1 -1
  29. data/hikiutils_yamane/latex_dir/abstract.tex +3 -3
  30. data/hikiutils_yamane/latex_dir/{%CA%FD/313/241.aux → discussion.aux} +8 -7
  31. data/hikiutils_yamane/latex_dir/discussion.tex +9 -0
  32. data/hikiutils_yamane/latex_dir/hikiutils_yamane.aux +3 -6
  33. data/hikiutils_yamane/latex_dir/hikiutils_yamane.log +50 -59
  34. data/hikiutils_yamane/latex_dir/hikiutils_yamane.pdf +0 -0
  35. data/hikiutils_yamane/latex_dir/hikiutils_yamane.synctex.gz +0 -0
  36. data/hikiutils_yamane/latex_dir/hikiutils_yamane.tex +4 -7
  37. data/hikiutils_yamane/latex_dir/hikiutils_yamane.toc +21 -21
  38. data/hikiutils_yamane/latex_dir/introduction.tex +1 -1
  39. data/hikiutils_yamane/latex_dir/method.aux +46 -0
  40. data/hikiutils_yamane/latex_dir/method.tex +247 -0
  41. data/hikiutils_yamane/latex_dir/results.aux +49 -0
  42. data/hikiutils_yamane/latex_dir/results.tex +249 -0
  43. data/hikiutils_yamane/method.hiki +234 -0
  44. data/hikiutils_yamane/results.hiki +225 -0
  45. data/hikiutils_yamane/toc.hiki +0 -1
  46. data/lib/hikiutils/version.rb +1 -1
  47. data/lib/hikiutils_thor.rb~ +37 -37
  48. data/lib/templates/Rakefile_hiki_sync +32 -17
  49. data/lib/templates/mi_key_bind_setting +1 -0
  50. metadata +33 -19
  51. data/hikiutils_yamane/Rakefile~ +0 -477
  52. data/hikiutils_yamane/command.hiki +0 -111
  53. data/hikiutils_yamane/compare.hiki +0 -116
  54. data/hikiutils_yamane/latex_dir/command.aux +0 -35
  55. data/hikiutils_yamane/latex_dir/command.log +0 -0
  56. data/hikiutils_yamane/latex_dir/command.tex +0 -123
  57. data/hikiutils_yamane/latex_dir/compare.aux +0 -30
  58. data/hikiutils_yamane/latex_dir/compare.tex +0 -123
  59. data/hikiutils_yamane/latex_dir/optparse.aux +0 -31
  60. data/hikiutils_yamane/latex_dir/optparse.tex +0 -119
  61. data/hikiutils_yamane/latex_dir/thor.aux +0 -32
  62. data/hikiutils_yamane/latex_dir/thor.tex +0 -110
  63. data/hikiutils_yamane/optparse.hiki +0 -114
  64. data/hikiutils_yamane/thor.hiki +0 -107
@@ -1,35 +0,0 @@
1
- \relax
2
- \@writefile{toc}{\contentsline {subsection}{\numberline {4.1}コマンドの命名原則}{16}}
3
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}hikiutilsの想定利用形態}{16}}
4
- \@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces hikiutilsがあらかじめ想定している利用形態.}}{16}}
5
- \newlabel{fig:002}{{4}{16}}
6
- \newlabel{default}{{4}{16}}
7
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}コメンド名と振る舞いの詳細}{17}}
8
- \@writefile{toc}{\contentsline {paragraph}{open FILE}{17}}
9
- \@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces }}{18}}
10
- \newlabel{default}{{1}{18}}
11
- \@writefile{toc}{\contentsline {paragraph}{ls [FILE]}{18}}
12
- \@writefile{toc}{\contentsline {paragraph}{rsync}{18}}
13
- \@writefile{toc}{\contentsline {paragraph}{touch FILE}{18}}
14
- \@writefile{toc}{\contentsline {paragraph}{pwd}{19}}
15
- \@writefile{toc}{\contentsline {paragraph}{cd VAL}{19}}
16
- \@setckpt{command}{
17
- \setcounter{page}{20}
18
- \setcounter{equation}{0}
19
- \setcounter{enumi}{2}
20
- \setcounter{enumii}{0}
21
- \setcounter{enumiii}{0}
22
- \setcounter{enumiv}{0}
23
- \setcounter{footnote}{0}
24
- \setcounter{mpfootnote}{0}
25
- \setcounter{part}{0}
26
- \setcounter{section}{4}
27
- \setcounter{subsection}{1}
28
- \setcounter{subsubsection}{2}
29
- \setcounter{paragraph}{0}
30
- \setcounter{subparagraph}{0}
31
- \setcounter{figure}{4}
32
- \setcounter{table}{1}
33
- \setcounter{lstnumber}{12}
34
- \setcounter{lstlisting}{0}
35
- }
File without changes
@@ -1,123 +0,0 @@
1
-
2
- \subsection{コマンドの命名原則}
3
- 機能ごとの動作はコマンドのオプションによって指定されます.
4
- このオプションにどのような名前をつけるかは,どれだけコマンドを覚えやすいかという
5
- 意味で重要です.コマンドの振る舞いを的確に表す名称をつける必要があります.
6
-
7
- この振る舞いとしてもっとも受け入れやすいのがshellで用意されているコマンドです.
8
- pwd, ls, rm, touch, openなどはもっとも直感的に動作がわかるコマンドです.
9
- hikiutilsの振る舞いを予測できるシェルコマンドと同じ名前でオプションを提供する
10
- ようにします.
11
-
12
- \subsubsection{hikiutilsの想定利用形態}
13
- ここでhikiutilsがあらかじめ想定している利用形態を解説しておきます.
14
-
15
- \begin{figure}[htbp]\begin{center}
16
- \includegraphics[width=10cm,bb= 0 0 737 553]{../figs/./hikiutils_yamane.002.jpg}
17
- \caption{hikiutilsがあらかじめ想定している利用形態.}
18
- \label{fig:002}
19
- \label{default}\end{center}\end{figure}
20
- hikiutilsは,
21
-
22
- \begin{itemize}
23
- \item local PCとglobal serverとが用意されており,
24
- \item それらのデータをrsyncで同期する
25
- \end{itemize}
26
- ことで動作することを想定しています.これは,ネットに繋がっていないオフラインの状況でも
27
- テキストなどの編集が可能で,さらに不用意な書き換えを防ぐための機構です.さらに,
28
- どちらもが何かあった時のバックアップともなって,ミスによる手戻りを防いでいます.
29
-
30
- これらの設定は,~/.hikircにyaml形式で記述・保存されています.
31
- \begin{lstlisting}[style=,basicstyle={\scriptsize\ttfamily}]
32
- bob% cat ~/.hikirc
33
- :srcs:
34
- - :nick_name: new_ist
35
- :local_dir: "/Users/bob/Sites/new_ist_data/ist_data"
36
- :local_uri: http://localhost/ist
37
- :global_dir: nishitani@ist.ksc.kwansei.ac.jp:/home/nishitani/new_ist_data/ist_data
38
- :global_uri: http://ist.ksc.kwansei.ac.jp/~nishitani/
39
- - :nick_name: dmz0
40
- :local_dir: "/Users/bob/Sites/nishitani0/Internal/data"
41
- :local_uri: http://localhost/~bob/nishitani0/Internal
42
- :global_dir: bob@dmz0:/Users/bob/Sites/nishitani0/Internal/data
43
- :global_uri: http://nishitani0.kwansei.ac.jp/~bob/nishitani0/Internal
44
- \end{lstlisting}
45
- また,一般的に一人のユーザがいくつものまとまりとしてのlocal-globalペアを
46
- 保持して管理することが普通です.それぞれにnicke\_nameをつけて管理しています.
47
- \begin{lstlisting}[style=,basicstyle={\scriptsize\ttfamily}]
48
- bob% hiki -s
49
- hikiutils: provide utilities for helping hiki editing.
50
- "open -a mi"
51
- target_no:1
52
- editor_command:open -a mi
53
- id | name | local directory | global uri
54
- -----------------------------------------------------------------------------
55
- 0 | new_ist | /Users/bob/Sites/new_ist_data/ist_data | http://ist.ksc.k
56
- *1 | dmz0 | /Users/bob/Sites/nishitani0/Internal/data | http://nishitani
57
- 2 | ist | /Users/bob/Sites/hiki-data/data | http://ist.ksc.k
58
- 3 | new_maple | /Users/bob/Sites/new_ist_data/maple_hiki_d| http://ist.ksc.k
59
- \end{lstlisting}
60
- とすると,それらの一覧と,いまtargetにしているnick\_nameディレクリが表示されます.
61
-
62
- \subsubsection{コメンド名と振る舞いの詳細}
63
- 検討の結果コマンドを以下のように書き換えることとします.
64
- 上部に記した,特によく使うコマンドに関しては,shellでよく使われるコマンド名と一致するにようにしました.
65
-
66
- \begin{table}[htbp]\begin{center}
67
- \caption{}
68
- \begin{tabular}{llll}
69
- \hline
70
- 変更前 &変更後 &動作の解説 \\ \hline
71
- edit FILE &open &open file \\
72
- list [FILE] &ls &list files \\
73
- rsync &rsync &rsync files \\
74
- update FILE &touch &update file \\
75
- show &pwd &show nick\_names \\
76
- target VAL &cd &targetを変える,cdとのメタファ \\
77
- & \\
78
- move [FILE] &mv &move file \\
79
- remove [FILE] &rm &remove files \\
80
- add & &add sources info \\
81
- checkdb & &check database file \\
82
- datebase FILE &db &read datebase file \\
83
- display FILE &show &display converted hikifile \\
84
- euc FILE & &translate file to euc \\
85
- help [COMMAND] &-h &Describe available commands \\
86
- version &-v &show program version \\
87
- \hline
88
- \end{tabular}
89
- \label{default}
90
- \end{center}\end{table}
91
- %for inserting separate lines, use \hline, \cline{2-3} etc.
92
-
93
- それぞれの意図を動作の解説として記述しています.
94
-
95
- \paragraph{open FILE}
96
- ファイルを編集のためにeditorでopen.Editorは~/.hikircに
97
- \begin{quote}\begin{verbatim}
98
- :editor_command: open -a mi
99
- \end{verbatim}\end{quote}
100
- として保存されている.open -a miをemacsなどに適宜変更して使用.
101
-
102
- \paragraph{ls [FILE]}
103
- local\_dirにあるファイル名を[FILE*]として表示.例えば,hikiutils\_yamane以下の拡張子が
104
- ついたファイルを表示.hikiシステムではtextディレクトリーは階層構造を取ることができない.
105
- 西谷研ではdirectoryの代わりにスネーク表記で階層構造を表している.
106
-
107
- \paragraph{rsync}
108
- local\_dirの内容をglobal\_dirにrsyncする.逆方向は同期に誤差が生じたり,permissionが
109
- おかしくなるので,現在のところ一方向の同期のみとしている.したがって,作業手順としては
110
- テキストの変更はlocal\_dirで読み行うようにしている.
111
-
112
- \paragraph{touch FILE}
113
- loccal\_dirで書き換えたFILEの内容をlocal\_uriに反映させ,ブラウザで表示.シェルコマンドの
114
- touchによって,変更時間を現在に変え,最新状態とするのに似せてコマンド名をtouchとしている.
115
-
116
- \paragraph{pwd}
117
- nick\_nameの一覧とtargetを表示,current targetをcurrent dirとみなして,
118
- コマンド名をpwdとした.
119
-
120
- \paragraph{cd VAL}
121
- targetを変える,change directoryとのメタファ.ただし,いまのところnick\_nameでは
122
- 対応しておらず,nick\_nameの番号をVAL入力することで変更する.
123
-
@@ -1,30 +0,0 @@
1
- \relax
2
- \@writefile{toc}{\contentsline {subsection}{\numberline {3.1}optparseとthorの比較}{8}}
3
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1}optparse}{8}}
4
- \@writefile{toc}{\contentsline {paragraph}{runメソッド}{9}}
5
- \@writefile{toc}{\contentsline {paragraph}{initializeメソッド}{9}}
6
- \@writefile{toc}{\contentsline {paragraph}{executeメソッド}{9}}
7
- \@writefile{toc}{\contentsline {paragraph}{fizzbuzzメソッド}{10}}
8
- \@writefile{toc}{\contentsline {paragraph}{versionメソッド}{10}}
9
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2}Thor}{10}}
10
- \@writefile{toc}{\contentsline {paragraph}{fizzbuzzメソッド,versionメソッド}{10}}
11
- \@setckpt{compare}{
12
- \setcounter{page}{11}
13
- \setcounter{equation}{0}
14
- \setcounter{enumi}{2}
15
- \setcounter{enumii}{0}
16
- \setcounter{enumiii}{0}
17
- \setcounter{enumiv}{0}
18
- \setcounter{footnote}{0}
19
- \setcounter{mpfootnote}{0}
20
- \setcounter{part}{0}
21
- \setcounter{section}{3}
22
- \setcounter{subsection}{1}
23
- \setcounter{subsubsection}{2}
24
- \setcounter{paragraph}{0}
25
- \setcounter{subparagraph}{0}
26
- \setcounter{figure}{1}
27
- \setcounter{table}{0}
28
- \setcounter{lstnumber}{16}
29
- \setcounter{lstlisting}{0}
30
- }
@@ -1,123 +0,0 @@
1
-
2
- \subsection{optparseとthorの比較}
3
- 今回の既存システムであるhikiutilsはoptparseというコマンドライン解析ライブラリが用いられている.
4
- 本研究ではこの代替ライブラリとしてThorの採用を検討した.
5
- 本章の最初では,FizzBuzzという簡単なコードを例にoptparseとThorにより作成するコマンドライン解析コードの比較を行う.
6
-
7
- \subsubsection{optparse}
8
- optparseとは,getoptよりも簡便で,柔軟性に富み,かつ強力なコマンドライン解析ライブラリである.optparseでは,より宣言的なスタイルのコマンドライン解析手法,すなわちOptionParserのインスタンスでコマンドラインを解析するという手法をとっている.これを使うと,GNU/POSIX構文でオプションを指定できるだけでなく,使用法やヘルプメッセージの生成も行える[2].利用頻度はあまり高くないが古くから開発され,使用例が広く紹介されている.
9
-
10
- optparseの基本的な流れとしては
11
-
12
- \begin{enumerate}
13
- \item OptionParserオブジェクトoptを生成する
14
- \item オプションを取り扱うブロックをopt.onに登録する
15
- \item opt.parse(ARGV)でコマンドラインを実際にparseする
16
- \end{enumerate}
17
- である.
18
-
19
- OptionParserはコマンドラインのオプション取り扱うためのクラスであるためオブジェクトoptを生成されopt.onにコマンドを登録することができる.しかし,OptionParser\#onにはコマンドが登録されているだけであるため,OptionParser\#parseが呼ばれた時,コマンドラインにオプションが指定されていれば実行される.optparseにはデフォルトとして--helpと--versionオプションを認識する[3].
20
-
21
- 以下に示したコードがoptparseで記述されたfizzbuzzである.
22
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
23
- module Fizzbuzz
24
- class Command
25
-
26
- def self.run(argv)
27
- new(argv).execute
28
- end
29
-
30
- def initialize(argv)
31
- @argv = argv
32
- end
33
-
34
- def execute
35
- options = Options.parse!(@argv)
36
- sub_command = options.delete(:command)
37
- case sub_command
38
- when 'fizzbuzz'
39
- fizzbuzz(options[:id])
40
- when 'version'
41
- version
42
- end
43
- end
44
-
45
- def fizzbuzz(limit_number)
46
- (0..limit_number).map do |num|
47
- if (num % 15).zero? then print 'FizzBuzz'
48
- elsif (num % 5).zero? then print 'Buzz'
49
- elsif (num % 3).zero? then print 'Fizz'
50
- else print num.to_s
51
- end
52
- print ' '
53
- end
54
- end
55
-
56
- def version
57
- puts Fizzbuzz::VERSION
58
- exit
59
- end
60
- end
61
- end
62
- \end{lstlisting}
63
- このコードはfizzbuzzとversionのコマンドを実行させる.
64
-
65
- \paragraph{runメソッド}
66
- コマンド実行を行うためのメソッドであり,argv配列を代入することでexecuteメソッドを実行する.
67
-
68
- \paragraph{initializeメソッド}
69
- 初期化を行うメソッドである.
70
- \begin{quote}\begin{verbatim}
71
- @argv = argv
72
- \end{verbatim}\end{quote}
73
- こうすることでargvをクラス内で利用できるようにする.
74
-
75
- \paragraph{executeメソッド}
76
- 上記でoptparseではopt.onにコマンドを登録する必要があると説明したが,opt.onで登録できるものはハイフンがついたコマンドだけであり,ハイフンなしのコマンドの登録はこのようになる.
77
-
78
- argv配列の解析を行うOptions.parse!(@argv)をoptionsに代入して解析を行いsub\_commandに代入する.sub\_commandがfizzbuzzであればfizzbuzz(options[:id])メソッドを実行,versionであればversionメソッドを実行する.
79
-
80
- \paragraph{fizzbuzzメソッド}
81
- 引数としてlimit\_numberを受け取り,0〜limit\_numberまでの数字を繰り返す.numが15であればFizzbuzzを表示,5であればBuzzを表示,3であればFizzを表示,それ以外は数字を表示し,その後に空白を表示する.
82
-
83
- \paragraph{versionメソッド}
84
- fizzbuzzのバージョンを表示する.
85
-
86
- \subsubsection{Thor}
87
- Thorとは,コマンドラインツールの作成を支援するライブラリのことである.gitやbundlerのようにサブコマンドを含むコマンドラインツールを簡単に作成することができる[4].
88
-
89
- Thorの基本的な流れとしては
90
-
91
- \begin{enumerate}
92
- \item Thorを継承したクラスのパブリックメソッドがコマンドになる
93
- \item クラス.start(ARGV)でコマンドラインの処理をスタートする
94
- \end{enumerate}
95
- である[4].
96
-
97
- startに渡す引数が空の場合,Thorはクラスのヘルプリストを出力する.また,Thorはサブコマンドやサブサブコマンドも容易に作ることができる.
98
-
99
- 以下に示したコードがThorで記述されたfizzbuzzである.
100
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
101
- module Fizzbuzz
102
- class CLI < Thor
103
-
104
- desc 'fizzbuzz', 'Get fizzbuzz result from limit number'
105
- def fizzbuzz(limit)
106
- print Fizzbuzz.fizzbuzz(limit).join(',')
107
- exit
108
- end
109
-
110
- desc 'version', 'version'
111
- def version
112
- puts Fizzbuzz::VERSION
113
- end
114
- end
115
- end
116
- \end{lstlisting}
117
- このコードもoptparseのfizzbuzzと同様fizzbuzzとversionのコマンドを実行させる.
118
-
119
- \paragraph{fizzbuzzメソッド,versionメソッド}
120
- descでコマンド一覧で表示させるコマンド名と説明を書く.
121
-
122
- メソッド内ではそれぞれのコマンドの処理内容が書かれている.
123
-
@@ -1,31 +0,0 @@
1
- \relax
2
- \@writefile{toc}{\contentsline {subsection}{\numberline {3.2}既存のhikiutilsのコマンド解説}{11}}
3
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}コマンドの登録と実行メソッド}{11}}
4
- \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces コマンドの登録と実行メソッドの対応.}}{11}}
5
- \newlabel{fig:005}{{2}{11}}
6
- \newlabel{default}{{2}{11}}
7
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}CLIの実行プロセス}{12}}
8
- \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces CLIの実行プロセス.}}{13}}
9
- \newlabel{fig:007}{{3}{13}}
10
- \newlabel{default}{{3}{13}}
11
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.3}コード}{13}}
12
- \@setckpt{optparse}{
13
- \setcounter{page}{15}
14
- \setcounter{equation}{0}
15
- \setcounter{enumi}{2}
16
- \setcounter{enumii}{0}
17
- \setcounter{enumiii}{0}
18
- \setcounter{enumiv}{0}
19
- \setcounter{footnote}{0}
20
- \setcounter{mpfootnote}{0}
21
- \setcounter{part}{0}
22
- \setcounter{section}{3}
23
- \setcounter{subsection}{2}
24
- \setcounter{subsubsection}{3}
25
- \setcounter{paragraph}{0}
26
- \setcounter{subparagraph}{0}
27
- \setcounter{figure}{3}
28
- \setcounter{table}{0}
29
- \setcounter{lstnumber}{38}
30
- \setcounter{lstlisting}{0}
31
- }
@@ -1,119 +0,0 @@
1
-
2
- \subsection{既存のhikiutilsのコマンド解説}
3
- 既存のhikiutilsはコマンド解析ライブラリのoptparseを用いて,コマンドの処理を行っている.
4
- optparseの特徴は,「コマンドの登録,実行method」に分けて記述することが期待されている.
5
- また,CLIの起動の仕方が特徴的である.この二つを取り出して,動作とコードを説明する.
6
-
7
- \subsubsection{コマンドの登録と実行メソッド}
8
- \begin{figure}[htbp]\begin{center}
9
- \includegraphics[width=10cm,bb= 0 0 737 553]{../figs/./hikiutils_yamane.005.jpg}
10
- \caption{コマンドの登録と実行メソッドの対応.}
11
- \label{fig:005}
12
- \label{default}\end{center}\end{figure}
13
- optparseでは以下の通り,コマンドの登録と実行が行われる.
14
-
15
- \begin{enumerate}
16
- \item OptionParserオブジェクトoptを生成
17
- \item optにコマンドを登録
18
- \item 入力されたコマンドの処理のメソッドへ移動
19
- \end{enumerate}
20
- optparseではOptionParserオブジェクトoptの生成を行い,コマンドをoptに登録することでコマンドを作成することができる.しかし,これはコマンドを登録しているだけでコマンドの一覧ではこれを表示することができるが,コマンドの実行を行うためには実行を行うためのメソッドを作成する必要がある.optparseでのコマンドの実行はoptで登録されたコマンドが入力されることでそれぞれのコマンドの処理を行うメソッドに移動し処理を行う.しかし,このコマンド登録はハイフンを付けたコマンドしか登録ができず,ハイフンなしのコマンド登録はまた別の手段でやらなくてはいけない.
21
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
22
- def execute
23
- @argv << '--help' if @argv.size==0
24
- command_parser = OptionParser.new do |opt|
25
- opt.on('-v', '--version','show program Version.') { |v|
26
- opt.version = HikiUtils::VERSION
27
- puts opt.ver
28
- }
29
- opt.on('-s', '--show','show sources') {show_sources}
30
- opt.on('-a', '--add','add sources info') {add_sources }
31
- opt.on('-t', '--target VAL','set target id') {|val| set_target(val)}
32
- opt.on('-e', '--edit FILE','open file') {|file| edit_file(file) }
33
-
34
- ...省略...
35
-
36
- end
37
- begin
38
- command_parser.parse!(@argv)
39
- rescue=> eval
40
- p eval
41
- end
42
- dump_sources
43
- exit
44
- end
45
-
46
- def show_sources()
47
- printf("target_no:%i\n",@src[:target])
48
- printf("editor_command:%s\n",@src[:editor_command])
49
-
50
- ...省略...
51
-
52
- end
53
-
54
- 以下略
55
-
56
- \end{lstlisting}
57
- \subsubsection{CLIの実行プロセス}
58
- \begin{figure}[htbp]\begin{center}
59
- \includegraphics[width=10cm,bb= 0 0 737 553]{../figs/./hikiutils_yamane.007.jpg}
60
- \caption{CLIの実行プロセス.}
61
- \label{fig:007}
62
- \label{default}\end{center}\end{figure}
63
- optparseを用いた場合のCLIの実行プロセスは次の通りとなる.
64
-
65
- \begin{enumerate}
66
- \item HikiのHikiUtils::Command.run(ARGV)でhikiutils.rbのrunメソッドを呼ぶ
67
- \item new(argv).executeでexecuteメソッドが実行される
68
- \end{enumerate}
69
- optparseではHikiutils::Command.run(ARGV)を実行される.requireで呼び出されたhikiutils.rbでrunメソッドが実行される.そこでコマンドを登録しているexecuteメソッドへ移動し入力したコマンドと対応させる.そして,対応したコマンドの処理が行われるメソッドに移動することで実行される.このようにoptparseでは実行を行うためのメソッドが必要であるが,
70
-
71
- \subsubsection{コード}
72
- optparseの呼び出し側のexe/hikiのコードは次の通りである.
73
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
74
- #!/usr/bin/env ruby
75
-
76
- require "hikiutils"
77
-
78
- HikiUtils::Command.run(ARGV)
79
- \end{lstlisting}
80
- また呼び出される側のlib/hikiutils.rbのrunおよびexecute部のコードは次の通りとなる.
81
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
82
- def self.run(argv=[])
83
- print "hikiutils: provide utilities for helping hiki editing.\n"
84
- new(argv).execute
85
- end
86
-
87
- def execute
88
- @argv << '--help' if @argv.size==0
89
- command_parser = OptionParser.new do |opt|
90
- opt.on('-v', '--version','show program Version.') { |v|
91
- opt.version = HikiUtils::VERSION
92
- puts opt.ver
93
- }
94
- opt.on('-s', '--show','show sources') {show_sources}
95
- opt.on('-a', '--add','add sources info') {add_sources }
96
- opt.on('-t', '--target VAL','set target id') {|val| set_target(val) }
97
- opt.on('-e', '--edit FILE','open file') {|file| edit_file(file) }
98
- opt.on('-l', '--list [FILE]','list files') {|file| list_files(file) }
99
- opt.on('-u', '--update FILE','update file') {|file| update_file(file) }
100
- opt.on('-r', '--rsync','rsync files') {rsync_files}
101
- opt.on('--database FILE','read database file') {|file| db_file(file)}
102
- opt.on('--display FILE','display converted hikifile') {|file| display(f\
103
- ile)}
104
- opt.on('-c', '--checkdb','check database file') {check_db}
105
- opt.on('--remove FILE','remove file') {|file| remove_file(file)}
106
- opt.on('--move FILES','move file1,file2',Array) {|files| move_file(file\
107
- s)}
108
- opt.on('--euc FILE','translate file to euc') {|file| euc_file(file) }
109
- opt.on('--initialize','initialize source directory') {dir_init() }
110
- end
111
- begin
112
- command_parser.parse!(@argv)
113
- rescue=> eval
114
- p eval
115
- end
116
- dump_sources
117
- exit
118
- end
119
- \end{lstlisting}
@@ -1,32 +0,0 @@
1
- \relax
2
- \@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Thorによる実装}{20}}
3
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.1}クラス初期化}{20}}
4
- \@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces Thorのinitializeでのコード}}{20}}
5
- \newlabel{default}{{5}{20}}
6
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.2}コマンド定義}{21}}
7
- \@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces thorにおけるコマンド記述のひな形.}}{22}}
8
- \newlabel{default}{{6}{22}}
9
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.3}CLIの実行プロセス}{22}}
10
- \@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces CLIの実行プロセス.}}{23}}
11
- \newlabel{default}{{7}{23}}
12
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.4}optparseとの全体的な比較}{24}}
13
- \@setckpt{thor}{
14
- \setcounter{page}{25}
15
- \setcounter{equation}{0}
16
- \setcounter{enumi}{2}
17
- \setcounter{enumii}{0}
18
- \setcounter{enumiii}{0}
19
- \setcounter{enumiv}{0}
20
- \setcounter{footnote}{0}
21
- \setcounter{mpfootnote}{0}
22
- \setcounter{part}{0}
23
- \setcounter{section}{4}
24
- \setcounter{subsection}{2}
25
- \setcounter{subsubsection}{4}
26
- \setcounter{paragraph}{0}
27
- \setcounter{subparagraph}{0}
28
- \setcounter{figure}{7}
29
- \setcounter{table}{1}
30
- \setcounter{lstnumber}{14}
31
- \setcounter{lstlisting}{0}
32
- }
@@ -1,110 +0,0 @@
1
- \subsection{Thorによる実装}
2
- 手法のところで概観した通り,thorを用いることで記述の簡略化が期待できる.ここでは,実際に書き換える前後,すなわちoptparse版とthor版の対応するコードを比較することで,以下の具体的な違い
3
-
4
- \begin{itemize}
5
- \item クラス初期化
6
- \item コマンド定義
7
- \item CLIの実行プロセス
8
- \end{itemize}
9
- について詳しく検討を行う.
10
-
11
- \subsubsection{クラス初期化}
12
- \begin{figure}[htbp]\begin{center}
13
- \includegraphics[width=10cm,bb= 0 0 737 553]{../figs/./hikiutils_yamane.003.jpg}
14
- \caption{Thorのinitializeでのコード}
15
- \label{default}\end{center}\end{figure}
16
- Thorのinitializeでのコードはつぎの通りである.
17
-
18
- \begin{enumerate}
19
- \item Hikithor::CLI.start(ARGV)が呼ばれる
20
- \item initializeメソッドが呼ばれる
21
- \item これではThorのinitializeメソッドが呼ばれない
22
- \item superを書くことでThorのinitializeメソッドが呼ばれる
23
- \end{enumerate}
24
- optparseではrequireでoptparseを呼びoptparseのinitializeを定義する必要はないが,Thorはinitializeを定義する必要がある.Thorの定義方法はrequireでThorを呼びCLIクラスで継承し,initializeメソッドにsuperを書くことでThorのinitializeが呼ばれる.initializeメソッド内ではThorの初期設定がされていないため,スーパークラスのメソッドを読み出してくれるsuperを書き加えることで図のようにinitializeメソッド内でThorのinitilalizeメソッドが呼ばれ定義される.
25
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
26
-
27
- module Hikithor
28
-
29
- DATA_FILE=File.join(ENV['HOME'],'.hikirc')
30
- attr_accessor :src, :target, :editor_command, :browser, :data_name, :l_dir
31
-
32
- class CLI < Thor
33
- def initialize(*args)
34
- super
35
- @data_name=['nick_name','local_dir','local_uri','global_dir','global_uri']
36
- data_path = File.join(ENV['HOME'], '.hikirc')
37
- DataFiles.prepare(data_path)
38
-
39
- ...以下略...
40
- end
41
- \end{lstlisting}
42
- \subsubsection{コマンド定義}
43
- \begin{figure}[htbp]\begin{center}
44
- \includegraphics[width=10cm,bb= 0 0 737 553]{../figs/./hikiutils_yamane.004.jpg}
45
- \caption{thorにおけるコマンド記述のひな形.}
46
- \label{default}\end{center}\end{figure}
47
- thorではoptparseのような登録処理はない.図にある通りにコマンドが記述され,それらは以下のように構成される.
48
-
49
- \begin{enumerate}
50
- \item desc以降にコマンド名と,その説明が記述される.これらはコマンドhelpで一覧として表示させる
51
- \item mapによって別のコマンド名でも実行できるように定義される.
52
- \item defで定義されたメソッドの実行コード
53
- \end{enumerate}
54
- Thorではdescで一覧を表示されるコマンド名,コマンドの説明を登録する.しかし,ここで記述したコマンドは単に一覧で表示させるためのものであり,実際に実行される時に呼び出すコマンド名は,defで定義された名前である.Thorでは処理実行を行うメソッド名がコマンド名となり,コマンド名1つが対応する.
55
-
56
- これに別名を与えるために利用されるキーワードがmapである.
57
- \begin{quote}\begin{verbatim}
58
- map A => B
59
- \end{verbatim}\end{quote}
60
- mapとはBと呼ばれるメソッドをAでも呼べるようにしてくれるものである.
61
- よって,これを使うことでコマンドの別名を指定することができる.
62
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
63
- desc 'show,--show', 'show sources'
64
- map "--show" => "show"
65
- def show
66
- printf("target_no:%i\n",@src[:target])
67
- printf("editor_command:%s\n",@src[:editor_command])
68
- ,,,以下略...
69
- end
70
- \end{lstlisting}
71
- 以上より,Thorではコマンドの指定と処理にはdesc,map,処理メソッドだけで済む.optparseではコマンドを登録するためのメソッドと処理メソッドの両方が必要になっていた.一方Thorでは,処理メソッドが直接コマンド名となるため記述が簡潔になる.
72
-
73
- \subsubsection{CLIの実行プロセス}
74
- \begin{figure}[htbp]\begin{center}
75
- \includegraphics[width=10cm,bb= 0 0 737 553]{../figs/./hikiutils_yamane.006.jpg}
76
- \caption{CLIの実行プロセス.}
77
- \label{default}\end{center}\end{figure}
78
- Thorにおけるcliの実行プロセスは次の通りである.
79
-
80
- \begin{enumerate}
81
- \item hiki\_thorのHikithor::CLI.start(ARGV)でhikiutils\_thor.rbのCLIクラスを呼ぶ
82
- \item hikiutils\_thor.rbのCLIクラスのメソッドを順に実行していく
83
- \end{enumerate}
84
- Thorではstart(ARGV)を呼び出すことでCLIを開始する.Hikithor::CLI.start(ARGV)を実行されることによりrequireで呼ばれているhikiutils\_thor.rbのCLIコマンドを順に実行する.そして,入力されたコマンドと一致するメソッドを探し,そのコマンドの処理が実行される.
85
- \begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
86
- #!/usr/bin/env ruby
87
-
88
- require "hikiutils_thor"
89
-
90
- Hikithor::CLI.start(ARGV)
91
- \end{lstlisting}\begin{lstlisting}[style=customRuby,basicstyle={\scriptsize\ttfamily}]
92
-
93
- module Hikithor
94
-
95
- DATA_FILE=File.join(ENV['HOME'],'.hikirc')
96
- attr_accessor :src, :target, :editor_command, :browser, :data_name, :l_dir
97
-
98
- class CLI < Thor
99
- def initialize(*args)
100
- super
101
- @data_name=['nick_name','local_dir','local_uri','global_dir','global_uri']
102
- data_path = File.join(ENV['HOME'], '.hikirc')
103
- DataFiles.prepare(data_path)
104
- ...以下略...
105
- \end{lstlisting}
106
- Thorではクラスのメソッドを順に実行していくためrunメソッドとexecuteメソッドは必要ない.また,optparseでの実行手順はメソッドの移動回数が多く複雑であるが,Thorは単純で分かりやすいものとなっている.
107
-
108
- \subsubsection{optparseとの全体的な比較}
109
- コードからもThorのほうが短くなっていることが分かる.よって,Thorとoptparseでのコードの違いは以上の部分になるが全体的にもThorのほうがコードが短くなり,コマンドの定義も簡単に行うことができる.また,実行手順も分かりやすくコードが読みやすいため書き換えもすぐ行うことができるので,より直感的なコマンドを実装することも可能となった.
110
-