shunkuntype 1.0.3 → 1.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: faafb653c6e2c3d232da67f82a8f14af351202ae
4
- data.tar.gz: b4d22a7dabaf721678634631196790fbe65fa2ef
3
+ metadata.gz: fa980481aa57d8bae72450249ad33e6fe82b62ba
4
+ data.tar.gz: 03142adad7500cec3252942be94bc084efc7120e
5
5
  SHA512:
6
- metadata.gz: 7ef99c8494bd8ec1e3db0b61769eb0ebe4682e1e2e11c0563df1bf2a1eef16d25f4d2fa492dbfd0805835aaa039e8e49a45ab31d4a163da58d80e64596955f8d
7
- data.tar.gz: 62181ae061c9c38ac192ad8004259b4081d6fe8b96175a588dbb6a32ea04cde8cd2b17dc2d84484bd4d87d3d7956caa20b1f994cb4b37c46d198a1924f6a60de
6
+ metadata.gz: de1e1914b42d69b735da36af6e0fa6e55322483aa15717c1d5d15ca4bbe7173e7eb1d2e18adfdf325372b64c524a940e0766294ee7f48244e3aad8421379e914
7
+ data.tar.gz: 3369e8e93244e3780ce67ac56d3deb375bcb28bcb46f6eb68fb10a1959d81790a87b37c420f1d720debb1aff0531507c1b958b17ef8f451d9c2dca79421d9a80
data/.yardopts CHANGED
@@ -1,4 +1,3 @@
1
1
  -
2
- docs/README.en.md
3
- docs/README.ja.md
2
+ **/*.md
4
3
 
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source 'https://rubygems.org'
2
+ #source 'http://nishitani0.kwansei.ac.jp:2000'
2
3
 
3
4
  # Specify your gem's dependencies in shunkuntype.gemspec
4
5
  gemspec
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
- p command="hiki2md docs/readme.en.hiki > docs/README.en.md"
15
- system command
16
- p command="hiki2md docs/readme.ja.hiki > docs/README.ja.md"
17
- system command
18
- p command="mv docs/README.en.md ./README.md"
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ファイルを作成.
@@ -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
- # shunkuntype
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
- ```tcsh
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
- #### install
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
- ### スピードチェック(-c)
37
- ```tcsh
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
- ### one minute drill(-d)
55
- ```tcsh
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
- ### reportのsubmit(-s)
71
- ~/.shunkuntype/server_data.txtに書かれた提出先server directoryに頭のユーザー名で保存される.
72
- ```ruby
73
- login名@sever名:ディレクトリ
74
- ```
75
- ```tcsh
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
- ### 練習履歴の表示(-h)
100
+ !!! 練習履歴の表示(-h)
86
101
  練習履歴の表示は-hでされる.
87
- ```tcsh
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
- ### 練習履歴の表示(-p)
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('--review [TAG]',[:html,:hiki],'Review training, TAGs=html or hiki'){|v| data_viewing(v)}
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(form)
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
- p form ||= :html
63
- case form
64
- when :html then
65
- File.open('./tmp.html','a'){|f|
66
- f.write("<html>\n")
67
- f.write(table.mk_html_table())
68
- f.write("<p><img src=\"./work.png\" /></p>")
69
- f.write("<p><img src=\"./speed.png\" /></p>")
70
- f.write("</html>\n")
71
- }
72
- when :hiki then
73
- File.open('./tmp.hiki','a'){|f|
74
- f.write(table.mk_hiki_table())
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
@@ -2,7 +2,7 @@ require 'fileutils'
2
2
  require 'tmpdir'
3
3
 
4
4
  module Shunkuntype
5
- VERSION = "1.0.3"
5
+ VERSION = "1.0.4"
6
6
  data_dir = File.join(ENV['HOME'], '.shunkuntype')
7
7
  # SPEED_FILE="./shunkuntype_speed_data.txt"
8
8
  SPEED_FILE=File.join(data_dir,"speed_data.txt")
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'] = "TODO: Set to 'http://mygemserver.com'"
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.3
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-04-07 00:00:00.000000000 Z
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/README.ja.md
119
- - docs/readme.en.hiki
120
- - docs/readme.ja.hiki
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: