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.
- checksums.yaml +4 -4
- data/.semi_lattice/icons/document.png +0 -0
- data/.semi_lattice/icons/folder.png +0 -0
- data/README.org +30 -33
- data/exe/hc +3 -0
- data/lib/.semi_lattice/icons/document.png +0 -0
- data/lib/.semi_lattice/icons/folder.png +0 -0
- data/lib/hc.rb +34 -0
- data/lib/mk_semi_lattice/.semi_lattice/icons/document.png +0 -0
- data/lib/mk_semi_lattice/.semi_lattice/icons/folder.png +0 -0
- data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.001.png +0 -0
- data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.002.png +0 -0
- data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.003.png +0 -0
- data/lib/mk_semi_lattice/docs/images/mk_semi_lattice.key +0 -0
- data/lib/mk_semi_lattice/docs/readme.html +143 -0
- data/lib/mk_semi_lattice/docs/readme.org +50 -0
- data/lib/mk_semi_lattice/option_manager.rb +9 -8
- data/lib/mk_semi_lattice/version.rb +1 -1
- data/lib/mk_semi_lattice.rb +8 -3
- data/lib/mk_stack/.semi_lattice/icons/document.png +0 -0
- data/lib/mk_stack/.semi_lattice/icons/folder.png +0 -0
- data/lib/mk_stack/.vscode/settings.json +4 -0
- data/lib/mk_stack/docs/mk_stack/mk_stack.001.png +0 -0
- data/lib/mk_stack/docs/mk_stack.key +0 -0
- data/lib/mk_stack/docs/readme.html +142 -0
- data/lib/mk_stack/docs/readme.org +55 -0
- data/lib/mk_stack/mk_stack.rb +126 -0
- data/lib/mk_stack/project.code-workspace +5 -0
- data/lib/split_pdf/docs/images/split_pdf.001.png +0 -0
- data/lib/split_pdf/docs/readme.html +153 -0
- data/lib/split_pdf/docs/readme.org +68 -0
- data/lib/split_pdf/docs/split_pdf.key +0 -0
- data/lib/split_pdf/split_pdf.rb +118 -0
- data/lib/voca_buil/check_log.yaml +37 -0
- data/lib/voca_buil/docs/readme.html +178 -0
- data/lib/voca_buil/docs/readme.org +58 -0
- data/lib/voca_buil/docs/voca_buil.key +0 -0
- data/lib/voca_buil/docs/voca_buil.pdf +0 -0
- data/lib/voca_buil/docs/voca_buil.png +0 -0
- data/lib/voca_buil/multi_check.rb +308 -0
- data/lib/voca_buil/word_log.yaml +14 -0
- 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">> cd multi_scale_25f
|
|
61
|
+
> cp etymological_builder_check_260105.tgz ~
|
|
62
|
+
> cd ~
|
|
63
|
+
> tar xvf etymological_builder_check_260105.tgz
|
|
64
|
+
> sudo gem install mk_semi_lattice
|
|
65
|
+
> 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
|
+
> 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
|
+
> 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
|
+
> cd r1_sta
|
|
140
|
+
> 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
|
+
> 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.
|
|
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:
|