mk_semi_lattice 0.3.1 → 0.4.1

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/.semi_lattice/icons/document.png +0 -0
  3. data/.semi_lattice/icons/folder.png +0 -0
  4. data/README.org +30 -33
  5. data/exe/hc +3 -0
  6. data/lib/.semi_lattice/icons/document.png +0 -0
  7. data/lib/.semi_lattice/icons/folder.png +0 -0
  8. data/lib/hc.rb +34 -0
  9. data/lib/mk_semi_lattice/.semi_lattice/icons/document.png +0 -0
  10. data/lib/mk_semi_lattice/.semi_lattice/icons/folder.png +0 -0
  11. data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.001.png +0 -0
  12. data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.002.png +0 -0
  13. data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.003.png +0 -0
  14. data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.key +0 -0
  15. data/lib/mk_semi_lattice/docs/readme.html +143 -0
  16. data/lib/mk_semi_lattice/docs/readme.org +50 -0
  17. data/lib/mk_semi_lattice/option_manager.rb +9 -8
  18. data/lib/mk_semi_lattice/version.rb +1 -1
  19. data/lib/mk_semi_lattice.rb +8 -3
  20. data/lib/mk_stack/.semi_lattice/icons/document.png +0 -0
  21. data/lib/mk_stack/.semi_lattice/icons/folder.png +0 -0
  22. data/lib/mk_stack/.vscode/settings.json +4 -0
  23. data/lib/mk_stack/docs/mk_stack/mk_stack.001.png +0 -0
  24. data/lib/mk_stack/docs/mk_stack.key +0 -0
  25. data/lib/mk_stack/docs/readme.html +142 -0
  26. data/lib/mk_stack/docs/readme.org +55 -0
  27. data/lib/mk_stack/mk_stack.rb +126 -0
  28. data/lib/mk_stack/project.code-workspace +5 -0
  29. data/lib/split_pdf/docs/images/split_pdf.001.png +0 -0
  30. data/lib/split_pdf/docs/readme.html +153 -0
  31. data/lib/split_pdf/docs/readme.org +68 -0
  32. data/lib/split_pdf/docs/split_pdf.key +0 -0
  33. data/lib/split_pdf/split_pdf.rb +118 -0
  34. data/lib/voca_buil/check_log.yaml +37 -0
  35. data/lib/voca_buil/docs/readme.html +178 -0
  36. data/lib/voca_buil/docs/readme.org +58 -0
  37. data/lib/voca_buil/docs/voca_buil.key +0 -0
  38. data/lib/voca_buil/docs/voca_buil.pdf +0 -0
  39. data/lib/voca_buil/docs/voca_buil.png +0 -0
  40. data/lib/voca_buil/multi_check.rb +308 -0
  41. data/lib/voca_buil/word_log.yaml +14 -0
  42. metadata +38 -1
@@ -0,0 +1,178 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="jp" xml:lang="jp">
5
+ <head>
6
+ <!-- 2026-01-06 Tue 09:13 -->
7
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
9
+ <title>hc checkの使い方</title>
10
+ <meta name="author" content="Shigeto R. Nishitani" />
11
+ <meta name="generator" content="Org Mode" />
12
+ <link rel="stylesheet" type="text/css" href="https://fniessen.github.io/org-html-themes/src/readtheorg_theme/css/htmlize.css"/>
13
+ <link rel="stylesheet" type="text/css" href="https://fniessen.github.io/org-html-themes/src/readtheorg_theme/css/readtheorg.css"/>
14
+ <link rel="stylesheet" type="text/css" href="https://fniessen.github.io/org-html-themes/src/readtheorg_theme/css/code-copy.css"/>
15
+ <link rel="stylesheet" type="text/css" href="src/readtheorg_theme/css/search.css"/>
16
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
17
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
18
+ <script type="text/javascript" src="https://fniessen.github.io/org-html-themes/src/lib/js/jquery.stickytableheaders.min.js"></script>
19
+ <script type="text/javascript" src="https://fniessen.github.io/org-html-themes/src/readtheorg_theme/js/search.js"></script>
20
+ <script type="text/javascript" src="https://fniessen.github.io/org-html-themes/src/readtheorg_theme/js/readtheorg.js"></script>
21
+ <script type="text/javascript" src="https://fniessen.github.io/org-html-themes/src/readtheorg_theme/js/code-copy.js"></script>
22
+ </head>
23
+ <body>
24
+ <div id="content" class="content">
25
+ <h1 class="title">hc checkの使い方</h1>
26
+ <div id="table-of-contents" role="doc-toc">
27
+ <h2>Table of Contents</h2>
28
+ <div id="text-table-of-contents" role="doc-toc">
29
+ <ul>
30
+ <li><a href="#org71f0c33">1. name</a></li>
31
+ <li><a href="#org11c94ae">2. install</a></li>
32
+ <li><a href="#orgcb7c84e">3. usage</a>
33
+ <ul>
34
+ <li><a href="#org6ca0d76">3.1. hc check</a></li>
35
+ <li><a href="#org4d4f6b7">3.2. tree構造</a></li>
36
+ <li><a href="#org3ecc1f6">3.3. iterative check(#1)</a></li>
37
+ <li><a href="#org1cfc4e3">3.4. single check(#2)</a></li>
38
+ </ul>
39
+ </li>
40
+ <li><a href="#org60e5b10">4. dir_tree.yaml編集</a></li>
41
+ <li><a href="#org083a576">5. references</a></li>
42
+ </ul>
43
+ </div>
44
+ </div>
45
+ <div id="outline-container-org71f0c33" class="outline-2">
46
+ <h2 id="org71f0c33"><span class="section-number-2">1.</span> name</h2>
47
+ <div class="outline-text-2" id="text-1">
48
+ <ul class="org-ul">
49
+ <li>hc checkは英単語のetymological(語源に基づく) buildingを行うclaです.</li>
50
+ <li>単語帳のcli版です.</li>
51
+ <li>dir_tree.yamlを編集しながら
52
+ 自分の記憶に残る英単語学習を目指しています.</li>
53
+ </ul>
54
+ </div>
55
+ </div>
56
+ <div id="outline-container-org11c94ae" class="outline-2">
57
+ <h2 id="org11c94ae"><span class="section-number-2">2.</span> install</h2>
58
+ <div class="outline-text-2" id="text-2">
59
+ <div class="org-src-container">
60
+ <pre class="src src-bash">&gt; cd multi_scale_25f
61
+ &gt; cp etymological_builder_check_260105.tgz ~
62
+ &gt; cd ~
63
+ &gt; tar xvf etymological_builder_check_260105.tgz
64
+ &gt; sudo gem install mk_semi_lattice
65
+ &gt; cd _stack_init_check_dirs
66
+ </pre>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ <div id="outline-container-orgcb7c84e" class="outline-2">
71
+ <h2 id="orgcb7c84e"><span class="section-number-2">3.</span> usage</h2>
72
+ <div class="outline-text-2" id="text-3">
73
+ <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
74
+
75
+
76
+ <colgroup>
77
+ <col class="org-left" />
78
+ </colgroup>
79
+ <tbody>
80
+ <tr>
81
+ <td class="org-left"><img src="./voca_buil.png" alt="voca_buil.png" /></td>
82
+ </tr>
83
+
84
+ <tr>
85
+ <td class="org-left">Fig.1 hc checkの動作の概略図.</td>
86
+ </tr>
87
+ </tbody>
88
+ </table>
89
+ </div>
90
+ <div id="outline-container-org6ca0d76" class="outline-3">
91
+ <h3 id="org6ca0d76"><span class="section-number-3">3.1.</span> hc check</h3>
92
+ <div class="outline-text-3" id="text-3-1">
93
+ <p>
94
+ mk_semi_latticeをgemでinstallすると,
95
+ hc(hyper cardの略)も同時にinstallされます.
96
+ </p>
97
+
98
+ <pre class="example">
99
+ &gt; hc check -h
100
+ </pre>
101
+
102
+
103
+ <p>
104
+ を使って単語の習得checkを行います.
105
+ </p>
106
+ </div>
107
+ </div>
108
+ <div id="outline-container-org4d4f6b7" class="outline-3">
109
+ <h3 id="org4d4f6b7"><span class="section-number-3">3.2.</span> tree構造</h3>
110
+ <div class="outline-text-3" id="text-3-2">
111
+ <p>
112
+ 展開された_stack_init_check_dirsはtreeで確認できます.
113
+ </p>
114
+ </div>
115
+ </div>
116
+ <div id="outline-container-org3ecc1f6" class="outline-3">
117
+ <h3 id="org3ecc1f6"><span class="section-number-3">3.3.</span> iterative check(#1)</h3>
118
+ <div class="outline-text-3" id="text-3-3">
119
+ <p>
120
+ pwd上で
121
+ </p>
122
+ <pre class="example">
123
+ &gt; hc check -i 5 -a 8 -q 5
124
+ </pre>
125
+
126
+ <p>
127
+ とすると iteration=5, answer=8, quiz=5で
128
+ 繰り返し(iterative) checkが走ります.
129
+ </p>
130
+ </div>
131
+ </div>
132
+ <div id="outline-container-org1cfc4e3" class="outline-3">
133
+ <h3 id="org1cfc4e3"><span class="section-number-3">3.4.</span> single check(#2)</h3>
134
+ <div class="outline-text-3" id="text-3-4">
135
+ <p>
136
+ 間違いの多かったdirに移動(cd)してチェックを
137
+ </p>
138
+ <pre class="example">
139
+ &gt; cd r1_sta
140
+ &gt; hc check
141
+ </pre>
142
+
143
+ <p>
144
+ 走らせると,r1_sta/dir_tree.yamlを参照して
145
+ 単一(single)のcheckが走ります.
146
+ </p>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ <div id="outline-container-org60e5b10" class="outline-2">
151
+ <h2 id="org60e5b10"><span class="section-number-2">4.</span> dir_tree.yaml編集</h2>
152
+ <div class="outline-text-2" id="text-4">
153
+ <pre class="example">
154
+ &gt; hc stack
155
+ </pre>
156
+
157
+ <p>
158
+ でバックアップをとって変えていくのがコツです.
159
+ <a href="../../mk_stack/docs/readme.html">stackの解説</a>を参照ください.
160
+ </p>
161
+ </div>
162
+ </div>
163
+ <div id="outline-container-org083a576" class="outline-2">
164
+ <h2 id="org083a576"><span class="section-number-2">5.</span> references</h2>
165
+ <div class="outline-text-2" id="text-5">
166
+ <p>
167
+ 「由来とつながりがわかる英単語語源マップ」, 臼井俊雄著, (ベレ出版, 2017).
168
+ </p>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ <div id="postamble" class="status">
173
+ <p class="author">Author: Shigeto R. Nishitani</p>
174
+ <p class="date">Created: 2026-01-06 Tue 09:13</p>
175
+ <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
176
+ </div>
177
+ </body>
178
+ </html>
@@ -0,0 +1,58 @@
1
+ #+OPTIONS: ^:{}
2
+ #+STARTUP: indent nolineimages overview num
3
+ #+TITLE: hc checkの使い方
4
+ #+AUTHOR: Shigeto R. Nishitani
5
+ #+EMAIL: (concat "shigeto_nishitani@mac.com")
6
+ #+LANGUAGE: jp
7
+ #+OPTIONS: H:4 toc:t num:2
8
+ #+SETUPFILE: https://fniessen.github.io/org-html-themes/org/theme-readtheorg.setup
9
+
10
+ * name
11
+ - hc checkは英単語のetymological(語源に基づく) buildingを行うclaです.
12
+ - 単語帳のcli版です.
13
+ - dir_tree.yamlを編集しながら
14
+ 自分の記憶に残る英単語学習を目指しています.
15
+
16
+ * install
17
+ #+begin_src bash
18
+ > cd multi_scale_25f
19
+ > cp etymological_builder_check_260105.tgz ~
20
+ > cd ~
21
+ > tar xvf etymological_builder_check_260105.tgz
22
+ > sudo gem install mk_semi_lattice
23
+ > cd _stack_init_check_dirs
24
+ #+end_src
25
+ * usage
26
+ | [[file:./voca_buil.png]]
27
+ | Fig.1 hc checkの動作の概略図.
28
+ ** hc check
29
+ mk_semi_latticeをgemでinstallすると,
30
+ hc(hyper cardの略)も同時にinstallされます.
31
+
32
+ : > hc check -h
33
+
34
+ を使って単語の習得checkを行います.
35
+
36
+ ** tree構造
37
+ 展開された_stack_init_check_dirsはtreeで確認できます.
38
+
39
+ ** iterative check(#1)
40
+ pwd上で
41
+ : > hc check -i 5 -a 8 -q 5
42
+ とすると iteration=5, answer=8, quiz=5で
43
+ 繰り返し(iterative) checkが走ります.
44
+
45
+ ** single check(#2)
46
+ 間違いの多かったdirに移動(cd)してチェックを
47
+ : > cd r1_sta
48
+ : > hc check
49
+ 走らせると,r1_sta/dir_tree.yamlを参照して
50
+ 単一(single)のcheckが走ります.
51
+
52
+ * dir_tree.yaml編集
53
+ : > hc stack
54
+ でバックアップをとって変えていくのがコツです.
55
+ [[../../mk_stack/docs/readme.org][stackの解説]]を参照ください.
56
+
57
+ * references
58
+ 「由来とつながりがわかる英単語語源マップ」, 臼井俊雄著, (ベレ出版, 2017).
Binary file
Binary file
Binary file
@@ -0,0 +1,308 @@
1
+ # !/usr/bin/env ruby
2
+ require 'thor'
3
+ require 'optparse'
4
+ require 'colorize'
5
+ require 'yaml'
6
+ require 'date'
7
+
8
+ module VocaBuil
9
+ class OptionParserWrapper
10
+ OPTIONS_DEFAULT = { file: 'dir_tree.yaml', w_num: 5, a_num: 5, iter: nil }
11
+
12
+ def self.parse(args = ARGV)
13
+ options = OPTIONS_DEFAULT.dup
14
+ opt = ::OptionParser.new
15
+ opt.banner = "Usage: hc check [options]"
16
+ opt.on('-f FILE', '--file FILE', 'YAML file to use') do |v|
17
+ options[:file] = v
18
+ end
19
+ opt.on('-a NUM', '--answer NUM', Integer, 'Number of answer choices(def 5)') do |v|
20
+ options[:a_num] = v
21
+ end
22
+ opt.on('-q NUM', '--quiz NUM', Integer, 'Number of quiz(def 5)') do |v|
23
+ options[:w_num] = v
24
+ end
25
+ opt.on('-i [NUM]', '--iterative [NUM]', Integer, 'Test iteratively (num=2)') do |v|
26
+ options[:iter] = v.nil? ? 2 : v
27
+ end
28
+ opt.parse!(args)
29
+ p options
30
+ options
31
+ end
32
+ end
33
+
34
+ class BaseCheck
35
+ CHECK_LOG_FILE = './check_log.yaml'
36
+ WORD_LOG_FILE = './word_log.yaml'
37
+ def initialize(options)
38
+ @options = options.dup
39
+ @check_log_file = self.class::CHECK_LOG_FILE
40
+ @word_log_file = self.class::WORD_LOG_FILE
41
+ end
42
+ def shuffle_words(words, w_num)
43
+ words.shuffle.first(w_num)
44
+ end
45
+
46
+ def make_answers(words_shuffled)
47
+ words_shuffled.each_with_index.map { |word, idx| [word[-1], idx] }
48
+ end
49
+
50
+ def shuffle_answers(answers, a_num)
51
+ answers.shuffle[0..a_num]
52
+ end
53
+
54
+ def print_answers(answers_shuffled)
55
+ answers_shuffled.each_with_index do |word, idx|
56
+ puts "#{idx}: #{word[0]}" #, #{word[-1]}"
57
+ end
58
+ end
59
+
60
+ # w_num個だけ問題を出すように修正
61
+ def get_user_inputs(words_shuffled, w_num)
62
+ user_inputs = []
63
+ words_shuffled.first(w_num).each_with_index do |ew, idx|
64
+ break if ew.nil?
65
+ question = "Q#{idx+1}: '#{ew[0]}' ? -> "
66
+ if ENV['SIMPLE_CHECK_TEST']
67
+ puts question
68
+ user_inputs << "0"
69
+ else
70
+ input = Thor::Shell::Basic.new.ask question
71
+ # 入力値を半角に変換
72
+ user_input = input ? input.chomp.unicode_normalize(:nfkc) : ""
73
+ user_inputs << user_input
74
+ end
75
+ end
76
+ user_inputs
77
+ end
78
+
79
+ # w_num個だけ解答をチェックするように修正
80
+ def check_results(words_shuffled, answers_shuffled, user_inputs, w_num)
81
+ results = {}
82
+ [w_num, words_shuffled.size].min.times do |i|
83
+ ans = words_shuffled[i]
84
+ next if ans.nil?
85
+ user_num = user_inputs[i].to_i
86
+ print "%-2s" % user_num
87
+ if user_num < answers_shuffled.size &&
88
+ ans == words_shuffled[answers_shuffled[user_num][-1]]
89
+ print "true: ".green
90
+ t_or_f = 't'
91
+ else
92
+ print "false: ".red
93
+ t_or_f = 'f'
94
+ end
95
+ p ans
96
+ results[ans[0]] = t_or_f
97
+ end
98
+ results
99
+ end
100
+
101
+ def update_logs(results)
102
+ check_log = File.exist?(@check_log_file) ?
103
+ YAML.load_file(@check_log_file, permitted_classes: [Date, Time]) :
104
+ []
105
+ learning_log = File.exist?(@word_log_file) ?
106
+ YAML.load(File.read(@word_log_file)) :
107
+ {}
108
+
109
+ check_log << Time.now
110
+ results.each do |word_key, result|
111
+ learning_log[word_key] = learning_log[word_key] ? learning_log[word_key] + result : result
112
+ end
113
+
114
+ File.write(@check_log_file, YAML.dump(check_log))
115
+ File.write(@word_log_file, YAML.dump(learning_log))
116
+ end
117
+
118
+ def select_least_correct_words(whole_words)
119
+ return unless File.exist?(@word_log_file)
120
+ word_log = YAML.load_file(@word_log_file)
121
+ # 対象words数が100未満ならその数、100以上なら100
122
+ limit = [whole_words.size, 100].min
123
+ least_words = word_log.sort_by { |k, v| v&.count('t') || 0 }.first(limit)
124
+ selected_words = []
125
+ least_words.each do |sel_word, _|
126
+ whole_words.each { |word| selected_words << word if word[0] == sel_word }
127
+ end
128
+ selected_words
129
+ end
130
+
131
+ def init_word_log(words)
132
+ word_log = {}
133
+ words.each { |word| word_log[word[0]] = nil }
134
+ word_log
135
+ end
136
+
137
+ def run
138
+ selector = WordsSelector.new(@word_log_file, @options)
139
+ words_shuffled = selector.select(@options[:w_num], @options[:a_num])
140
+ answers = make_answers(words_shuffled)
141
+ answers_shuffled = shuffle_answers(answers, @options[:a_num])
142
+ print_answers(answers_shuffled)
143
+ user_inputs = get_user_inputs(words_shuffled, @options[:w_num])
144
+ results = check_results(words_shuffled, answers_shuffled, user_inputs, @options[:w_num])
145
+ update_logs(results)
146
+ results
147
+ end
148
+
149
+ end
150
+
151
+ class WordsSelector
152
+ def initialize(word_log_file, options)
153
+ @word_log_file = word_log_file
154
+ @options = options
155
+ end
156
+
157
+ # w_num, a_numを受け取り、a_num+1個の単語を返す
158
+ def select(w_num, a_num)
159
+ word_list = read_words(@options[:file])
160
+ if File.exist?(@word_log_file)
161
+ learning_log = YAML.load_file(@word_log_file)
162
+ word_list.each do |word_entry|
163
+ learning_log[word_entry[0]] = nil unless learning_log.key?(word_entry[0])
164
+ end
165
+ learning_log.delete_if { |word_key, _| word_list.none? { |word_entry| word_entry[0] == word_key } }
166
+ File.write(@word_log_file, YAML.dump(learning_log))
167
+ else
168
+ learning_log = init_word_log(word_list)
169
+ File.write(@word_log_file, YAML.dump(learning_log))
170
+ end
171
+
172
+ selected_words = select_least_correct_words(word_list)
173
+ shuffle_words(selected_words, a_num)
174
+ end
175
+
176
+ private
177
+
178
+ def read_words(file)
179
+ if File.exist?(file)
180
+ # p ['file', file]
181
+ lines = File.readlines(file)
182
+ parse_word_lines(lines)
183
+ else
184
+ files = Dir.glob('./*/*_tree.yaml')
185
+ # p ['files', files]
186
+ if files.empty?
187
+ puts "No '*_tree.yaml' files found in subdirectories.".red
188
+ return []
189
+ end
190
+ words = []
191
+ files.each do |f|
192
+ lines = File.readlines(f)
193
+ words.concat(parse_word_lines(lines))
194
+ end
195
+ words
196
+ end
197
+ end
198
+
199
+ def parse_word_lines(lines)
200
+ words = []
201
+ lines[1..-1].each do |line|
202
+ next if line.strip == ''
203
+ line_strip = if line.strip[0] == ':'
204
+ line.strip[1..-2]
205
+ else
206
+ line.strip[0..-2]
207
+ end
208
+ tmp = line_strip.split("=")
209
+ words << tmp
210
+ end
211
+ words
212
+ end
213
+
214
+ def shuffle_words(words, w_num)
215
+ words.shuffle.first(w_num)
216
+ end
217
+
218
+ def select_least_correct_words(word_list)
219
+ learning_log = YAML.load_file(@word_log_file)
220
+ limit = [word_list.size/4, @options[:a_num]].max
221
+ least_learned = learning_log.sort_by { |word_key, log| log&.count('t') || 0 }.first(limit)
222
+ selected_words = []
223
+ least_learned.each do |word_key, _|
224
+ word_list.each { |word_entry| selected_words << word_entry if word_entry[0] == word_key }
225
+ end
226
+ selected_words
227
+ end
228
+
229
+ def init_word_log(word_list)
230
+ learning_log = {}
231
+ word_list.each { |word_entry| learning_log[word_entry[0]] = nil }
232
+ learning_log
233
+ end
234
+ end
235
+
236
+ class IterativeCheck
237
+ def initialize(options, iter = 2)
238
+ @options = options
239
+ @iter = iter
240
+ @score = 0
241
+ @wrong_answers = []
242
+ @dir_count = Hash.new(0)
243
+ end
244
+
245
+ def run
246
+ run_checks
247
+ print_score
248
+ print_wrong_answers
249
+ print_difficult_roots
250
+ end
251
+
252
+ private
253
+
254
+ def run_checks
255
+ @iter.times do |i|
256
+ puts "\nIterative check ##{i+1}/#{@iter}".blue
257
+ BaseCheck.new(@options).run.each do |w, val|
258
+ if val == 'f'
259
+ @wrong_answers << w
260
+ else
261
+ @score += 1
262
+ end
263
+ end
264
+ end
265
+ end
266
+
267
+ def print_score
268
+ puts "%2d/%2d" % [@score, (@iter * @options[:w_num])]
269
+ end
270
+
271
+ def print_wrong_answers
272
+ return if @wrong_answers.uniq.empty?
273
+ puts "Wrong answers:".red
274
+ @wrong_answers.uniq.each do |w|
275
+ print "#{w}: ".red
276
+ result = `grep -E "^\\s*#{w}=" */*_tree.yaml`
277
+ puts result
278
+ count_dirs(result)
279
+ end
280
+ end
281
+
282
+ def count_dirs(result)
283
+ result.each_line do |line|
284
+ if line =~ /^([^\/]+)\//
285
+ dir = $1
286
+ @dir_count[dir] += 1
287
+ end
288
+ end
289
+ end
290
+
291
+ def print_difficult_roots
292
+ return if @dir_count.empty?
293
+ puts "Difficult roots:".yellow
294
+ @dir_count.each do |dir, count|
295
+ puts "#{dir}: #{count}"
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ if __FILE__ == $0
302
+ options = VocaBuil::OptionParserWrapper.parse
303
+ if options[:iter]
304
+ VocaBuil::IterativeCheck.new(options, options[:iter]).run
305
+ else
306
+ VocaBuil::BaseCheck.new(options).run
307
+ end
308
+ end
@@ -0,0 +1,14 @@
1
+ ---
2
+ act,ag,ig,ge(Latin): ftttfft
3
+ act: fffftfffffffffffttt
4
+ actuate: ffffffffffffffffftttfffffff
5
+ acting: ffftfttft
6
+ exact: tffttfffft
7
+ examine: ffffffffftfffffftffffffffftfff
8
+ ambiguous: tftfffftft
9
+ agenda: fffftfttff
10
+ agile: fftffffftftf
11
+ purge: tfffftfft
12
+ agitate: ffffftftfffffft
13
+ navigate: ftftft
14
+ transact: fffffttfffffffft
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mk_semi_lattice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shigeto R. Nishitani
@@ -69,12 +69,15 @@ description: make semi lattice graph from directory structure
69
69
  email:
70
70
  - shigeto_nishitani@me.com
71
71
  executables:
72
+ - hc
72
73
  - mk_semi_lattice
73
74
  - mk_sl
74
75
  extensions: []
75
76
  extra_rdoc_files: []
76
77
  files:
77
78
  - ".DS_Store"
79
+ - ".semi_lattice/icons/document.png"
80
+ - ".semi_lattice/icons/folder.png"
78
81
  - ".stack/docs/knowledge_fixer.key"
79
82
  - ".stack/docs/mk_semi_lattice_distilled.key"
80
83
  - ".stack/history/20251020_1517_readme_formatted.md"
@@ -103,12 +106,24 @@ files:
103
106
  - app/assets/icons/document.png
104
107
  - app/assets/icons/folder.png
105
108
  - app/assets/icons/icon.jpg
109
+ - exe/hc
106
110
  - exe/mk_semi_lattice
107
111
  - exe/mk_sl
112
+ - lib/.semi_lattice/icons/document.png
113
+ - lib/.semi_lattice/icons/folder.png
114
+ - lib/hc.rb
108
115
  - lib/mk_semi_lattice.rb
109
116
  - lib/mk_semi_lattice/.semi_lattice/dir_node_edge.yaml
110
117
  - lib/mk_semi_lattice/.semi_lattice/dir_tree.yaml
118
+ - lib/mk_semi_lattice/.semi_lattice/icons/document.png
119
+ - lib/mk_semi_lattice/.semi_lattice/icons/folder.png
111
120
  - lib/mk_semi_lattice/.semi_lattice/semi_lattice.yaml
121
+ - lib/mk_semi_lattice/docs/images/mk_semi_lattice.001.png
122
+ - lib/mk_semi_lattice/docs/images/mk_semi_lattice.002.png
123
+ - lib/mk_semi_lattice/docs/images/mk_semi_lattice.003.png
124
+ - lib/mk_semi_lattice/docs/images/mk_semi_lattice.key
125
+ - lib/mk_semi_lattice/docs/readme.html
126
+ - lib/mk_semi_lattice/docs/readme.org
112
127
  - lib/mk_semi_lattice/init_env.rb
113
128
  - lib/mk_semi_lattice/manage_yaml/mk_node_edge_yaml.rb
114
129
  - lib/mk_semi_lattice/manage_yaml/mk_semi_lattice_yaml.rb
@@ -116,6 +131,28 @@ files:
116
131
  - lib/mk_semi_lattice/ruby2d_action.rb
117
132
  - lib/mk_semi_lattice/sl_components.rb
118
133
  - lib/mk_semi_lattice/version.rb
134
+ - lib/mk_stack/.semi_lattice/icons/document.png
135
+ - lib/mk_stack/.semi_lattice/icons/folder.png
136
+ - lib/mk_stack/.vscode/settings.json
137
+ - lib/mk_stack/docs/mk_stack.key
138
+ - lib/mk_stack/docs/mk_stack/mk_stack.001.png
139
+ - lib/mk_stack/docs/readme.html
140
+ - lib/mk_stack/docs/readme.org
141
+ - lib/mk_stack/mk_stack.rb
142
+ - lib/mk_stack/project.code-workspace
143
+ - lib/split_pdf/docs/images/split_pdf.001.png
144
+ - lib/split_pdf/docs/readme.html
145
+ - lib/split_pdf/docs/readme.org
146
+ - lib/split_pdf/docs/split_pdf.key
147
+ - lib/split_pdf/split_pdf.rb
148
+ - lib/voca_buil/check_log.yaml
149
+ - lib/voca_buil/docs/readme.html
150
+ - lib/voca_buil/docs/readme.org
151
+ - lib/voca_buil/docs/voca_buil.key
152
+ - lib/voca_buil/docs/voca_buil.pdf
153
+ - lib/voca_buil/docs/voca_buil.png
154
+ - lib/voca_buil/multi_check.rb
155
+ - lib/voca_buil/word_log.yaml
119
156
  - sig/mk_semi_lattice.rbs
120
157
  homepage: https://github.com/daddygongon/mk_semi_lattice
121
158
  licenses: