shunkuntype 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -2
- data/Gemfile +1 -0
- data/Rakefile +18 -5
- data/docs/Shunkuntype.hiki +23 -0
- data/docs/Shunkuntype_Coding.hiki +198 -0
- data/docs/Shunkuntype_Coding_PlotData.hiki +31 -0
- data/docs/Shunkuntype_Coding_gnuplot.hiki +58 -0
- data/docs/Shunkuntype_GroupHearing_20160128.pdf +0 -0
- data/docs/Shunkuntype_gemizing.hiki +389 -0
- data/docs/{README.ja.md → Shunkuntype_manual.hiki} +49 -34
- data/docs/Shunkuntype_report.hiki +191 -0
- data/docs/TouchTypespeedResult.png +0 -0
- data/docs/TouchTypetrainingResult.png +0 -0
- data/docs/TouchTypewhole_workResult.png +0 -0
- data/docs/donkey_and_fujimoto.png +0 -0
- data/docs/{readme.en.hiki → readme_en.hiki} +0 -0
- data/docs/{readme.ja.hiki → readme_ja.hiki} +0 -0
- data/docs/res.png +0 -0
- data/docs/shunkun_report.pdf +0 -0
- data/docs/speed.png +0 -0
- data/docs/work.png +0 -0
- data/lib/shunkuntype.rb +37 -23
- data/lib/shunkuntype/#version.rb# +12 -0
- data/lib/shunkuntype/plot_data.rb +3 -1
- data/lib/shunkuntype/version.rb +1 -1
- data/shunkuntype.gemspec +1 -1
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa980481aa57d8bae72450249ad33e6fe82b62ba
|
4
|
+
data.tar.gz: 03142adad7500cec3252942be94bc084efc7120e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de1e1914b42d69b735da36af6e0fa6e55322483aa15717c1d5d15ca4bbe7173e7eb1d2e18adfdf325372b64c524a940e0766294ee7f48244e3aad8421379e914
|
7
|
+
data.tar.gz: 3369e8e93244e3780ce67ac56d3deb375bcb28bcb46f6eb68fb10a1959d81790a87b37c420f1d720debb1aff0531507c1b958b17ef8f451d9c2dca79421d9a80
|
data/.yardopts
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -2,6 +2,8 @@ require "bundler/gem_tasks"
|
|
2
2
|
require "rake/testtask"
|
3
3
|
require 'yard'
|
4
4
|
require "rspec/core/rake_task"
|
5
|
+
p base_path = File.expand_path('..', __FILE__)
|
6
|
+
p basename = File.basename(base_path)
|
5
7
|
|
6
8
|
RSpec::Core::RakeTask.new(:spec)
|
7
9
|
|
@@ -11,12 +13,23 @@ end
|
|
11
13
|
|
12
14
|
desc "make documents by yard"
|
13
15
|
task :yard do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
files = Dir.entries('docs')
|
17
|
+
files.each{|file|
|
18
|
+
name=file.split('.')
|
19
|
+
if name[1]=='hiki' then
|
20
|
+
p command="hiki2md docs/#{name[0]}.hiki > shunkuntype.wiki/#{name[0]}.md"
|
21
|
+
system command
|
22
|
+
end
|
23
|
+
}
|
24
|
+
p command="cp shunkuntype.wiki/readme_en.md ./README.md"
|
25
|
+
p command="cp shunkuntype.wiki/readme_ja.md shunkuntype.wiki/Home.md"
|
19
26
|
system command
|
27
|
+
system "cp docs/*.gif #{basename}.wiki/img"
|
28
|
+
system "cp docs/*.gif doc"
|
29
|
+
system "cp docs/*.png #{basename}.wiki/img"
|
30
|
+
system "cp docs/*.png doc"
|
31
|
+
system "cp docs/*.pdf #{basename}.wiki"
|
32
|
+
system "cp docs/*.pdf doc"
|
20
33
|
YARD::Rake::YardocTask.new
|
21
34
|
end
|
22
35
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
!TouchTypingに関連するサイト
|
2
|
+
2015年度にshunkuntypeというtouch type習得ソフトを開発.
|
3
|
+
|
4
|
+
!!使用法
|
5
|
+
|
6
|
+
*[[マニュアル|Shunkuntype_manual]]
|
7
|
+
*[[TouchTypingのコツ|http://www.plato-web.com/software/km06/lesson.html]]
|
8
|
+
|
9
|
+
!!学習者向け報告書
|
10
|
+
|
11
|
+
*[[レポート|Shunkuntype_report]]
|
12
|
+
*[[shunkuntype報告書pdf版|shunkun_report.pdf]]
|
13
|
+
|
14
|
+
!!開発メモ
|
15
|
+
|
16
|
+
*[[gem化メモ|Shunkuntype_gemizing]]
|
17
|
+
*[[yard文書|http://nishitani0.kwansei.ac.jp/~bob/nishitani0/rdocs/shunkuntype/]]
|
18
|
+
*関連情報
|
19
|
+
**[[PlotData|Shunkuntype_Coding_PlotData]]
|
20
|
+
**[[gnuplot|Shunkuntype_Coding_gnuplot]]
|
21
|
+
*開発_通信(2016-02-18 08:10:56 +0900 by Bob)
|
22
|
+
**sshでuser@host_uri設定をinitで
|
23
|
+
**hikiに自動的に煽り場をつくるplugin
|
@@ -0,0 +1,198 @@
|
|
1
|
+
!Shunkuntypeのコード開発
|
2
|
+
!!【plotライブラリの導入】
|
3
|
+
webのためのデータ加工において次のような変更を行った.
|
4
|
+
* gnuplotライブラリの導入
|
5
|
+
* PlotDataクラスの生成
|
6
|
+
これにより,
|
7
|
+
* 動作の目的別によるファイルの分離
|
8
|
+
* 中間ファイルの省略
|
9
|
+
などが達成され,記述の簡略化が相当進んだ.詳しくは[[gnuplot|Shunkuntype_Coding_gnuplot]],
|
10
|
+
[[PlotData|Shunkuntype_Coding_PlotData]]を参照.
|
11
|
+
|
12
|
+
!!【開発途中での使用の問題点】
|
13
|
+
ユーザーの使用,特に情報の収集をしながら,コードの開発を行った.そのため以下のような不便さが出てきた.
|
14
|
+
|
15
|
+
# どのversionを使用しているかで挙動が少しずつ変わる
|
16
|
+
# どれが最新版かわからない
|
17
|
+
# 最新版の更新をtgzでおこなった
|
18
|
+
# 個人データを残すためcpで必要な書類を上書きする必要がある.
|
19
|
+
|
20
|
+
このあたりこそChefの出番なのに,donkeyに不幸な事故が起こって...
|
21
|
+
|
22
|
+
!!【code記述の基本原則】
|
23
|
+
動作はすべてrakeで指示するようにしている.これにより,
|
24
|
+
* 操作法の一括化,標準化
|
25
|
+
* ruby codeの分離
|
26
|
+
** 環境に依存しやすいところはRakefile.rbで
|
27
|
+
** 変わらないところを*.rbに
|
28
|
+
という基本原則にのっとっている.
|
29
|
+
|
30
|
+
しかし,個別の*.rbはsystem callから呼び出している.この代案としては,
|
31
|
+
* requireして直接procを呼び出す
|
32
|
+
* class化して隠蔽する
|
33
|
+
が考えられる.class化による隠蔽によって細かいところを気にしなくても良くなる.しかし,隠蔽によってどのようにcodeが挙動するかがわからなくなり,codeをいじることが難しくなる.
|
34
|
+
|
35
|
+
このcode整理はrubyの基本から逸脱している.これは,「見える化」によりどこに何があるかを明示する整理法に由来している.今後はこの基本原則をCoC化する方策を考える必要がある.
|
36
|
+
|
37
|
+
!!!2016/02/14追記
|
38
|
+
このあたりのCoCがgemであることを実感.詳しくは[[gemizing|Shunkuntype_gemizing]]を参照.
|
39
|
+
|
40
|
+
!!【directory構造と動作の概要】
|
41
|
+
!!!ユーザ環境
|
42
|
+
ユーザ環境のdirectory構造は以下の通りである.
|
43
|
+
<<< tcsh
|
44
|
+
ShunkunType
|
45
|
+
├── GerardStrong_data
|
46
|
+
│ ├── STEP-01-home.txt
|
47
|
+
│ ├── ・・・
|
48
|
+
│ └── contents.txt
|
49
|
+
├── Rakefile.rb
|
50
|
+
├── data
|
51
|
+
│ ├── STEP-1.txt
|
52
|
+
│ ├── ・・・
|
53
|
+
│ └── word.list
|
54
|
+
├── finished_check.rb
|
55
|
+
├── speed.rb
|
56
|
+
├── speed_data.txt
|
57
|
+
├── training.rb
|
58
|
+
└── viewer.rb
|
59
|
+
>>>
|
60
|
+
Rakefile.rbに以下の動作が用意されており,各fileを起動するようにしている.
|
61
|
+
<<< tcsh
|
62
|
+
rake size # start size training: Gerard Strong data
|
63
|
+
rake speed # speed check
|
64
|
+
rake submit # submit data to dmz0
|
65
|
+
rake time # start time training: one minite drills
|
66
|
+
rake view # view training history: display the finished step table and the graphs
|
67
|
+
>>>
|
68
|
+
動作の詳細は[[ユーザマニュアル|Shunkuntype_manual]]にある.
|
69
|
+
!!!Web集計環境
|
70
|
+
Web集計環境のdirectory構造は以下の通りである.
|
71
|
+
<<< tcsh
|
72
|
+
Web/
|
73
|
+
.
|
74
|
+
├── Rakefile.rb
|
75
|
+
├── ShunkunTyper2015
|
76
|
+
├── mem_data
|
77
|
+
│ ├── bob_speed_data.txt
|
78
|
+
│ ├── bob_training_data.txt
|
79
|
+
...
|
80
|
+
├── mk_shunkunTyper.rb
|
81
|
+
├── old_rbs
|
82
|
+
│ ├── #Rakefile2.rb#
|
83
|
+
...
|
84
|
+
├── plot_data.rb
|
85
|
+
└── res.png
|
86
|
+
>>>
|
87
|
+
Rakefile.rbに動作がすべて用意されている.
|
88
|
+
<<< tcsh
|
89
|
+
rake edit # edit related hiki webs
|
90
|
+
rake speed_all # make speed graphs for all members
|
91
|
+
rake speed_view # make speed graphs for a specific member
|
92
|
+
rake table # make web table
|
93
|
+
rake work_all # view whole working time including speed_test for all members
|
94
|
+
rake work_view # view whole working time including speed_test for a specific member
|
95
|
+
>>>
|
96
|
+
|
97
|
+
!!! table
|
98
|
+
tableによってmk_shunkunTyper.rbが起動され,
|
99
|
+
|
100
|
+
* 個人のトレーニング履歴データをmem_dataにダウンロード
|
101
|
+
* hiki形式でtableを作成,
|
102
|
+
* ShunkunTyper2015に追加
|
103
|
+
|
104
|
+
する.
|
105
|
+
|
106
|
+
!!!speed, work, view, all
|
107
|
+
speedおよびtrainingのデータをグラフ化する.rakeコマンドとして,
|
108
|
+
rake work_all
|
109
|
+
とした場合には,speedおよびtrainingデータの作業時間を総計する.viewだけの場合は特定の被験者に対するグラフを作成.例えば,
|
110
|
+
rake speed_view donkey
|
111
|
+
とした場合には,donkeyに関するspeedダータを表示.
|
112
|
+
|
113
|
+
典型的なRakefile.rbでのデータ処理は以下の通り.
|
114
|
+
|
115
|
+
<<< ruby
|
116
|
+
desc "view whole working time including speed_test."
|
117
|
+
task :work_all => [:mk_mem_names] do
|
118
|
+
all_data= $mem_names.inject([]){|all,name| all << work_view(name) }
|
119
|
+
text="Work minutes [min]"
|
120
|
+
plot(all_data,text)
|
121
|
+
plot(all_data,textopts={:png=>true})
|
122
|
+
exit
|
123
|
+
end
|
124
|
+
|
125
|
+
def work_view(name)
|
126
|
+
p name0 = "#{$source_dir}/#{name}_training_data.txt"
|
127
|
+
p name1 = "#{$source_dir}/#{name}_speed_data.txt"
|
128
|
+
data0 = PlotData.new(name0,0,3,name)
|
129
|
+
data0.add_general_data(name1, 0, 2)
|
130
|
+
# start=Time.parse(data0.data[0][0])
|
131
|
+
start=Time.parse(Time.now.to_s)
|
132
|
+
x_func = proc{|x| ((Time.parse(x)-start)/3600/24) }
|
133
|
+
y_func = proc{|x| x.to_f/60.0 }
|
134
|
+
data0.mk_plot_data(x_func,y_func)
|
135
|
+
data0.sort
|
136
|
+
data0.sum_data
|
137
|
+
return data0
|
138
|
+
end
|
139
|
+
>>>
|
140
|
+
|
141
|
+
* all_dataにwork_viewを追加していく.
|
142
|
+
** work_viewでは
|
143
|
+
** file名を生成
|
144
|
+
** data0をname0から作成し,name1からデータを追加.
|
145
|
+
** x_func, y_funcでデータを修正
|
146
|
+
** x軸をsort
|
147
|
+
** y軸は積分値に変換
|
148
|
+
* plotにall_dataを渡す.
|
149
|
+
|
150
|
+
!!!edit
|
151
|
+
関連するhikiページの編集環境をopen.
|
152
|
+
|
153
|
+
!【dataの収集方法】
|
154
|
+
練習記録データをどのように収集するかが最初の課題であった.一般的には,
|
155
|
+
|
156
|
+
* 提出用のwebを設けてそこへ提出
|
157
|
+
|
158
|
+
という方法が正当であろう.そのためのサイト構築には,
|
159
|
+
|
160
|
+
* hiki
|
161
|
+
* rails
|
162
|
+
*cgi
|
163
|
+
|
164
|
+
が考えられる.しかし,userが
|
165
|
+
|
166
|
+
*いちいちあげる手数が面倒
|
167
|
+
|
168
|
+
と思ってしまうと情報収集がスムースに進行しない.data収集後の操作は,
|
169
|
+
|
170
|
+
*table作成
|
171
|
+
*graph作成
|
172
|
+
*webでの表示
|
173
|
+
|
174
|
+
であるが,これらを自動化するために,hikiのpluginで実装するのも少し手間がかかる.
|
175
|
+
|
176
|
+
そこでuser自身がscpによりwebの特定directoryにsubmitするという方法をとることにした.理由は以下の通り.
|
177
|
+
|
178
|
+
* terminalでのtype練習をしているので,CGIでの操作が自然.
|
179
|
+
* sshのアカウントを被験者全員が保有している
|
180
|
+
* scp先のdirectoryのpermissionをworld writableにしてもだれがuploadするかの管理はできている.
|
181
|
+
* scpで手元でdataを取れた方がgraphやtableの改良が容易.
|
182
|
+
|
183
|
+
もちろんrubyによる自動化は用意されていて,
|
184
|
+
|
185
|
+
<<< tcsh
|
186
|
+
rake submit
|
187
|
+
>>>
|
188
|
+
|
189
|
+
とuserは打ち込むだけにしている.
|
190
|
+
|
191
|
+
<<< ruby
|
192
|
+
desc "submit data to dmz0."
|
193
|
+
task :submit do
|
194
|
+
dir ='/Users/bob/Sites/nishitani0/ShunkunTyper/mem_data'
|
195
|
+
system "scp ./training_data.txt #{true_name}@dmz0:#{dir}/#{true_name}_training_data.txt"
|
196
|
+
system "scp ./speed_data.txt #{true_name}@dmz0:#{dir}/#{true_name}_speed_data.txt"
|
197
|
+
end
|
198
|
+
>>>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
{{toc}}
|
2
|
+
!【name】
|
3
|
+
PlotData
|
4
|
+
!【概要】
|
5
|
+
数値データをrubyのgemとして用意されている[[gnuplot|TouchTyping_Coding_gnuplot]]で利用しやすいフォーマットに成型するクラス.
|
6
|
+
!【使用例】
|
7
|
+
<<< ruby
|
8
|
+
data0 = PlotData.new()
|
9
|
+
data0.read_general_data(ARGV[0], 0, 3)
|
10
|
+
data0.add_general_data(ARGV[1], 0, 2)
|
11
|
+
|
12
|
+
start=Time.parse(data0.data[0][0])
|
13
|
+
x_func = proc{|x| ((Time.parse(x)-start)/3600/24) }
|
14
|
+
y_func = proc{|x| x.to_f/60.0 }
|
15
|
+
data0.mk_plot_data(x_func,y_func)
|
16
|
+
data0.sort
|
17
|
+
data0.sum_data
|
18
|
+
>>>
|
19
|
+
としている.
|
20
|
+
!【proc】
|
21
|
+
!!initialize(file_name="",x_col=nil,y_col=nil,title="")
|
22
|
+
!!add_general_data(file, x_col, y_col)
|
23
|
+
!!read_general_data(file, x_col, y_col)
|
24
|
+
!!to_gnuplot()
|
25
|
+
[[gnuplot|TouchTyping_Coding_gnuplot]] libraryに沿った形でのdataを出力.
|
26
|
+
!!mk_plot_data(x_func,y_func)
|
27
|
+
x_func, y_funcに従って,x_col, y_colの値を変換する.
|
28
|
+
!!sum_data
|
29
|
+
y軸の値の積分を取る.
|
30
|
+
!!sort
|
31
|
+
x軸の値によってsortをかける.
|
@@ -0,0 +1,58 @@
|
|
1
|
+
{{toc}}
|
2
|
+
!【名前】
|
3
|
+
gnuplot
|
4
|
+
!【概要】
|
5
|
+
gnuplotを操作するためのrubyライブラリ
|
6
|
+
!【install】
|
7
|
+
gem install gnuplot
|
8
|
+
!【使用法】
|
9
|
+
!!一つのグラフ
|
10
|
+
<<< ruby
|
11
|
+
Gnuplot.open do |gp|
|
12
|
+
Gnuplot::Plot.new( gp ) do |plot|
|
13
|
+
plot.title "Elapsed time vs #{text}"
|
14
|
+
plot.ylabel text
|
15
|
+
plot.xlabel "Elapsed time[days]"
|
16
|
+
plot.xtics "0 2"
|
17
|
+
x,y = data0.to_gnuplot
|
18
|
+
|
19
|
+
plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
|
20
|
+
ds.with = "line"
|
21
|
+
ds.notitle
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
>>>
|
26
|
+
|
27
|
+
!!複数のグラフの同時プロット
|
28
|
+
<<< ruby
|
29
|
+
Gnuplot.open do |gp|
|
30
|
+
Gnuplot::Plot.new( gp ) do |plot|
|
31
|
+
plot.title "Elapsed time vs #{text0}"
|
32
|
+
plot.ylabel text0
|
33
|
+
plot.xlabel "Elapsed time[days]"
|
34
|
+
plot.xtics "0 7"
|
35
|
+
if true==opts.has_key?(:png) then
|
36
|
+
plot.term "pngcairo enhanced size 480,360"
|
37
|
+
plot.output "res.png"
|
38
|
+
end
|
39
|
+
|
40
|
+
plot.data = []
|
41
|
+
data.each{|ele|
|
42
|
+
plot.data << Gnuplot::DataSet.new( ele.to_gnuplot ) do |ds|
|
43
|
+
ds.with = "line"
|
44
|
+
if ""==ele.title then
|
45
|
+
ds.notitle
|
46
|
+
else
|
47
|
+
ds.title=ele.title
|
48
|
+
end
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
>>>
|
54
|
+
*plot領域でグラフ全体に関する設定.
|
55
|
+
*ds領域で一つ一つのプロットに関する設定
|
56
|
+
**plot.dataに格納している.
|
57
|
+
**dataには[[plot_data.rb|TouchTyping_Coding_PlotData]]で作成したPlotDataを配列に保存している.
|
58
|
+
*:pngをオプションとして受け取った場合に,pngファイルを作成.
|
Binary file
|
@@ -0,0 +1,389 @@
|
|
1
|
+
!Shunkuntypeのgem化
|
2
|
+
|
3
|
+
!!目的
|
4
|
+
shunkuntypeの配布を容易にするためgemを使って開発をすすめるためのメモ.
|
5
|
+
!!経緯
|
6
|
+
[[Shunkuntype_Coding]]にあるとおり,command line interfaceアプリとしてshunkuntypeは動作していた.しかし,幾つかの問題点があった.
|
7
|
+
|
8
|
+
# 開発途中でuserによる検証を行っていたので,最新版のinstallに手間がかかる
|
9
|
+
# install時に練習履歴などのdata fileをいちいち移行しないといけない.
|
10
|
+
# Rakefile.rbから動くようにしていたため,
|
11
|
+
## 各々のプログラムを起動
|
12
|
+
## code filesが分散
|
13
|
+
## directory構造が定まっていない
|
14
|
+
|
15
|
+
などである.
|
16
|
+
|
17
|
+
そこでgem標準での開発に移行した.これによって
|
18
|
+
|
19
|
+
# 標準的なgem installで最新版を常に維持可能
|
20
|
+
# data fileと実行ファイルが別の場所にあるので,いちいち移行する必要がない
|
21
|
+
# directory構造やoptparseによる標準的な記述が可能
|
22
|
+
|
23
|
+
になった.また,
|
24
|
+
|
25
|
+
* class化
|
26
|
+
|
27
|
+
が強制されるためcodeの隠蔽やyardドキュメントでの参照がしやすくなった.
|
28
|
+
|
29
|
+
ここで一つ懸念事項であった教材data filesの公開の是非は,
|
30
|
+
|
31
|
+
* local serverを立てて,そこからdown load
|
32
|
+
|
33
|
+
することで回避した.
|
34
|
+
|
35
|
+
その他の設計思想は[[Shunkuntype_Coding]]を踏襲している.
|
36
|
+
|
37
|
+
!!!追補(2016/3/9)
|
38
|
+
瀬川杯のチョンボでむしゃくしゃしていたので,その勢いをshunkuntypeの公開に向けた.
|
39
|
+
|
40
|
+
* rubygem.orgへの登録
|
41
|
+
* githubへの公開
|
42
|
+
|
43
|
+
が完了.
|
44
|
+
|
45
|
+
方針は,todoのDB.prepareを参照して~/.shunkuntypeの下にすべてのdataをおいた.さらに,
|
46
|
+
そこにserver_data.txtを置いて,server情報を明示している.review, submitなどがその情報を利用.
|
47
|
+
|
48
|
+
<<< tcsh
|
49
|
+
bob% cat ~/.shunkuntype/server_data.txt
|
50
|
+
bob@dmz0:/Users/bob/Sites/nishitani0/ShunkunTyper/mem_data
|
51
|
+
>>>
|
52
|
+
|
53
|
+
としている.
|
54
|
+
|
55
|
+
これにともない以下のinit周りもDataFilesに統合した.
|
56
|
+
|
57
|
+
!!!立ち上げ(-i)
|
58
|
+
練習,スピードデータを作成しておく必要がある.
|
59
|
+
bob% shunkuntype --init
|
60
|
+
過去のデータを移行は別に後述.
|
61
|
+
|
62
|
+
!!! 過去のデータを移行(-i)
|
63
|
+
gem化する前の古いshunkuntypeで練習していた人は,データを移行する必要がある.shunkuntype 1.0.1以降ではデータの名前が変更されているので注意.
|
64
|
+
<<< tcsh
|
65
|
+
[bob:~/.shunkuntype] bob% ls -lat
|
66
|
+
total 24
|
67
|
+
drwxr-xr-x 5 bob 501 170 3 10 14:16 ./
|
68
|
+
drwxr-xr-x 128 bob 501 4352 3 10 13:58 ../
|
69
|
+
-rw-r--r-- 1 bob 501 1036 3 10 13:09 speed_data.txt
|
70
|
+
-rw-r--r-- 1 bob 501 3924 3 10 13:08 training_data.txt
|
71
|
+
-rw-r--r-- 1 bob 501 59 3 9 14:10 server_data.txt
|
72
|
+
>>>
|
73
|
+
<<< tcsh
|
74
|
+
bob% cp ../shunkuntype/*_data.txt .
|
75
|
+
bob% shunkuntype --init
|
76
|
+
Shunkuntype says 'Hello world'.
|
77
|
+
./shunkuntype_speed_data.txt exits.
|
78
|
+
./shunkuntype_training_data.txt exits.
|
79
|
+
>>>
|
80
|
+
|
81
|
+
!! gem開発環境の構築
|
82
|
+
{{attach_anchor_string(「パーフェクトRuby」15章,PerfectRuby_c15_gems.pdf)}}を参照して作成していく.
|
83
|
+
「パーフェクトRuby」ではtest駆動になっていなかったが,ある程度までは
|
84
|
+
test駆動で進めたほうがよさそう.
|
85
|
+
* testに使い方や仕様を盛り込む
|
86
|
+
* CVMモデルから外れた場合
|
87
|
+
** DBを使うのが面倒なので,txtとする.その置き場はlocalにする.
|
88
|
+
*追記:test駆動では,すでに開発が終了して,testが十分なされているコードの移植では無駄が多い.たんにクラス化して動作を確認する方が早い.
|
89
|
+
|
90
|
+
!!! bundle他の記述
|
91
|
+
bob% bundle gem shunkuntype --test=minitest
|
92
|
+
で必要なファイルが自動生成される.このあと,minitestをunit-testに変更する必要がある.
|
93
|
+
詳しくは,[[RubyGems_development]]にある.
|
94
|
+
|
95
|
+
!!起動
|
96
|
+
rakeからyardが動かせるように.
|
97
|
+
< spec.add_development_dependency "yard", "~> 0.8"
|
98
|
+
をshunkuntype.gemspecに追加したあと,
|
99
|
+
|
100
|
+
<<< tcsh
|
101
|
+
bob% bundle install
|
102
|
+
bob% bundle exec rake yard
|
103
|
+
Files: 2
|
104
|
+
Modules: 1 ( 1 undocumented)
|
105
|
+
Classes: 0 ( 0 undocumented)
|
106
|
+
Constants: 1 ( 1 undocumented)
|
107
|
+
Methods: 0 ( 0 undocumented)
|
108
|
+
0.00% documented
|
109
|
+
>>>
|
110
|
+
|
111
|
+
bundle installしないと,このdiretoryでbundleがyardを使えない.
|
112
|
+
|
113
|
+
!!!exe
|
114
|
+
|
115
|
+
exeがないので自動生成.conflictが起こっている時には'n'で飛ばした.
|
116
|
+
|
117
|
+
<<< tcsh
|
118
|
+
bob% bundle gem shunkuntype -b -t
|
119
|
+
Creating gem 'shunkuntype'...
|
120
|
+
Code of conduct enabled in config
|
121
|
+
MIT License enabled in config
|
122
|
+
identical shunkuntype/Gemfile
|
123
|
+
identical shunkuntype/.gitignore
|
124
|
+
identical shunkuntype/lib/shunkuntype.rb
|
125
|
+
identical shunkuntype/lib/shunkuntype/version.rb
|
126
|
+
conflict shunkuntype/shunkuntype.gemspec
|
127
|
+
Overwrite /Users/bob/Ruby/shunkuntype/shunkuntype.gemspec? (enter "h" for help) [Ynaqdh] n
|
128
|
+
skip shunkuntype/shunkuntype.gemspec
|
129
|
+
create shunkuntype/Rakefile
|
130
|
+
conflict shunkuntype/README.md
|
131
|
+
Overwrite /Users/bob/Ruby/shunkuntype/README.md? (enter "h" for help) [Ynaqdh] n
|
132
|
+
skip shunkuntype/README.md
|
133
|
+
identical shunkuntype/bin/console
|
134
|
+
identical shunkuntype/bin/setup
|
135
|
+
identical shunkuntype/CODE_OF_CONDUCT.md
|
136
|
+
identical shunkuntype/LICENSE.txt
|
137
|
+
identical shunkuntype/.travis.yml
|
138
|
+
create shunkuntype/.rspec
|
139
|
+
create shunkuntype/spec/spec_helper.rb
|
140
|
+
create shunkuntype/spec/shunkuntype_spec.rb
|
141
|
+
create shunkuntype/exe/shunkuntype
|
142
|
+
Initializing git repo in /Users/bob/Ruby/shunkuntype
|
143
|
+
>>>
|
144
|
+
|
145
|
+
exe/shunkuntypeは
|
146
|
+
|
147
|
+
<<< ruby
|
148
|
+
#!/usr/bin/env ruby
|
149
|
+
|
150
|
+
require "shunkuntype"
|
151
|
+
|
152
|
+
Shunkuntype::Command.run(ARGV)
|
153
|
+
>>>
|
154
|
+
|
155
|
+
となっている.shunkuntype.rbのclass Commandに以下の記述を追加.
|
156
|
+
|
157
|
+
<<< ruby
|
158
|
+
def self.run(argv=[])
|
159
|
+
print "Hello world.\n"
|
160
|
+
# new(argv).execute
|
161
|
+
end
|
162
|
+
|
163
|
+
def initialize(argv=[])
|
164
|
+
@argv = argv
|
165
|
+
end
|
166
|
+
>>>
|
167
|
+
|
168
|
+
すると
|
169
|
+
|
170
|
+
<<< tcsh
|
171
|
+
bob% bundle exec exe/shunkuntype
|
172
|
+
Hello world.
|
173
|
+
>>>
|
174
|
+
|
175
|
+
で動いていることが確認できる.あとは,これを普通に改良していくだけ.
|
176
|
+
|
177
|
+
!!!buildのための改良
|
178
|
+
|
179
|
+
<<< tcsh
|
180
|
+
bob% bundle exec rake build
|
181
|
+
rake aborted!
|
182
|
+
WARNING: See http://guides.rubygems.org/specification-reference/ for help
|
183
|
+
ERROR: While executing gem ... (Gem::InvalidSpecificationException)
|
184
|
+
["Rakefile.rb"] are not files
|
185
|
+
>>>
|
186
|
+
|
187
|
+
なんで,
|
188
|
+
ln -s Rakefile Rakefile.rb
|
189
|
+
次に,
|
190
|
+
|
191
|
+
<<< tcsh
|
192
|
+
bob% bundle exec rake install:local
|
193
|
+
rake aborted!
|
194
|
+
WARNING: See http://guides.rubygems.org/specification-reference/ for help
|
195
|
+
ERROR: While executing gem ... (Gem::InvalidSpecificationException)
|
196
|
+
"FIXME" or "TODO" is not a description
|
197
|
+
|
198
|
+
rake aborted!
|
199
|
+
WARNING: See http://guides.rubygems.org/specification-reference/ for help
|
200
|
+
ERROR: While executing gem ... (Gem::InvalidSpecificationException)
|
201
|
+
missing value for attribute summary
|
202
|
+
>>>
|
203
|
+
|
204
|
+
なんで,
|
205
|
+
|
206
|
+
<<< tcsh
|
207
|
+
< spec.summary = %q{type training.}
|
208
|
+
< spec.description = %q{type training for shunkun.}
|
209
|
+
---
|
210
|
+
> spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.}
|
211
|
+
> spec.description = %q{TODO: Write a longer description or delete this line.}
|
212
|
+
>>>
|
213
|
+
とちゃんと書かんと.
|
214
|
+
|
215
|
+
!! gem serverの起動とcheck
|
216
|
+
公開できない可能性のあるアプリの開発のため,非公開のサーバを立てた場合の動作検証を進めておく.
|
217
|
+
|
218
|
+
今は,http://nishitani0.kwansei.ac.jp/~bob/nishitani0/gems/に置いている.この下のgemsに作成したshunkuntype-0.1.0.gemを置くとgem searchで見つかる.
|
219
|
+
|
220
|
+
<<< tcsh
|
221
|
+
bob% sudo gem install builder
|
222
|
+
Password:
|
223
|
+
Fetching: builder-3.2.2.gem (100%)
|
224
|
+
Successfully installed builder-3.2.2
|
225
|
+
Parsing documentation for builder-3.2.2
|
226
|
+
Installing ri documentation for builder-3.2.2
|
227
|
+
1 gem installed
|
228
|
+
bob% gem generate_index
|
229
|
+
Generating Marshal quick index gemspecs for 8 gems
|
230
|
+
........
|
231
|
+
Complete
|
232
|
+
Generated Marshal quick index gemspecs: 0.006s
|
233
|
+
Generating specs index
|
234
|
+
Generated specs index: 0.000s
|
235
|
+
Generating latest specs index
|
236
|
+
Generated latest specs index: 0.000s
|
237
|
+
Generating prerelease specs index
|
238
|
+
Generated prerelease specs index: 0.000s
|
239
|
+
Compressing indicies
|
240
|
+
Compressed indicies: 0.001s
|
241
|
+
|
242
|
+
bob% ls -r *
|
243
|
+
specs.4.8.gz prerelease_specs.4.8.gz latest_specs.4.8.gz
|
244
|
+
specs.4.8 prerelease_specs.4.8 latest_specs.4.8
|
245
|
+
|
246
|
+
quick:
|
247
|
+
Marshal.4.8/
|
248
|
+
|
249
|
+
gems:
|
250
|
+
shunkuntype-0.1.0.gem
|
251
|
+
|
252
|
+
>>>
|
253
|
+
|
254
|
+
<<< tcsh
|
255
|
+
bob% setenv HTTP_PROXY http://proxy.kwansei.ac.jp:8080
|
256
|
+
bob% setenv HTTP_PROXY http://proxy.ksc.kwansei.ac.jp:8080
|
257
|
+
bob% gem source -a 'http://nishitani0.kwansei.ac.jp/~bob/nishitani0/gems/'
|
258
|
+
http://nishitani0.kwansei.ac.jp/~bob/nishitani0/gems/ added to sources
|
259
|
+
bob% gem search shunkuntype -r
|
260
|
+
|
261
|
+
*** REMOTE GEMS ***
|
262
|
+
|
263
|
+
shunkuntype (0.1.0)
|
264
|
+
>>>
|
265
|
+
と無事見えた.
|
266
|
+
|
267
|
+
!!!install
|
268
|
+
<<< tcsh
|
269
|
+
bob% gem install shunkuntype
|
270
|
+
Successfully installed shunkuntype-0.1.0
|
271
|
+
Parsing documentation for shunkuntype-0.1.0
|
272
|
+
Done installing documentation for shunkuntype after 0 seconds
|
273
|
+
WARNING: Unable to pull data from 'http://localhost:8080': bad response Gateway Timeout 504 (http://localhost:8080/specs.4.8.gz)
|
274
|
+
1 gem installed
|
275
|
+
[bobsMacBookAir:~/Ruby/shunkuntype] bob% shunkuntype
|
276
|
+
shunkuntype: Command not found.
|
277
|
+
>>>
|
278
|
+
|
279
|
+
で,がくっときたが,
|
280
|
+
|
281
|
+
<<< tcsh
|
282
|
+
bob% ls /usr/local/lib/ruby/gems/2.2.0/gems/shunkuntype-0.1.0/
|
283
|
+
CODE_OF_CONDUCT.md LICENSE.txt Rakefile bin/ lib/
|
284
|
+
Gemfile README.md Rakefile.rb exe/ shunkuntype.gemspec
|
285
|
+
bob% ls /usr/local/lib/ruby/gems/2.2.0/bin
|
286
|
+
shunkuntype*
|
287
|
+
bob% /usr/local/lib/ruby/gems/2.2.0/bin/shunkuntype
|
288
|
+
Hello world.
|
289
|
+
>>>
|
290
|
+
無事完動.あとはpathを書いとくのがいいのかな.../usr/local/binにいれるというのも一つかも.
|
291
|
+
|
292
|
+
!!!追補
|
293
|
+
installし直すと/usr/local/binに追加された.これは,
|
294
|
+
gem update systems
|
295
|
+
でgemのversionが2.4.5->2.5.1に上がったため?.なぜなら,正しくは,
|
296
|
+
<<< tcsh
|
297
|
+
bob% gem environment
|
298
|
+
RubyGems Environment:
|
299
|
+
- RUBYGEMS VERSION: 2.5.1
|
300
|
+
- RUBY VERSION: 2.2.2 (2015-04-13 patchlevel 95) [x86_64-darwin13]
|
301
|
+
- INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/2.2.0
|
302
|
+
- USER INSTALLATION DIRECTORY: /Users/bob/.gem/ruby/2.2.0
|
303
|
+
- RUBY EXECUTABLE: /usr/local/opt/ruby/bin/ruby
|
304
|
+
- EXECUTABLE DIRECTORY: /usr/local/bin
|
305
|
+
- SPEC CACHE DIRECTORY: /Users/bob/.gem/specs
|
306
|
+
- SYSTEM CONFIGURATION DIRECTORY: /usr/local/Cellar/ruby/2.2.2/etc
|
307
|
+
- RUBYGEMS PLATFORMS:
|
308
|
+
- ruby
|
309
|
+
- x86_64-darwin-13
|
310
|
+
- GEM PATHS:
|
311
|
+
- /usr/local/lib/ruby/gems/2.2.0
|
312
|
+
- /Users/bob/.gem/ruby/2.2.0
|
313
|
+
- /usr/local/Cellar/ruby/2.2.2/lib/ruby/gems/2.2.0
|
314
|
+
- GEM CONFIGURATION:
|
315
|
+
- :update_sources => true
|
316
|
+
- :verbose => true
|
317
|
+
- :backtrace => false
|
318
|
+
- :bulk_threshold => 1000
|
319
|
+
- :sources => ["https://rubygems.org/", "http://nishitani0.kwansei.ac.jp/~bob/nishitani0/gems/"]
|
320
|
+
- REMOTE SOURCES:
|
321
|
+
- https://rubygems.org/
|
322
|
+
- http://nishitani0.kwansei.ac.jp/~bob/nishitani0/gems/
|
323
|
+
>>>
|
324
|
+
のEXECUTABLE DIRECTORYにinstallされる.sourceによるPATHのupdateを忘れずに.
|
325
|
+
|
326
|
+
!! shunkuntypeの移植
|
327
|
+
|
328
|
+
!!!shunkuntype.gemspecのfilesへの登録
|
329
|
+
|
330
|
+
新しくcode filesを足していく.この時,gem buildでちゃんと認識するには,
|
331
|
+
spec.filesに必要なファイルを足していく必要がある.
|
332
|
+
|
333
|
+
bundle gemで環境を作った場合,この操作は
|
334
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
335
|
+
により代行される.従って,gitでの操作
|
336
|
+
git add -A
|
337
|
+
git commit
|
338
|
+
などが必要.
|
339
|
+
|
340
|
+
!!!directoryの参照
|
341
|
+
shunkuntypeをどこにinstallあるいは,どこで起動されるかにかかわらずdataなどが
|
342
|
+
適切に参照されるようにするために,
|
343
|
+
data_dir=File.expand_path('../../../lib/data', __FILE__)
|
344
|
+
file_name="#{data_dir}/STEP-47.txt"
|
345
|
+
などとしている.ここでの__FILE__はexe/shunkuntypeが起点.
|
346
|
+
|
347
|
+
!!!optparse
|
348
|
+
|
349
|
+
perfect rubyではsubcommandを扱うためにtodo/options.rbに二重構造のparseを使う例を示している.
|
350
|
+
shunkuntypeでは一重でいいので,shunkuntype.rbに以下の通り記述.
|
351
|
+
|
352
|
+
<<< ruby
|
353
|
+
def execute
|
354
|
+
@argv << '--help' if @argv.size==0
|
355
|
+
command_parser = OptionParser.new do |opt|
|
356
|
+
opt.on('-v', '--version','Show program version.') { |v|
|
357
|
+
opt.version = Shunkuntype::VERSION
|
358
|
+
puts opt.ver
|
359
|
+
}
|
360
|
+
opt.on('-i', '--init','initialize data files.') {|v| InitDataFiles.new }
|
361
|
+
opt.on('-s', '--speed','speed check.') {|v| SpeedCheck.new }
|
362
|
+
opt.on('-m', '--minute [VAL]','minute training of file Integer.', Integer) {|v| Training.new(v) }
|
363
|
+
opt.on('-h', '--history','view training history.') {|v| FinishCheck.new }
|
364
|
+
opt.on('-r', '--report','submit data to dmz0') { |v| report_submit()}
|
365
|
+
end
|
366
|
+
command_parser.parse!(@argv)
|
367
|
+
exit
|
368
|
+
end
|
369
|
+
>>>
|
370
|
+
|
371
|
+
ここで[VAL]は「Integerの引数をとってもいい(とらなくてもいい)」ことを表している.この場合,Training.new(v)のvにはnilがはいって引き渡されるため,initialize(val=47)としてdefaultを
|
372
|
+
定義できなかった.そこで,
|
373
|
+
|
374
|
+
<<< ruby
|
375
|
+
val ||= 47
|
376
|
+
>>>
|
377
|
+
としている.
|
378
|
+
|
379
|
+
!!!テスト環境の手順と注意
|
380
|
+
|
381
|
+
テスト環境での検証を進めるときには,いちどbuildしたものをinstallする必要がある.server経由でinstallするとversionが変わらないと新たにinstallを行わない.buildではなく直接installすると最新版がversionの違いにかかわらずinstallされて動作検証が可能.
|
382
|
+
bundle exec rake install
|
383
|
+
では固まることがある.これは,ネット経由で通常のgemサーバーの情報を取ろうとしているため.
|
384
|
+
bundle exec rake install:local
|
385
|
+
でlocalのみにinstallされる.installしたのを直接叩いてテストすると便利.
|
386
|
+
|
387
|
+
!! 未対応
|
388
|
+
* debugとpryのためにreadline versionを
|
389
|
+
* referenceをlocalで参照できるように.
|
@@ -1,14 +1,15 @@
|
|
1
|
-
|
2
|
-
touch typing習得をめざしたcommand line interface アプリ.
|
1
|
+
! shunkuntypeのマニュアル
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
- こまめな練習が可能な一分間練習.
|
7
|
-
- 練習履歴のreportによる仲間内の「あおり」をおこなう工夫.
|
3
|
+
!!【概要】
|
4
|
+
touch typing習得をめざしたcommand line interface アプリ.
|
8
5
|
|
9
|
-
|
6
|
+
!!【特徴】
|
7
|
+
* 軽い.
|
8
|
+
* こまめな練習が可能な一分間練習.
|
9
|
+
* 練習履歴のreportによる仲間内の「あおり」をおこなう工夫.
|
10
10
|
|
11
|
-
|
11
|
+
!!【操作法】
|
12
|
+
<<< tcsh
|
12
13
|
bob% shunkuntype
|
13
14
|
Shunkuntype says 'Hello world'.
|
14
15
|
Usage: shunkuntype [options]
|
@@ -19,22 +20,33 @@ Usage: shunkuntype [options]
|
|
19
20
|
-p, --plot Plot personal data
|
20
21
|
-s, --submit Submit data to dmz0
|
21
22
|
--review [TAG] Review training, TAGs=html or hike
|
22
|
-
|
23
|
+
>>>
|
24
|
+
|
25
|
+
!!【具体的な手順】
|
23
26
|
|
24
|
-
|
25
|
-
### インストール
|
27
|
+
!!!インストール
|
26
28
|
基本的な操作は全てterminalから行う.
|
27
|
-
|
29
|
+
|
30
|
+
!!!!基本の動作
|
28
31
|
shunkuntypeが使用する3個のdata(training, speed, server)は~/.shunkuntypeに保存される.
|
29
32
|
|
30
|
-
|
33
|
+
!!!! proxyの登録とserverの追加
|
34
|
+
関学内ではgem installにproxyを通さないといけない.
|
35
|
+
<<< tcsh
|
36
|
+
for tcsh
|
37
|
+
bob% setenv HTTP_PROXY http://proxy.ksc.kwansei.ac.jp:8080
|
38
|
+
bob% setenv HTTPS_PROXY http://proxy.ksc.kwansei.ac.jp:8080
|
39
|
+
for bash, zsh
|
40
|
+
bob% export HTTP_PROXY=http://proxy.ksc.kwansei.ac.jp:8080
|
41
|
+
bob% export HTTPS_PROXY=http://proxy.ksc.kwansei.ac.jp:8080
|
42
|
+
>>>
|
43
|
+
|
44
|
+
!!!!install
|
31
45
|
gemがinstallするdirectoryのownerの権限によってはsudoが必要かもしれない.
|
32
|
-
|
33
|
-
bob% sudo gem install shunkuntype
|
34
|
-
```
|
46
|
+
bob% sudo gem install shunkuntype
|
35
47
|
|
36
|
-
|
37
|
-
|
48
|
+
!!!スピードチェック(-c)
|
49
|
+
<<<tcsh
|
38
50
|
bob% shunkuntype -c
|
39
51
|
Shunkuntype says 'Hello world'.
|
40
52
|
./shunkuntype_speed_data.txt opened succcessfully
|
@@ -48,11 +60,11 @@ sh z \ x \ c \ v b \ n m \ , \ . \ shift
|
|
48
60
|
1
|
49
61
|
require
|
50
62
|
require
|
51
|
-
|
52
|
-
で20
|
63
|
+
>>>
|
64
|
+
で20文字を何秒で打てるかをチェックできる.
|
53
65
|
|
54
|
-
|
55
|
-
|
66
|
+
!!!one minute drill(-d)
|
67
|
+
<<<tcsh
|
56
68
|
bob% shunkuntype -d 5
|
57
69
|
Shunkuntype says 'Hello world'.
|
58
70
|
q \ w \ e \ r t \ y u \ i \ o \ p
|
@@ -64,27 +76,30 @@ jeered duke fed jeered jeerer
|
|
64
76
|
|
65
77
|
Repeat above sentences. Type return-key to start.
|
66
78
|
deed did feed freed red deer
|
67
|
-
|
79
|
+
>>>
|
68
80
|
-dの後の引数で指定したNoのdrillを実行.
|
69
81
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
82
|
+
!!! reportのsubmit(-s)
|
83
|
+
./shunkuntype/server_data.txtに書かれた提出先server directoryに頭のユーザー名で保存される.
|
84
|
+
<<<ruby
|
85
|
+
bob% cat ~/.shunkuntype/server_data.txt
|
86
|
+
bob@dmz0:/Users/bob/Sites/nishitani0/ShunkunTyper/mem_data
|
87
|
+
>>>
|
88
|
+
<<< tcsh
|
76
89
|
bob% shunkuntype -s
|
77
90
|
Shunkuntype says 'Hello world'.
|
78
91
|
"bob"
|
79
92
|
"bob"
|
80
93
|
shunkuntype_training_data.txt 100% 3618 3.5KB/s 00:00
|
81
94
|
shunkuntype_speed_data.txt 100% 862 0.8KB/s 00:00
|
82
|
-
|
95
|
+
>>>
|
96
|
+
nishitani0のアカウントが必要.loginでうまくいかない時には西谷に聞け.
|
97
|
+
|
83
98
|
|
84
99
|
|
85
|
-
|
100
|
+
!!! 練習履歴の表示(-h)
|
86
101
|
練習履歴の表示は-hでされる.
|
87
|
-
|
102
|
+
<<< tcsh
|
88
103
|
bob% shunkuntype --history
|
89
104
|
Shunkuntype says 'Hello world'.
|
90
105
|
You've finished Basic drills of...
|
@@ -100,7 +115,7 @@ hour | contents | step
|
|
100
115
|
8 | ;p 40,41,42,43,44,45 |
|
101
116
|
9 | consol 46,47,48,49,50 | 47,48,49,
|
102
117
|
To continue one minute training: shunkuntype -d 21.
|
103
|
-
|
118
|
+
>>>
|
104
119
|
|
105
|
-
|
120
|
+
!!! 練習履歴の表示(-p)
|
106
121
|
個人の練習履歴のグラフをplot.gnuplotがないとerrorとなる.
|
@@ -0,0 +1,191 @@
|
|
1
|
+
!Touch typing習得環境Shunkuntypeの紹介
|
2
|
+
!!【概要】
|
3
|
+
Touch typingはprogrammerに必須のスキルである.裏をかえせば,プログラミングが苦手な学生ほど,このスキルが身についていないことが多い.より気にすべきは,ペアプログラミングにおいて熟練者がついた場合,運指がおかしい初心者の手の動きを不快と感じること.あらゆる作業において型が崩れていると親方が叱咤するのに通じる.所作の基本は,成功体験の集大成なのだから.touch typingは正にプログラマの「箸の上げ下ろし」なんだな.
|
4
|
+
|
5
|
+
さらに,運指がスムーズになると単語の綴りを指が覚えるようになるが,これはもう少し先の話.
|
6
|
+
|
7
|
+
さて,Touch typingの習得には,ピアノやギターの運指練習とおなじで単純な繰り返しが必要である.したがって飽きやすい.どのようにこの「単純な繰り返し練習」を「おもしろくするか」の一つの提案として,習得管理ツールを開発する.キーは「データの公開」である.
|
8
|
+
|
9
|
+
!!【序論】
|
10
|
+
!!!touch typingのコツ
|
11
|
+
touch typingの習得においてはスピードよりも運指が重要である.すなわち,スピードはそれほど速くなくても,運指を常に意識しておなじ指でおなじキーを押す癖をつけることが,初心者には必要である.これが後々のスピードアップにつながるだけでなく,
|
12
|
+
* タイプの正確性
|
13
|
+
* 視点固定による,疲労度の抑制
|
14
|
+
につながる.
|
15
|
+
|
16
|
+
!!! 非陳述記憶の性質
|
17
|
+
長期記憶には大きく分けて陳述記憶(declarative memory)と非陳述記憶(non declarative memory) がある.タイピングは自転車の乗り方と同じ,非陳述記憶の中の手続き記憶に分類され,同じ経験を反復することで形成される.いちど形成されると自動的に機能し,長期間保たれるという特徴がある[1].したがって,タッチタイピングの習得には繰り返し練習が有効である.
|
18
|
+
|
19
|
+
!!! 繰り返しの工夫,個人の資質から仲間力へ
|
20
|
+
しかし,繰り返し練習は単調であるためにどうしても継続が難しい.その単調さを克服するためには,個人の資質として,賢明な学習者やマインドセットなどが要望される.しかし,そこから鍛えていたのでは.相当な時間がかかってしまう.より即効性のある手法として,継続を促すために少数のグループによる「あおり」を助長する工夫を,開発したshunkuntypeでは,取り入れている.
|
21
|
+
|
22
|
+
!!!e-Learningからactive learningへ
|
23
|
+
このような単純な知識の習得に対して,e-Learningがいくつも開発されている.ところが,単にe-Learningシステムをやらせるだけでは,学習が継続しないという結果がでている.そこで,e-Learningの個別進捗に管理者がコメントをつけることによって,学習を継続させる方策が練られている.しかし,これによってもあまりいい結果は出ない.
|
24
|
+
|
25
|
+
これに対して,今回構築するシステムでは,参加者どうしがお互いの学習履歴,成果を閲覧することを可能にしている.これによりお互いの刺激となるように工夫している.すなわち,管理者による監視ではなく,参加者による「あおり」を学習継続の動機にすることを意図している.
|
26
|
+
|
27
|
+
これがactive learningの基本となる.
|
28
|
+
|
29
|
+
!!【方法:使用システムの概要】
|
30
|
+
shunkuntypeはcommand line interfaceによって振る舞いを制御している.
|
31
|
+
|
32
|
+
!!!個別練習操作
|
33
|
+
ユーザがtouch typingの練習を行う環境を提供する.
|
34
|
+
<<<tcsh
|
35
|
+
bob% shunkuntype
|
36
|
+
Shunkuntype says 'Hello world'.
|
37
|
+
Usage: shunkuntype [options]
|
38
|
+
-v, --version show program Version.
|
39
|
+
-c, --check Check speed
|
40
|
+
-d, --drill [VAL] one minute Drill [VAL]
|
41
|
+
-h, --history view training History
|
42
|
+
-p, --plot Plot personal data
|
43
|
+
-s, --submit Submit data to dmz0
|
44
|
+
--review [TAG] Review training, TAGs=html or hike
|
45
|
+
>>>
|
46
|
+
詳しい操作法,振る舞いの様子は [[ユーザーズマニュアル|Shunkuntype_manual]]にある.
|
47
|
+
|
48
|
+
!!!あおり操作(--review)
|
49
|
+
あおりのために用意された環境が--reviewである.ユーザがsubmitしたデータを集めて,進捗状況の表,およびグラフを作成し,表示する.--reviewの引数としてhtmlあるいはhikiを指定し,'tmp.html’あるいは'tmp.hiki'を作成.
|
50
|
+
|
51
|
+
!!!!reviewの出力例
|
52
|
+
以下は,hikiでの出力tmp.hikiを貼り付けた状態.work.png,speed.pngが自動生成される.
|
53
|
+
*Shunkun typer 2016-01-28 08:45:24 +0900
|
54
|
+
|| ||>speed[sec]||>training
|
55
|
+
||||init||current||total time[min]||step
|
56
|
+
||bob||37.68||40.39||57.00||45.00
|
57
|
+
||donkey||92.40||39.30||153.00||14.00
|
58
|
+
||fujimoto||90.63||39.81||118.00||22.00
|
59
|
+
||iwasa||61.01||56.36||360.00||20.00
|
60
|
+
||kiyohara||45.79||44.52||23.00|| 5.00
|
61
|
+
||sakaki||32.83||32.72|| 8.00|| 7.00
|
62
|
+
||sumita||127.51||48.94||152.00||15.00
|
63
|
+
||tomoyafujioka||101.12||43.66||456.00||34.00
|
64
|
+
||yoshiokatatsuro||79.59||52.36||526.00||24.00
|
65
|
+
|
66
|
+
||![[ |img/work.png]]||![[ |img/speed.png]]
|
67
|
+
||練習時間||speed結果
|
68
|
+
グラフの詳しい解説は次節で行う.
|
69
|
+
|
70
|
+
!!【結果:試行結果】
|
71
|
+
|
72
|
+
!!!継続性
|
73
|
+
図はそれぞれの被験者の練習の様子をグラフで示している.
|
74
|
+
|
75
|
+
||![[ |img/work.png]]
|
76
|
+
||練習時間の継続状況を示すグラフ.
|
77
|
+
|
78
|
+
*横軸に経過時間を日単位で,縦軸に練習時間を分単位でとっている.
|
79
|
+
*経過時間は現在を0点にして,左方向にマイナスでとっている
|
80
|
+
*それぞれの被験者の総練習量はそれぞれのグラフの最高位置で示される.
|
81
|
+
*被験者の立ち上がりがそれぞれ違うのは,実験に参加した時期が違うからである.
|
82
|
+
*16日経過時にもっとも進んでいるのは,fujiokaで,その次にdonkeyが続いている.
|
83
|
+
*それ以外の被験者の練習量は総じて低い.
|
84
|
+
|
85
|
+
被験者の練習量の推移はそれぞれの被験者の取り組みに対する特徴を示している.すなわち
|
86
|
+
|
87
|
+
* 毎日5分程度を継続しておこなう
|
88
|
+
* 気がついたときにちょこちょこと継続する
|
89
|
+
* まとめてやるがあまり継続しない.
|
90
|
+
|
91
|
+
などである.
|
92
|
+
|
93
|
+
!!!スピード改善
|
94
|
+
図はそれぞれの被験者のタイプspeedの様子をグラフで示している.
|
95
|
+
|
96
|
+
||![[ |img/speed.png]]
|
97
|
+
||タイプスピードの変化を示すグラフ.
|
98
|
+
|
99
|
+
* 横軸のスケールは同じ.
|
100
|
+
* 縦軸には20wordsを打つのに要する時間がプロットされている.
|
101
|
+
* speedにはtrainingで記録されているデータから計算したデータも含まれている.
|
102
|
+
* 途中でspeedが300秒などまで極端に落ちた理由は,後述のハンカチ試験を導入したため.
|
103
|
+
* よりミクロに個人の成績を見れば,speedが徐々に上がっていることが読み取れる.
|
104
|
+
** 例えば,fujiokaの-70-- -49days, sumitaの-63-- -21, iwasaの-35 -- -21
|
105
|
+
|
106
|
+
!!!ハンカチテスト
|
107
|
+
運指がうまくいっているかを自覚する方法としてハンカチテストが有効である.これは,手の甲の上にハンカチを置いて,手元のキーを見ずに打ち込んでいく方法である.これによって,
|
108
|
+
|
109
|
+
* キーを覚えているか
|
110
|
+
* ホームポジションへ帰っているか
|
111
|
+
* それぞれ決まった指でキーを押さえているか
|
112
|
+
|
113
|
+
のチェックができる.特に単なるspeed計測では50秒程度まで短縮している被験者も,ハンカチテストでは300秒もかかっている場合があった.
|
114
|
+
|
115
|
+
ただし,初心者はまったくkey配置を記憶できていないため,key配置表を用意しておく必要がある.これはそのようにspeedプログラムを改修した(2015/12/02).
|
116
|
+
|
117
|
+
!!【考察:参加者の意識調査】
|
118
|
+
参加者に対してグループヒアリングを行った[2].出てきた意見は次の通りである.
|
119
|
+
|
120
|
+
!!!スキルの定着度合い
|
121
|
+
touch typingのスキルの定着について聞いたところ,
|
122
|
+
*ホームポジションに戻す癖がついた
|
123
|
+
*運指がバラバラであったのが,5本指で打つようになった.
|
124
|
+
*手元を見ていた
|
125
|
+
*普段の生活での打ち方が変わった
|
126
|
+
*画面と本を見るだけで打てるようになった
|
127
|
+
*パソコンでしゃべるときが速くなった
|
128
|
+
*フリップ入力よりは圧倒的に速い
|
129
|
+
**フリップの速さは予測が効いているのかも
|
130
|
+
*日本語は打てていたが,英語はダメだったのが改善した
|
131
|
+
* カッコとかの位置も覚えた
|
132
|
+
* 左手一本で全領域を打っていたのが全部の指で打てるようになった.
|
133
|
+
* 変な癖がなくなった.
|
134
|
+
|
135
|
+
!!!「あおり」は効いたか?
|
136
|
+
speedの成績や練習時間を共有する「あおり」の効果について質問した.
|
137
|
+
* YはSに負けたくないのでがんばった.
|
138
|
+
* みんなのspeedをみて,いままで普通と思っていた入力速度に焦りが出た.自覚した.
|
139
|
+
* Dは練習をやり始めたらずっとやるので,F1もやらなと思った.
|
140
|
+
* 淡々としたんが好きで,おもしろい.レベル上げに通じる.
|
141
|
+
* 図で出るとちょっと意識する
|
142
|
+
* F2は煽る側で優越感を感じて...
|
143
|
+
|
144
|
+
!!!習慣になったか?
|
145
|
+
練習が習慣として定着したかと問うてみた.
|
146
|
+
* つかなんだ
|
147
|
+
* クリアしたら練習しない
|
148
|
+
* time計測の結果を見てあせった
|
149
|
+
* パソコン開いたらまずやるという習慣がついた
|
150
|
+
|
151
|
+
!!!不足している機能
|
152
|
+
不足している機能や,不満な点を指摘してもらった.
|
153
|
+
* ハンカチはよくない.余分な感覚があるから.
|
154
|
+
** 黒塗りのキーボードカバーはいいかも
|
155
|
+
*speedに普通の単語をもっと増やす
|
156
|
+
** 普通の単語はworkとかtableは変数によく使われるのでいいかも.
|
157
|
+
*日本語入力の練習もできるように.
|
158
|
+
** 将来プログラマーになるとは限らないので,練習の動機があがる.
|
159
|
+
*speedの単語には,”[.{}()[]=_"なども入れるべき
|
160
|
+
*ノルマを課すようにしては.
|
161
|
+
** 図に理想線とか,目標線とか,ガイドラインをいれては?
|
162
|
+
* speedをタイムアップ方式にしてもいいかも.1分試験
|
163
|
+
* レース完走方式にしてもいいかも.
|
164
|
+
* レベル上げ.装備をつけるなんかも...
|
165
|
+
|
166
|
+
!!【結論】
|
167
|
+
* 時間はかかったが参加者全員が20 words/45secsをクリアした.
|
168
|
+
** ただし,「クリアできなんだら卒研指導しない」というムチが働いた可能性は大きい.
|
169
|
+
* shunkuntypeはその後gemによるcommand line interfaceアプリケーションとして完成.
|
170
|
+
* web化が必要かもしれない.
|
171
|
+
|
172
|
+
その場合には,
|
173
|
+
|
174
|
+
* processingによるGUI
|
175
|
+
* 登録グループによる競争の実現
|
176
|
+
** 内部の煽りだけでなく,仮想敵を作って「くまさんチーム対うさぎさんチーム」で練習をあおる.
|
177
|
+
* dbへのdata移行
|
178
|
+
** sshより安全なデータ収集
|
179
|
+
** 平文テキスト修正によるチートをなくす
|
180
|
+
|
181
|
+
などを考慮して,Railsを用いるのかsinatoraなどでベタで作るのかの検討が必要.
|
182
|
+
|
183
|
+
!!付録
|
184
|
+
# [[マニュアル|Shunkuntype_manual]]
|
185
|
+
# [[gem化メモ|Shunkuntype_gemizing]]
|
186
|
+
# [[初期版のコード解説|Shunkuntype_Coding]]
|
187
|
+
|
188
|
+
!!参考資料
|
189
|
+
|
190
|
+
# 「陳述記憶・非陳述記憶」, 鈴木 麻希, 藤井 俊勝, 脳科学辞典,https://bsd.neuroinf.jp/wiki/陳述記憶・非陳述記憶 (2016/1/28アクセス).
|
191
|
+
# [[グループヒアリングメモ|Shunkuntype_GroupHearing_20160128.pdf]]
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
data/docs/res.png
ADDED
Binary file
|
Binary file
|
data/docs/speed.png
ADDED
Binary file
|
data/docs/work.png
ADDED
Binary file
|
data/lib/shunkuntype.rb
CHANGED
@@ -35,12 +35,28 @@ module Shunkuntype
|
|
35
35
|
opt.on('-h', '--history','view training History') {|v| FinishCheck.new }
|
36
36
|
opt.on('-p', '--plot','Plot personal data') { |v| PlotPersonalData.new }
|
37
37
|
opt.on('-s', '--submit','Submit data to dmz0') { |v| report_submit()}
|
38
|
-
opt.on('--
|
38
|
+
opt.on('--reset','reset training data') { |v| reset_data()}
|
39
|
+
opt.on('--review [FILE]','Review training, TAGs=html or hiki'){|v| data_viewing(v)}
|
39
40
|
end
|
40
41
|
command_parser.parse!(@argv)
|
41
42
|
exit
|
42
43
|
end
|
43
44
|
|
45
|
+
def reset_data
|
46
|
+
data_dir = File.join(ENV['HOME'], '.shunkuntype')
|
47
|
+
FileUtils.cd(data_dir)
|
48
|
+
begin
|
49
|
+
FileUtils.mkdir('old_data',:verbose => true)
|
50
|
+
rescue Errno::EEXIST
|
51
|
+
print "Directory 'old_data' exists at #{data_dir}.\n\n"
|
52
|
+
end
|
53
|
+
time=Time.now.strftime("%Y%m%d%H%M%S")
|
54
|
+
['speed_data','training_data'].each{|file|
|
55
|
+
target = File.join(data_dir,'old_data',"#{file}_#{time}.txt")
|
56
|
+
FileUtils.mv(file+'.txt',target,:verbose=>true)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
44
60
|
def report_submit
|
45
61
|
server_info=File.readlines(Shunkuntype::SERVER_FILE)
|
46
62
|
p server_directory=server_info[0].chomp
|
@@ -49,7 +65,12 @@ module Shunkuntype
|
|
49
65
|
system "scp #{Shunkuntype::SPEED_FILE} #{server_directory}/#{user_name}_speed_data.txt"
|
50
66
|
end
|
51
67
|
|
52
|
-
def data_viewing(
|
68
|
+
def data_viewing(file)
|
69
|
+
# opts for MkPlots could be described in file
|
70
|
+
# Not coded yet at all!!!
|
71
|
+
if file==nil then
|
72
|
+
opts = {}
|
73
|
+
end
|
53
74
|
server_info=File.readlines(Shunkuntype::SERVER_FILE)
|
54
75
|
p server_directory=server_info[0].chomp
|
55
76
|
Dir.mktmpdir('shunkun'){|tmp_dir|
|
@@ -58,27 +79,20 @@ module Shunkuntype
|
|
58
79
|
system "scp -r #{server_directory}/* #{tmp_dir}/mem_data"
|
59
80
|
# write data to file
|
60
81
|
table = MkSummary.new(tmp_dir)
|
61
|
-
MkPlots.new(tmp_dir)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
}
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
f.write('||{{attach_view(work.png)}}')
|
76
|
-
f.write('||{{attach_view(speed.png)}}')
|
77
|
-
f.write("\n")
|
78
|
-
}
|
79
|
-
else
|
80
|
-
|
81
|
-
end
|
82
|
+
MkPlots.new(tmp_dir,opts)
|
83
|
+
File.open('./tmp.html','a'){|f|
|
84
|
+
f.write("<html>\n")
|
85
|
+
f.write(table.mk_html_table())
|
86
|
+
f.write("<p><img src=\"./work.png\" /></p>")
|
87
|
+
f.write("<p><img src=\"./speed.png\" /></p>")
|
88
|
+
f.write("</html>\n")
|
89
|
+
}
|
90
|
+
File.open('./tmp.hiki','a'){|f|
|
91
|
+
f.write(table.mk_hiki_table())
|
92
|
+
f.write('||{{attach_view(work.png)}}')
|
93
|
+
f.write('||{{attach_view(speed.png)}}')
|
94
|
+
f.write("\n")
|
95
|
+
}
|
82
96
|
}
|
83
97
|
end
|
84
98
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module Shunkuntype
|
5
|
+
VERSION = "1.0.3"
|
6
|
+
data_dir = File.join(ENV['HOME'], '.shunkuntype')
|
7
|
+
# SPEED_FILE="./shunkuntype_speed_data.txt"
|
8
|
+
SPEED_FILE=File.join(data_dir,"speed_data.txt")
|
9
|
+
# TRAIN_FILE="./shunkuntype_training_data.txt"
|
10
|
+
TRAIN_FILE=File.join(data_dir,"training_data.txt")
|
11
|
+
SERVER_FILE=File.join(data_dir,"server_data.txt")
|
12
|
+
end
|
@@ -76,9 +76,10 @@ end
|
|
76
76
|
|
77
77
|
class MkPlots
|
78
78
|
|
79
|
-
def initialize(tmp_dir)
|
79
|
+
def initialize(tmp_dir,opts={})
|
80
80
|
@source_dir=File.join(tmp_dir,'mem_data')
|
81
81
|
@mem_names=[]
|
82
|
+
@opts = opts
|
82
83
|
mk_mem_names()
|
83
84
|
work_all()
|
84
85
|
FileUtils.mv('res.png', './work.png')
|
@@ -97,6 +98,7 @@ class MkPlots
|
|
97
98
|
mk_mem_names
|
98
99
|
all_data= @mem_names.inject([]){|all,name| all << speed_view(name) }
|
99
100
|
text="Typing speed [sec/20 words]"
|
101
|
+
|
100
102
|
plot(all_data,text)
|
101
103
|
plot(all_data,text,opts={:png=>true})
|
102
104
|
end
|
data/lib/shunkuntype/version.rb
CHANGED
data/shunkuntype.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
18
|
# delete this section to allow pushing this gem to any host.
|
19
19
|
# if spec.respond_to?(:metadata)
|
20
|
-
# spec.metadata['allowed_push_host'] =
|
20
|
+
# spec.metadata['allowed_push_host'] = 'http://nishitani0.kwansei.ac.jp:2000'
|
21
21
|
# else
|
22
22
|
# raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
23
23
|
# end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shunkuntype
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shigeto R. Nishitani
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: systemu
|
@@ -115,9 +115,24 @@ files:
|
|
115
115
|
- Rakefile.rb
|
116
116
|
- bin/console
|
117
117
|
- bin/setup
|
118
|
-
- docs/
|
119
|
-
- docs/
|
120
|
-
- docs/
|
118
|
+
- docs/Shunkuntype.hiki
|
119
|
+
- docs/Shunkuntype_Coding.hiki
|
120
|
+
- docs/Shunkuntype_Coding_PlotData.hiki
|
121
|
+
- docs/Shunkuntype_Coding_gnuplot.hiki
|
122
|
+
- docs/Shunkuntype_GroupHearing_20160128.pdf
|
123
|
+
- docs/Shunkuntype_gemizing.hiki
|
124
|
+
- docs/Shunkuntype_manual.hiki
|
125
|
+
- docs/Shunkuntype_report.hiki
|
126
|
+
- docs/TouchTypespeedResult.png
|
127
|
+
- docs/TouchTypetrainingResult.png
|
128
|
+
- docs/TouchTypewhole_workResult.png
|
129
|
+
- docs/donkey_and_fujimoto.png
|
130
|
+
- docs/readme_en.hiki
|
131
|
+
- docs/readme_ja.hiki
|
132
|
+
- docs/res.png
|
133
|
+
- docs/shunkun_report.pdf
|
134
|
+
- docs/speed.png
|
135
|
+
- docs/work.png
|
121
136
|
- exe/shunkuntype
|
122
137
|
- lib/data/STEP-1.txt
|
123
138
|
- lib/data/STEP-10.txt
|
@@ -174,6 +189,7 @@ files:
|
|
174
189
|
- lib/data/trans2.rb
|
175
190
|
- lib/data/word.list
|
176
191
|
- lib/shunkuntype.rb
|
192
|
+
- lib/shunkuntype/#version.rb#
|
177
193
|
- lib/shunkuntype/db.rb
|
178
194
|
- lib/shunkuntype/finished_check.rb
|
179
195
|
- lib/shunkuntype/mk_summary.rb
|
@@ -209,4 +225,3 @@ signing_key:
|
|
209
225
|
specification_version: 4
|
210
226
|
summary: type training.
|
211
227
|
test_files: []
|
212
|
-
has_rdoc:
|