hikiutils 0.2.3.8 → 0.2.3.9
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.
- checksums.yaml +4 -4
- data/hikiutils_bob/Rakefile +16 -4
- data/hikiutils_bob/figs/hikiutils_bob.002.bb +5 -0
- data/hikiutils_bob/hikiutils_bob/hikiutils_bob.002.bb +5 -0
- data/hikiutils_bob/latex_all.hiki +3 -3
- data/hikiutils_bob/latex_dir/hikiutils_bob.log +59 -24
- data/hikiutils_bob/latex_dir/hikiutils_bob.pdf +0 -0
- data/hikiutils_bob/latex_dir/hikiutils_bob.synctex.gz +0 -0
- data/hikiutils_bob/latex_dir/latex_all.tex +3 -3
- data/hikiutils_bob/latex_dir/sync.aux +1 -1
- data/hikiutils_bob/latex_dir/sync.tex +17 -13
- data/hikiutils_bob/sync.hiki +9 -6
- data/hikiutils_bob/toc.hiki +19 -15
- data/hikiutils_yamane/{results.hiki → command.hiki} +11 -13
- data/hikiutils_yamane/compare.hiki +13 -297
- data/hikiutils_yamane/figs/hikiutils_yamane.001.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.002.bb +5 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.002.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.003.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.004.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.005.jpg +0 -0
- data/hikiutils_yamane/hikiutils_yamane.hiki +8 -7
- data/hikiutils_yamane/introduction.hiki +9 -26
- data/hikiutils_yamane/latex_dir/command.aux +34 -0
- data/hikiutils_yamane/latex_dir/{results.tex → command.tex} +10 -22
- data/hikiutils_yamane/latex_dir/compare.aux +24 -0
- data/hikiutils_yamane/latex_dir/compare.tex +13 -333
- data/hikiutils_yamane/latex_dir/hikiutils_yamane.aux +8 -7
- data/hikiutils_yamane/latex_dir/hikiutils_yamane.log +126 -87
- data/hikiutils_yamane/latex_dir/hikiutils_yamane.pdf +0 -0
- data/hikiutils_yamane/latex_dir/hikiutils_yamane.synctex.gz +0 -0
- data/hikiutils_yamane/latex_dir/hikiutils_yamane.tex +6 -5
- data/hikiutils_yamane/latex_dir/hikiutils_yamane.toc +25 -21
- data/hikiutils_yamane/latex_dir/{purpose.aux → introduction.aux} +6 -4
- data/hikiutils_yamane/latex_dir/introduction.tex +7 -29
- data/hikiutils_yamane/latex_dir/optparse.aux +29 -0
- data/hikiutils_yamane/latex_dir/optparse.tex +116 -0
- data/hikiutils_yamane/latex_dir/thor.aux +32 -0
- data/hikiutils_yamane/latex_dir/thor.tex +112 -0
- data/hikiutils_yamane/optparse.hiki +113 -0
- data/hikiutils_yamane/thor.hiki +108 -0
- data/hikiutils_yamane/toc.hiki +15 -17
- data/lib/hikiutils/version.rb +1 -1
- data/lib/templates/Rakefile_hiki_sync +16 -4
- data/lib/templates/hiki_help.yml +2 -2
- metadata +61 -80
- data/hikiutils_yamane/clidescription.hiki +0 -35
- data/hikiutils_yamane/code.hiki +0 -285
- data/hikiutils_yamane/command_table.hiki +0 -19
- data/hikiutils_yamane/figs/hikiutils_yamane.001.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.002.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.003.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.004.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.005.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.006.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane.007.jpeg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.001.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.002.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.003.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.004.jpg +0 -0
- data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.005.jpg +0 -0
- data/hikiutils_yamane/hikiutils_yamane.key +0 -0
- data/hikiutils_yamane/latex_dir/clidescription.aux +0 -24
- data/hikiutils_yamane/latex_dir/clidescription.tex +0 -41
- data/hikiutils_yamane/latex_dir/code.aux +0 -41
- data/hikiutils_yamane/latex_dir/code.tex +0 -319
- data/hikiutils_yamane/latex_dir/command_table.tex +0 -29
- data/hikiutils_yamane/latex_dir/method.aux +0 -25
- data/hikiutils_yamane/latex_dir/method.tex +0 -14
- data/hikiutils_yamane/latex_dir/purpose.tex +0 -8
- data/hikiutils_yamane/latex_dir/results.aux +0 -28
- data/hikiutils_yamane/latex_dir/system.tex +0 -23
- data/hikiutils_yamane/method.hiki +0 -12
- data/hikiutils_yamane/mi +0 -0
- data/hikiutils_yamane/purpose.hiki +0 -7
- data/hikiutils_yamane/system.hiki +0 -18
- /data/hikiutils_yamane/figs/{hikiutils_yamane_09_copy.006.jpg → hikiutils_yamane.006.jpg} +0 -0
- /data/hikiutils_yamane/figs/{hikiutils_yamane_09_copy.007.jpg → hikiutils_yamane.007.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.001.jpg → hikiutils_yamane/hikiutils_yamane.001.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.002.jpg → hikiutils_yamane/hikiutils_yamane.002.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.003.jpg → hikiutils_yamane/hikiutils_yamane.003.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.004.jpg → hikiutils_yamane/hikiutils_yamane.004.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.005.jpg → hikiutils_yamane/hikiutils_yamane.005.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.006.jpg → hikiutils_yamane/hikiutils_yamane.006.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.007.jpg → hikiutils_yamane/hikiutils_yamane.007.jpg} +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_FamilyChineseOahu_EN_00317_2040x1360-small-12.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_FamilyChineseOahu_EN_02016_981x654-small-14.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_00317_2040x1360-96.jpeg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_02016_981x654-97.jpeg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_02390_2880x1921-94.jpeg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_02390_2880x1921-small-95.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt0@2x-102.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt10@2x-112.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt1@2x-103.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt2@2x-104.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt3@2x-105.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt4@2x-106.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt5@2x-107.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt6@2x-108.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt7@2x-109.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt8@2x-110.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt9@2x-111.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-100.tiff +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-98.tiff +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-small-101.png +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-small-99.png +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st0-113.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st1-114.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st2-115.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st3-116.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st4-117.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st5-118.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st6-119.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/tile_paper_medgray-93.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Index.zip +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Metadata/BuildVersionHistory.plist +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Metadata/DocumentIdentifier +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Metadata/Properties.plist +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/preview-micro.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/preview-web.jpg +0 -0
- /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/preview.jpg +0 -0
|
@@ -1,309 +1,25 @@
|
|
|
1
1
|
{{toc}}
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
また,thorで書かれたhikiutilsはoptparseで書かれたものよりもコードが短くなり,コマンドの解析も簡単に行えることができた.
|
|
5
|
-
ここではthorとoptparseのコードを比較しthorの良さを確認する.
|
|
6
|
-
!!!Thorとoptparseとは
|
|
7
|
-
!!!!Thorとは
|
|
8
|
-
Thorとは,コマンドラインツールの作成を支援するライブラリのことである.
|
|
9
|
-
gitやbundlerのようにサブコマンドを含むコマンドラインツールを簡単に作成することができる[4].
|
|
2
|
+
!optparseとthorの比較
|
|
3
|
+
ここでは,FizzBuzzという単純なコードを例にoptparseとCLIのコードの比較を行う.
|
|
10
4
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
#Thorを継承したクラスのパブリックメソッドがコマンドになる
|
|
14
|
-
#クラス.start(ARGV)でコマンドラインの処理をスタートする
|
|
15
|
-
という流れである[4].
|
|
16
|
-
|
|
17
|
-
startに渡す引数が空の場合,Thorはクラスのヘルプリストを出力する.
|
|
18
|
-
また,Thorはサブコマンドやサブサブコマンドも作ることができる.
|
|
19
|
-
!!!!optparseとは
|
|
20
|
-
optparseモジュールとは,getoptよりも簡便で,柔軟性に富み,かつ強力なコマンドライン解析ライブラリである.
|
|
21
|
-
optparseでは,より宣言的なスタイルのコマンドライン解析手法,すなわちOptionParserのインスタンスでコマンドラインを解析するという手法をとっている.
|
|
22
|
-
これを使うと,GNU/POSIX構文でオプションを指定できるだけでなく,使用法やヘルプメッセージの生成も行える[5].
|
|
23
|
-
|
|
24
|
-
利用頻度はあまり高くないが古くから開発され,使用例が広く紹介されている.
|
|
5
|
+
!!optparse
|
|
6
|
+
optparseとは,getoptよりも簡便で,柔軟性に富み,かつ強力なコマンドライン解析ライブラリである.optparseでは,より宣言的なスタイルのコマンドライン解析手法,すなわちOptionParserのインスタンスでコマンドラインを解析するという手法をとっている.これを使うと,GNU/POSIX構文でオプションを指定できるだけでなく,使用法やヘルプメッセージの生成も行える[1-3].利用頻度はあまり高くないが古くから開発され,使用例が広く紹介されている.
|
|
25
7
|
|
|
26
8
|
optparseの基本的な流れとしては
|
|
27
|
-
|
|
28
9
|
#OptionParserオブジェクトoptを生成する
|
|
29
10
|
#オプションを取り扱うブロックをopt.onに登録する
|
|
30
11
|
#opt.parse(ARGV)でコマンドラインを実際にparseする
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
OptionParserはコマンドラインのオプション取り扱うためのクラスであるためオブジェクトoptを生成されopt.onにコマンドを登録することができる.
|
|
34
|
-
しかし,OptionParser\#onにはコマンドが登録されているだけであるため,OptionParser\#parseが呼ばれた時,コマンドラインにオプションが指定されていれば実行される.
|
|
35
|
-
optparseにはデフォルトとして--helpと--versionオプションを認識する[6].
|
|
36
|
-
!!!コードの解説
|
|
37
|
-
!!!!Thorの定義
|
|
38
|
-
{{attach_view(hikiutils_yamane.003.jpg,hikiutils_yamane)}}
|
|
39
|
-
Thorのinitializeの定義のされ方
|
|
40
|
-
#Hikithor::CLI.start(ARGV)が呼ばれる
|
|
41
|
-
#initializeメソッドが呼ばれる
|
|
42
|
-
#これではThorのinitializeメソッドが呼ばれない
|
|
43
|
-
#superを書くことでThorのinitializeメソッドが呼ばれる
|
|
44
|
-
optparseではrequireでoptparseを呼ばれoptparseのinitializeを定義する必要はないが,Thorはinitializeを定義する必要がある.
|
|
45
|
-
Thorの定義方法はrequireでThorを呼びCLIクラスで継承し,initializeメソッドにsuperを書くことでThorのinitializeが呼ばれる.
|
|
46
|
-
initializeメソッド内ではThorの初期設定がされていないため,スーパークラスのメソッドを読み出してくれるsuperを書き加えることで図のようにinitializeメソッドでThorのinitilalizeメソッドが
|
|
47
|
-
呼ばれて定義される.
|
|
48
|
-
!!!!!実際のコード
|
|
49
|
-
<<< ruby
|
|
50
|
-
# -*- coding: utf-8 -*-
|
|
51
|
-
require 'thor'
|
|
52
|
-
require 'kconv'
|
|
53
|
-
require 'hikidoc'
|
|
54
|
-
require 'erb'
|
|
55
|
-
require "hikiutils/version"
|
|
56
|
-
require "hikiutils/tmarshal"
|
|
57
|
-
require "hikiutils/infodb"
|
|
58
|
-
require 'systemu'
|
|
59
|
-
require 'fileutils'
|
|
60
|
-
require 'yaml'
|
|
61
|
-
require 'pp'
|
|
62
|
-
|
|
63
|
-
module Hikithor
|
|
64
|
-
|
|
65
|
-
DATA_FILE=File.join(ENV['HOME'],'.hikirc')
|
|
66
|
-
attr_accessor :src, :target, :editor_command, :browser, :data_name, :l_dir
|
|
67
|
-
|
|
68
|
-
class CLI < Thor
|
|
69
|
-
def initialize(*args)
|
|
70
|
-
super
|
|
71
|
-
@data_name=['nick_name','local_dir','local_uri','global_dir','global_uri']
|
|
72
|
-
data_path = File.join(ENV['HOME'], '.hikirc')
|
|
73
|
-
DataFiles.prepare(data_path)
|
|
74
|
-
|
|
75
|
-
file = File.open(DATA_FILE,'r')
|
|
76
|
-
@src = YAML.load(file.read)
|
|
77
|
-
file.close
|
|
78
|
-
@target = @src[:target]
|
|
79
|
-
@l_dir=@src[:srcs][@target][:local_dir]
|
|
80
|
-
browser = @src[:browser]
|
|
81
|
-
@browser = (browser==nil) ? 'firefox' : browser
|
|
82
|
-
p editor_command = @src[:editor_command]
|
|
83
|
-
@editor_command = (editor_command==nil) ? 'open -a mi' : editor_command
|
|
84
|
-
end
|
|
85
|
-
>>>
|
|
86
|
-
!!!!hikiutilsの実行
|
|
87
|
-
*Thor
|
|
88
|
-
{{attach_view(hikiutils_yamane.004.jpg,hikiutils_yamane)}}
|
|
89
|
-
|
|
90
|
-
#hiki_thorのHikithor::CLI.start(ARGV)でhikiutils_thor.rbのCLIクラスを呼ぶ
|
|
91
|
-
|
|
92
|
-
#hikiutils_thor.rbのCLIクラスのメソッドを順に実行していく
|
|
93
|
-
|
|
94
|
-
*optparse
|
|
95
|
-
{{attach_view(hikiutils_yamane.001.jpg,hikiutils_yamane)}}
|
|
96
|
-
#HikiのHikiUtils::Command.run(ARGV)でhikiutils.rbのrunメソッドを呼ぶ
|
|
97
|
-
#new(argv).executeでexecuteメソッドが実行される
|
|
98
|
-
このようにoptparseでは実行を行うためのメソッドが必要であるが,Thorではクラスのメソッドを順に実行していくため
|
|
99
|
-
runメソッドとexecuteメソッドは必要ない.
|
|
100
|
-
!!!!!実際のコード
|
|
101
|
-
*Thor
|
|
102
|
-
<<< ruby
|
|
103
|
-
#!/usr/bin/env ruby
|
|
12
|
+
である.
|
|
104
13
|
|
|
105
|
-
|
|
14
|
+
OptionParserはコマンドラインのオプション取り扱うためのクラスであるためオブジェクトoptを生成されopt.onにコマンドを登録することができる.しかし,OptionParser\#onにはコマンドが登録されているだけであるため,OptionParser\#parseが呼ばれた時,コマンドラインにオプションが指定されていれば実行される.optparseにはデフォルトとして--helpと--versionオプションを認識する[1-4].
|
|
106
15
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<<< ruby
|
|
110
|
-
# -*- coding: utf-8 -*-
|
|
111
|
-
require 'thor'
|
|
112
|
-
require 'kconv'
|
|
113
|
-
require 'hikidoc'
|
|
114
|
-
require 'erb'
|
|
115
|
-
require "hikiutils/version"
|
|
116
|
-
require "hikiutils/tmarshal"
|
|
117
|
-
require "hikiutils/infodb"
|
|
118
|
-
require 'systemu'
|
|
119
|
-
require 'fileutils'
|
|
120
|
-
require 'yaml'
|
|
121
|
-
require 'pp'
|
|
16
|
+
!!Thor
|
|
17
|
+
Thorとは,コマンドラインツールの作成を支援するライブラリのことである.gitやbundlerのようにサブコマンドを含むコマンドラインツールを簡単に作成することができる[1-2].
|
|
122
18
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
class CLI < Thor
|
|
129
|
-
def initialize(*args)
|
|
130
|
-
super
|
|
131
|
-
@data_name=['nick_name','local_dir','local_uri','global_dir','global_uri']
|
|
132
|
-
data_path = File.join(ENV['HOME'], '.hikirc')
|
|
133
|
-
DataFiles.prepare(data_path)
|
|
134
|
-
|
|
135
|
-
file = File.open(DATA_FILE,'r')
|
|
136
|
-
@src = YAML.load(file.read)
|
|
137
|
-
file.close
|
|
138
|
-
@target = @src[:target]
|
|
139
|
-
@l_dir=@src[:srcs][@target][:local_dir]
|
|
140
|
-
browser = @src[:browser]
|
|
141
|
-
@browser = (browser==nil) ? 'firefox' : browser
|
|
142
|
-
|
|
143
|
-
>>>
|
|
144
|
-
*optparse
|
|
145
|
-
<<< ruby
|
|
146
|
-
#!/usr/bin/env ruby
|
|
147
|
-
|
|
148
|
-
require "hikiutils"
|
|
149
|
-
|
|
150
|
-
HikiUtils::Command.run(ARGV)
|
|
151
|
-
>>>
|
|
152
|
-
<<< ruby
|
|
153
|
-
def self.run(argv=[])
|
|
154
|
-
print "hikiutils: provide utilities for helping hiki editing.\n"
|
|
155
|
-
new(argv).execute
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def execute
|
|
159
|
-
@argv << '--help' if @argv.size==0
|
|
160
|
-
command_parser = OptionParser.new do |opt|
|
|
161
|
-
opt.on('-v', '--version','show program Version.') { |v|
|
|
162
|
-
opt.version = HikiUtils::VERSION
|
|
163
|
-
puts opt.ver
|
|
164
|
-
}
|
|
165
|
-
opt.on('-s', '--show','show sources') {show_sources}
|
|
166
|
-
opt.on('-a', '--add','add sources info') {add_sources }
|
|
167
|
-
opt.on('-t', '--target VAL','set target id') {|val| set_target(val) }
|
|
168
|
-
opt.on('-e', '--edit FILE','open file') {|file| edit_file(file) }
|
|
169
|
-
opt.on('-l', '--list [FILE]','list files') {|file| list_files(file) }
|
|
170
|
-
opt.on('-u', '--update FILE','update file') {|file| update_file(file) }
|
|
171
|
-
opt.on('-r', '--rsync','rsync files') {rsync_files}
|
|
172
|
-
opt.on('--database FILE','read database file') {|file| db_file(file)}
|
|
173
|
-
opt.on('--display FILE','display converted hikifile') {|file| display(f\
|
|
174
|
-
ile)}
|
|
175
|
-
opt.on('-c', '--checkdb','check database file') {check_db}
|
|
176
|
-
opt.on('--remove FILE','remove file') {|file| remove_file(file)}
|
|
177
|
-
opt.on('--move FILES','move file1,file2',Array) {|files| move_file(file\
|
|
178
|
-
s)}
|
|
179
|
-
opt.on('--euc FILE','translate file to euc') {|file| euc_file(file) }
|
|
180
|
-
opt.on('--initialize','initialize source directory') {dir_init() }
|
|
181
|
-
end
|
|
182
|
-
begin
|
|
183
|
-
command_parser.parse!(@argv)
|
|
184
|
-
rescue=> eval
|
|
185
|
-
p eval
|
|
186
|
-
end
|
|
187
|
-
dump_sources
|
|
188
|
-
exit
|
|
189
|
-
end
|
|
190
|
-
>>>
|
|
191
|
-
!!!!コマンドの表示と処理
|
|
192
|
-
*Thor
|
|
193
|
-
{{attach_view(hikiutils_yamane.002.jpg,hikiutils_yamane)}}
|
|
194
|
-
#コマンド名,コマンドの説明を一覧に表示させる
|
|
195
|
-
#パブリックメソッドのコマンドを別のコマンド名でも実行できるようにする
|
|
196
|
-
#コマンドの命令の実行コード
|
|
197
|
-
Thorではdescで一覧を表示させるコマンド名,コマンドの説明を登録する.しかし,ここで記述したコマンドは一覧で表示させるものであり,実行されることはないので実際のコマンドと対応させる必要がある.
|
|
198
|
-
Thorでは処理実行を行うメソッドがコマンドとなる.しかし,それではコマンド名は1つしか使うことができない.
|
|
199
|
-
ここで用いるものがmapである.mapを使うことで別のコマンドを指定することができる.
|
|
200
|
-
*optparse
|
|
201
|
-
{{attach_view(hikiutils_yamane.005.jpg,hikiutils_yamane)}}
|
|
202
|
-
#OptionParserオブジェクトoptを生成
|
|
203
|
-
#optにコマンドを登録
|
|
204
|
-
#入力されたコマンドの処理のメソッドへ移動
|
|
205
|
-
optparseではOptionParserオブジェクトoptの生成を行い,コマンドをoptに登録することでコマンドを作成することができる.しかし,これはコマンドを登録しているだけで
|
|
206
|
-
コマンドの一覧ではこれを表示することができるがコマンドの実行を行うためには実行を行うためのメソッドを作成する必要がある.optparseでのコマンドの実行はoptで登録された
|
|
207
|
-
コマンドが入力されることでそれぞれのコマンドの処理を行うメソッドに移動し処理を行う.しかし,このコマンド登録は-を付けたコマンドした登録ができなく,-なしのコマンド登録は
|
|
208
|
-
また別のやり方でやらなくてはいけない.
|
|
209
|
-
以上より,Thorではコマンドの指定と処理にはdesc,map,処理メソッドだけで済むが,optparseではコマンドを登録するためのメソッドと処理メソッドが必要になってくる.
|
|
210
|
-
また,コマンドはThorでは処理メソッドがコマンド名になるが,optparseではコマンドを登録するための処理も必要となってくる.
|
|
211
|
-
|
|
212
|
-
!!!!!実際のコード
|
|
213
|
-
*Thor
|
|
214
|
-
<<< ruby
|
|
215
|
-
desc 'show,--show', 'show sources'
|
|
216
|
-
map "--show" => "show"
|
|
217
|
-
def show
|
|
218
|
-
printf("target_no:%i\n",@src[:target])
|
|
219
|
-
printf("editor_command:%s\n",@src[:editor_command])
|
|
220
|
-
@i_size,@n_size,@l_size,@g_size=3,5,30,15 #i,g_size are fixed
|
|
221
|
-
n_l,l_l=0,0
|
|
222
|
-
@src[:srcs].each_with_index{|src,i|
|
|
223
|
-
n_l =(n_l= src[:nick_name].length)>@n_size? n_l:@n_size
|
|
224
|
-
l_l =(l_l= src[:local_dir].length)>@l_size? l_l:@l_size
|
|
225
|
-
}
|
|
226
|
-
@n_size,@l_size=n_l,l_l
|
|
227
|
-
command = Command.new
|
|
228
|
-
header = command.display_format('id','name','local directory','global uri',@i_size,@n_size,@l_size,@g_size)
|
|
229
|
-
|
|
230
|
-
puts header
|
|
231
|
-
puts '-' * header.size
|
|
232
|
-
|
|
233
|
-
@src[:srcs].each_with_index{|src,i|
|
|
234
|
-
target = i==@src[:target] ? '*':' '
|
|
235
|
-
id = target+i.to_s
|
|
236
|
-
name=src[:nick_name]
|
|
237
|
-
local=src[:local_dir]
|
|
238
|
-
global=src[:global_uri]
|
|
239
|
-
puts command.display_format(id,name,local,global,@i_size,@n_size,@l_size,@g_size)
|
|
240
|
-
}
|
|
241
|
-
end
|
|
242
|
-
>>>
|
|
243
|
-
*optparse
|
|
244
|
-
<<< ruby
|
|
245
|
-
def execute
|
|
246
|
-
@argv << '--help' if @argv.size==0
|
|
247
|
-
command_parser = OptionParser.new do |opt|
|
|
248
|
-
opt.on('-v', '--version','show program Version.') { |v|
|
|
249
|
-
opt.version = HikiUtils::VERSION
|
|
250
|
-
puts opt.ver
|
|
251
|
-
}
|
|
252
|
-
opt.on('-s', '--show','show sources') {show_sources}
|
|
253
|
-
opt.on('-a', '--add','add sources info') {add_sources }
|
|
254
|
-
opt.on('-t', '--target VAL','set target id') {|val| set_target(val)}
|
|
255
|
-
opt.on('-e', '--edit FILE','open file') {|file| edit_file(file) }
|
|
256
|
-
opt.on('-l', '--list [FILE]','list files') {|file| list_files(file)}
|
|
257
|
-
opt.on('-u', '--update FILE','update file') {|file| update_file(file) }
|
|
258
|
-
opt.on('-r', '--rsync','rsync files') {rsync_files}
|
|
259
|
-
opt.on('--database FILE','read database file') {|file| db_file(file)}
|
|
260
|
-
opt.on('--display FILE','display converted hikifile') {|file| display(file)}
|
|
261
|
-
opt.on('-c', '--checkdb','check database file') {check_db}
|
|
262
|
-
opt.on('--remove FILE','remove file') {|file| remove_file(file)}
|
|
263
|
-
opt.on('--move FILES','move file1,file2',Array) {|files| move_file(files)}
|
|
264
|
-
opt.on('--euc FILE','translate file to euc') {|file| euc_file(file)}
|
|
265
|
-
opt.on('--initialize','initialize source directory') {dir_init() }
|
|
266
|
-
end
|
|
267
|
-
begin
|
|
268
|
-
command_parser.parse!(@argv)
|
|
269
|
-
rescue=> eval
|
|
270
|
-
p eval
|
|
271
|
-
end
|
|
272
|
-
dump_sources
|
|
273
|
-
exit
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
def show_sources()
|
|
277
|
-
printf("target_no:%i\n",@src[:target])
|
|
278
|
-
printf("editor_command:%s\n",@src[:editor_command])
|
|
279
|
-
check_display_size()
|
|
280
|
-
header = display_format('id','name','local directory','global uri')
|
|
281
|
-
|
|
282
|
-
puts header
|
|
283
|
-
puts '-' * header.size
|
|
19
|
+
Thorの基本的な流れとしては
|
|
20
|
+
#Thorを継承したクラスのパブリックメソッドがコマンドになる
|
|
21
|
+
#クラス.start(ARGV)でコマンドラインの処理をスタートする
|
|
22
|
+
である[1-2].
|
|
284
23
|
|
|
285
|
-
|
|
286
|
-
target = i==@src[:target] ? '*':' '
|
|
287
|
-
id = target+i.to_s
|
|
288
|
-
name=src[:nick_name]
|
|
289
|
-
local=src[:local_dir]
|
|
290
|
-
global=src[:global_uri]
|
|
291
|
-
puts display_format(id,name,local,global)
|
|
292
|
-
}
|
|
293
|
-
end
|
|
24
|
+
startに渡す引数が空の場合,Thorはクラスのヘルプリストを出力する.また,Thorはサブコマンドやサブサブコマンドも容易に作ることができる.
|
|
294
25
|
|
|
295
|
-
def add_sources
|
|
296
|
-
cont = {}
|
|
297
|
-
@data_name.each{|name|
|
|
298
|
-
printf("%s ? ", name)
|
|
299
|
-
tmp = gets.chomp
|
|
300
|
-
cont[name.to_sym] = tmp
|
|
301
|
-
}
|
|
302
|
-
@src[:srcs] << cont
|
|
303
|
-
show_sources
|
|
304
|
-
end
|
|
305
|
-
>>>
|
|
306
|
-
コードからもThorのほうが短くなっていることが分かる.
|
|
307
|
-
よって,Thorとoptparseでのコードの違いは以上の部分になるが全体的にもThorのほうがコードが短くなり,
|
|
308
|
-
コマンドの定義も簡単に行うことができる.また,コマンドを簡単に定義できることで書き換えもすぐ行うことが
|
|
309
|
-
できるので,より直感的なコマンドに実装することも可能となった.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
!author:関西学院大学理工学部情報科学科 27013554 山根亮太
|
|
4
4
|
|
|
5
5
|
![[概要|hikiutils_yamane_abstract]]
|
|
6
|
-
![[序論|
|
|
7
|
-
|
|
6
|
+
![[序論|hikiutils_yamane_introduction]]
|
|
7
|
+
!方法
|
|
8
|
+
//他人の仕事,あるものを探す
|
|
9
|
+
!![[hikiutils_yamane_compare]]
|
|
10
|
+
!![[既存のhikiutilsのコマンド解説|hikiutils_yamane_optparse]]
|
|
8
11
|
!結果
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
!![[hikiutils_yamane_clidescription]]
|
|
13
|
-
!![[hikiutils_yamane_code]]
|
|
12
|
+
//自分の仕事,ないものをつくる
|
|
13
|
+
!![[コマンドの命名原則|hikiutils_yamane_command]]
|
|
14
|
+
!![[hikiutilsのthorのコード解説|hikiutils_yamane_thor]]
|
|
14
15
|
|
|
15
16
|
!参考文献
|
|
16
17
|
[1-1] hikidoc, https://rubygems.org/gems/hikidoc/versions/0.1.0, https://github.com/hiki/hikidoc,2017/1/30 アクセス.
|
|
@@ -1,27 +1,10 @@
|
|
|
1
1
|
!序論
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
hiki
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
hikiとはプログラミング言語Rubyを用いられることで作られたwikiクローンの1つである.
|
|
12
|
-
hikiの主な特徴として
|
|
13
|
-
*オリジナルwikiに似たシンプルな書式
|
|
14
|
-
*プラグインによる機能拡張
|
|
15
|
-
*出力するHTMLを柔軟に変更可能
|
|
16
|
-
*ページにカテゴリ付けできる
|
|
17
|
-
*CSSを使ったテーマ機能
|
|
18
|
-
*携帯端末可能
|
|
19
|
-
*InterWikiのサポート
|
|
20
|
-
*HikiFarmに対応
|
|
21
|
-
*ページの追加,編集がしやすい
|
|
22
|
-
等がある[1].
|
|
23
|
-
!!!hikiutils
|
|
24
|
-
hikiutils は hiki の編集作業を容易に行うことができるよう にするツール群であり,プログラミング言語 Ruby のライブ ラリである gem フォーマットに従って提供されている[2].
|
|
25
|
-
hikiutils は CLI(Command Line Interface) で操作するため, オプション解析をおこなう必要がある.
|
|
26
|
-
gem には,この用途 に適合したライブラリがいくつも提供されている[3].
|
|
27
|
-
この中 で,あまり利用頻度は高くないが古くから開発され,使用例 が広く紹介されている optparse を利用している.
|
|
2
|
+
hikiは,hiki記法を用いたwiki cloneです.wikiはウォード・カニンガムが作ったwikiwikiwebを源流とするhome page制作を容易にするシステムで,hikiもwikiの基本要求仕様を満足するシステムを提供しています.wikiの特徴であるweb上で編集する機能を提供しています.これを便宜上hiki web systemと呼びます.図にある通り,一般的な表示画面の他に,編集画面が提供されており,ユーザーはこの編集画面からコンテンツを編集することが可能です.リンクやヘッダー,リスト,引用,表,図の表示などの基本テキストフォーマットが用意されています.
|
|
3
|
+
|
|
4
|
+
hiki web systemの実際の基本動作は,hiki.cgiプログラムを介して行われています.こちらを便宜上hiki systemと呼びます.図に従ってhiki systemの動作概要を説明します.hiki systemは,data/textに置かれた書かれたプレーンテキストをhtmlへ変換します.この変換はhikidoc[1-1]というhikiフォーマットconverterを使っています.また,添付書類はcache/attachに,一度フォーマットしたhtmlはparserに置かれており,それらを参照してhtmlを表示する画面をhiki.cgiは作っています.さらにhiki systemでは検索機能,自動リンク作成などが提供されています
|
|
5
|
+
|
|
6
|
+
!!!caption:hiki web systemとhiki systemの対応関係.
|
|
7
|
+
{{attach_view(hikiutils_yamane_09_copy.001.jpg,hikiutils_yamane)}}
|
|
8
|
+
|
|
9
|
+
研究室内の内部文書,あるいは外部への宣伝資料,さらにwikipediaのように重要な研究成果の発信などに西谷研ではこのhiki systemを利用しています.初心者にも覚えやすい直感的な操作です.しかし,慣れてくるとテキスト編集や画面更新にいちいちweb画面へ移行せねばならず,編集の思考が停止します.そこで,テキスト編集に優れたeditorとの連携や,terminal上のshell commandと連携しやすいようにhikiutilsというcli(command line interface)を作成して運用しています.しかし,そのユーザインタフェースにはコマンドが直感的でないという問題点がある.そこで,Thorというコマンドラインツール作成ライブラリを用いる.hikiutilsでは,optparseというコマンドライン解析ライブラリを使用しているが,新たなライブラリThorを使用してコマンドを書き換え,より直感的なコマンドに変更する.
|
|
10
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
\relax
|
|
2
|
+
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}コマンドの命名原則}{14}}
|
|
3
|
+
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}hikiutilsの想定利用形態}{14}}
|
|
4
|
+
\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces hikiutilsがあらかじめ想定している利用形態.}}{14}}
|
|
5
|
+
\newlabel{default}{{4}{14}}
|
|
6
|
+
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}コメンド名と振る舞いの詳細}{16}}
|
|
7
|
+
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces }}{16}}
|
|
8
|
+
\newlabel{default}{{1}{16}}
|
|
9
|
+
\@writefile{toc}{\contentsline {paragraph}{open FILE}{16}}
|
|
10
|
+
\@writefile{toc}{\contentsline {paragraph}{ls [FILE]}{17}}
|
|
11
|
+
\@writefile{toc}{\contentsline {paragraph}{rsync}{17}}
|
|
12
|
+
\@writefile{toc}{\contentsline {paragraph}{touch FILE}{17}}
|
|
13
|
+
\@writefile{toc}{\contentsline {paragraph}{pwd}{17}}
|
|
14
|
+
\@writefile{toc}{\contentsline {paragraph}{cd VAL}{17}}
|
|
15
|
+
\@setckpt{command}{
|
|
16
|
+
\setcounter{page}{18}
|
|
17
|
+
\setcounter{equation}{0}
|
|
18
|
+
\setcounter{enumi}{2}
|
|
19
|
+
\setcounter{enumii}{0}
|
|
20
|
+
\setcounter{enumiii}{0}
|
|
21
|
+
\setcounter{enumiv}{0}
|
|
22
|
+
\setcounter{footnote}{0}
|
|
23
|
+
\setcounter{mpfootnote}{0}
|
|
24
|
+
\setcounter{part}{0}
|
|
25
|
+
\setcounter{section}{4}
|
|
26
|
+
\setcounter{subsection}{1}
|
|
27
|
+
\setcounter{subsubsection}{2}
|
|
28
|
+
\setcounter{paragraph}{0}
|
|
29
|
+
\setcounter{subparagraph}{0}
|
|
30
|
+
\setcounter{figure}{4}
|
|
31
|
+
\setcounter{table}{1}
|
|
32
|
+
\setcounter{lstnumber}{12}
|
|
33
|
+
\setcounter{lstlisting}{0}
|
|
34
|
+
}
|
|
@@ -9,12 +9,12 @@ pwd, ls, rm, touch, openなどはもっとも直感的に動作がわかるコ
|
|
|
9
9
|
hikiutilsの振る舞いを予測できるシェルコマンドと同じ名前でオプションを提供する
|
|
10
10
|
ようにします.
|
|
11
11
|
|
|
12
|
-
\
|
|
12
|
+
\subsubsection{hikiutilsの想定利用形態}
|
|
13
13
|
ここでhikiutilsがあらかじめ想定している利用形態を解説しておきます.
|
|
14
14
|
|
|
15
15
|
\begin{figure}[htbp]\begin{center}
|
|
16
16
|
\includegraphics[width=6cm,bb=0 0 442 432]{../figs/./hikiutils_yamane_09_copy.002.jpg}
|
|
17
|
-
\caption{hikiutils
|
|
17
|
+
\caption{hikiutilsがあらかじめ想定している利用形態.}
|
|
18
18
|
\label{default}\end{center}\end{figure}
|
|
19
19
|
hikiutilsは,
|
|
20
20
|
|
|
@@ -58,8 +58,8 @@ editor_command:open -a mi
|
|
|
58
58
|
\end{lstlisting}
|
|
59
59
|
とすると,それらの一覧と,いまtargetにしているnick\_nameディレクリが表示されます.
|
|
60
60
|
|
|
61
|
-
\
|
|
62
|
-
|
|
61
|
+
\subsubsection{コメンド名と振る舞いの詳細}
|
|
62
|
+
検討の結果コマンドを以下のように書き換えることとします.
|
|
63
63
|
上部に記した,特によく使うコマンドに関しては,shellでよく使われるコマンド名と一致するにようにしました.
|
|
64
64
|
|
|
65
65
|
\begin{table}[htbp]\begin{center}
|
|
@@ -91,44 +91,32 @@ version & &show program version \\
|
|
|
91
91
|
|
|
92
92
|
それぞれの意図を動作の解説として記述しています.
|
|
93
93
|
|
|
94
|
-
\
|
|
95
|
-
\item open FILE
|
|
96
|
-
\end{itemize}
|
|
94
|
+
\paragraph{open FILE}
|
|
97
95
|
ファイルを編集のためにeditorでopen.Editorは~/.hikircに
|
|
98
96
|
\begin{quote}\begin{verbatim}
|
|
99
97
|
:editor_command: open -a mi
|
|
100
98
|
\end{verbatim}\end{quote}
|
|
101
99
|
として保存されている.open -a miをemacsなどに適宜変更して使用.
|
|
102
100
|
|
|
103
|
-
\
|
|
104
|
-
\item ls [FILE]
|
|
105
|
-
\end{itemize}
|
|
101
|
+
\paragraph{ls [FILE]}
|
|
106
102
|
local\_dirにあるファイル名を[FILE*]として表示.例えば,hikiutils\_yamane以下の拡張子が
|
|
107
103
|
ついたファイルを表示.hikiシステムではtextディレクトリーは階層構造を取ることができない.
|
|
108
104
|
西谷研ではdirectoryの代わりにスネーク表記で階層構造を表している.
|
|
109
105
|
|
|
110
|
-
\
|
|
111
|
-
\item rsync
|
|
112
|
-
\end{itemize}
|
|
106
|
+
\paragraph{rsync}
|
|
113
107
|
local\_dirの内容をglobal\_dirにrsyncする.逆方向は同期に誤差が生じたり,permissionが
|
|
114
108
|
おかしくなるので,現在のところ一方向の同期のみとしている.したがって,作業手順としては
|
|
115
109
|
テキストの変更はlocal\_dirで読み行うようにしている.
|
|
116
110
|
|
|
117
|
-
\
|
|
118
|
-
\item touch FILE
|
|
119
|
-
\end{itemize}
|
|
111
|
+
\paragraph{touch FILE}
|
|
120
112
|
loccal\_dirで書き換えたFILEの内容をlocal\_uriに反映させ,ブラウザで表示.シェルコマンドの
|
|
121
113
|
touchによって,変更時間を現在に変え,最新状態とするのに似せてコマンド名をtouchとしている.
|
|
122
114
|
|
|
123
|
-
\
|
|
124
|
-
\item pwd
|
|
125
|
-
\end{itemize}
|
|
115
|
+
\paragraph{pwd}
|
|
126
116
|
nick\_nameの一覧とtargetを表示,current targetをcurrent dirとみなして,
|
|
127
117
|
コマンド名をpwdとした.
|
|
128
118
|
|
|
129
|
-
\
|
|
130
|
-
\item cd VAL
|
|
131
|
-
\end{itemize}
|
|
119
|
+
\paragraph{cd VAL}
|
|
132
120
|
targetを変える,change directoryとのメタファ.ただし,いまのところnick\_nameでは
|
|
133
121
|
対応しておらず,nick\_nameの番号をVAL入力することで変更する.
|
|
134
122
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
\relax
|
|
2
|
+
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}optparseとthorの比較}{7}}
|
|
3
|
+
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1}optparse}{7}}
|
|
4
|
+
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2}Thor}{7}}
|
|
5
|
+
\@setckpt{compare}{
|
|
6
|
+
\setcounter{page}{9}
|
|
7
|
+
\setcounter{equation}{0}
|
|
8
|
+
\setcounter{enumi}{2}
|
|
9
|
+
\setcounter{enumii}{0}
|
|
10
|
+
\setcounter{enumiii}{0}
|
|
11
|
+
\setcounter{enumiv}{0}
|
|
12
|
+
\setcounter{footnote}{0}
|
|
13
|
+
\setcounter{mpfootnote}{0}
|
|
14
|
+
\setcounter{part}{0}
|
|
15
|
+
\setcounter{section}{3}
|
|
16
|
+
\setcounter{subsection}{1}
|
|
17
|
+
\setcounter{subsubsection}{2}
|
|
18
|
+
\setcounter{paragraph}{0}
|
|
19
|
+
\setcounter{subparagraph}{0}
|
|
20
|
+
\setcounter{figure}{1}
|
|
21
|
+
\setcounter{table}{0}
|
|
22
|
+
\setcounter{lstnumber}{1}
|
|
23
|
+
\setcounter{lstlisting}{0}
|
|
24
|
+
}
|