2013年04月
2013年04月27日
自分用メモ
最近Rubyでタイピングソフトとか作ってて公開用にexe作ろうとしたらうまく行かなかった時のまとめ
ちなみにexe化はocraを使っています。ocraについては色々と詳しい説明があるので他に任せます。
問題が発生したのは以下の様な、ファイル2を読み込んで使うファイル1をexeにしようとした時
#ファイル1.rbここから
require "./ファイル2"
#中略
#終了
みたいな感じでファイル2を読み込んで(普通にRubyで)動かしてたんだけどocraでexeにしたらファイル2が無い場所で使えない(ソースがある場所なら動く)というわけでうまくファイル2を使えないらしいということに遭遇。ocraは必要なファイル読み込んで同梱してくれるんじゃなかったのかよ…
ファイルを同梱しようと思って次のように
ocra ファイル1.rb ファイル2.rb
やってもダメ(入ってるのか入ってないのかわからんけどファイル2が読めないってエラー出る)。--dllのなんとかを使ってもダメ。ファイル2のパスがうまく設定できないらしい。
でいろいろ探してたらこれを見つけた。
結局どうしたかというとrequireの行を
require File.expand_path(File.dirname(__FILE__) + './ファイル2')
としたら動いた。相対パスやら絶対パスが何とかとかいう問題らしい。
最近Rubyでタイピングソフトとか作ってて公開用にexe作ろうとしたらうまく行かなかった時のまとめ
ちなみにexe化はocraを使っています。ocraについては色々と詳しい説明があるので他に任せます。
問題が発生したのは以下の様な、ファイル2を読み込んで使うファイル1をexeにしようとした時
#ファイル1.rbここから
require "./ファイル2"
#中略
#終了
みたいな感じでファイル2を読み込んで(普通にRubyで)動かしてたんだけどocraでexeにしたらファイル2が無い場所で使えない(ソースがある場所なら動く)というわけでうまくファイル2を使えないらしいということに遭遇。ocraは必要なファイル読み込んで同梱してくれるんじゃなかったのかよ…
ファイルを同梱しようと思って次のように
ocra ファイル1.rb ファイル2.rb
やってもダメ(入ってるのか入ってないのかわからんけどファイル2が読めないってエラー出る)。--dllのなんとかを使ってもダメ。ファイル2のパスがうまく設定できないらしい。
でいろいろ探してたらこれを見つけた。
結局どうしたかというとrequireの行を
require File.expand_path(File.dirname(__FILE__) + './ファイル2')
としたら動いた。相対パスやら絶対パスが何とかとかいう問題らしい。
(22:06)
プログラミングの話です。
Rubyはなんか適当に代入すると参照渡しとか言うやつになるらしく、例えば
b = a
とかやった後にbを変更するとaも変わってしまうという事になっています(簡単に言うと2つの名前がついた状態になっている)。
そういうわけでaをそのままにコピーしたbを弄りたいときはa.cloneとか使って中身だけコピーというのを使うんですけど。今回はこれで謎の現象(使ってる人は当たり前?)に遭遇しました。
実際にどうなったのかは以下のとおりです。
#ここから
a = ["abc","def"]
b = a.clone
b[0].upcase!
print a
#ここまで
ちなみにupcase!はその要素(文字列)の小文字を大文字に書き換えるメソッドです。上のプログラムを実行すると
["ABC","def"]
と出力されます。cloneしたはずのaが書き換わってしまってます。配列のcloneてこういうものなんでしょうか。ちなみにaを配列ではなく文字列だとこういうことは起こりませんでした。
b[0] = b[0].upcase
としたら普通に動いたのでそういうことにしました。
というわけで配列のcloneと破壊的メソッドを合わせて使うときは注意したほうがいいようです。
おわり
(文字列 << "追加の文字列" #ってやつも破壊的メソッドなんですね。これ書いた直後にこれでハマるとか…)
Rubyはなんか適当に代入すると参照渡しとか言うやつになるらしく、例えば
b = a
とかやった後にbを変更するとaも変わってしまうという事になっています(簡単に言うと2つの名前がついた状態になっている)。
そういうわけでaをそのままにコピーしたbを弄りたいときはa.cloneとか使って中身だけコピーというのを使うんですけど。今回はこれで謎の現象(使ってる人は当たり前?)に遭遇しました。
実際にどうなったのかは以下のとおりです。
#ここから
a = ["abc","def"]
b = a.clone
b[0].upcase!
print a
#ここまで
ちなみにupcase!はその要素(文字列)の小文字を大文字に書き換えるメソッドです。上のプログラムを実行すると
["ABC","def"]
と出力されます。cloneしたはずのaが書き換わってしまってます。配列のcloneてこういうものなんでしょうか。ちなみにaを配列ではなく文字列だとこういうことは起こりませんでした。
b[0] = b[0].upcase
としたら普通に動いたのでそういうことにしました。
というわけで配列のcloneと破壊的メソッドを合わせて使うときは注意したほうがいいようです。
おわり
(文字列 << "追加の文字列" #ってやつも破壊的メソッドなんですね。これ書いた直後にこれでハマるとか…)
(02:34)
2013年04月14日
おまけです
1.リプレイのtxtを書き換えて都合のいいリプレイを作る
対象にするtxtファイルがtwhookで作られるtxtと同じ形式になっていれば読めるため、詰まりミスした部分の速さを書き換える、読めなかった漢字を平仮名にするなど比較的自由にリプレイファイルを編集することができます。
ぼくがかんがえたさいこうのりぷれいと対戦したりすごく単調なリプレイと対戦したり遊び方はいろいろです。
2.csvを書き換えて〜
txtだけでなくcsvも同じように書き換えちゃったりもできます。例えば打鍵速度順にソートして速い単語や遅い単語のみを集めた物を作るとか打鍵速度をすべて同じ速度にしてしまうとか色々出来ます。モード違いのデータを統合することなどもできますが英語と日本語が混ざると流れる文字やローマ字の表示がおかしくなります。
csvを保存する場合はエンコードをSJIS、カンマ区切りで保存してください。
3.ローマ字表示設定をいじる
ローマ字表示設定自体は自由に設定することができます。ただし表示したからといってその表示のとおりに打てるとは限りません。上から順番にすべて書き換えていくため例えば次のように書くとico以外はkoと表示させたりできます。(順番を逆にするとすべてkoになります)
ko,co
ico,iko
...
ちなみに
A,a
B,b
...
Z,z
...
とすれば大文字表示設定ができます。
※csvやtxt(特にtxt)を編集して遊ぶ場合は元のデータを消さないように注意してください。また、書き換えたtxtでも統計分析ツールは対象ファイルにしてしまうため編集したtxtは別フォルダに移動するなど取り扱いには注意してください。
1.リプレイのtxtを書き換えて都合のいいリプレイを作る
対象にするtxtファイルがtwhookで作られるtxtと同じ形式になっていれば読めるため、詰まりミスした部分の速さを書き換える、読めなかった漢字を平仮名にするなど比較的自由にリプレイファイルを編集することができます。
ぼくがかんがえたさいこうのりぷれいと対戦したりすごく単調なリプレイと対戦したり遊び方はいろいろです。
2.csvを書き換えて〜
txtだけでなくcsvも同じように書き換えちゃったりもできます。例えば打鍵速度順にソートして速い単語や遅い単語のみを集めた物を作るとか打鍵速度をすべて同じ速度にしてしまうとか色々出来ます。モード違いのデータを統合することなどもできますが英語と日本語が混ざると流れる文字やローマ字の表示がおかしくなります。
csvを保存する場合はエンコードをSJIS、カンマ区切りで保存してください。
3.ローマ字表示設定をいじる
ローマ字表示設定自体は自由に設定することができます。ただし表示したからといってその表示のとおりに打てるとは限りません。上から順番にすべて書き換えていくため例えば次のように書くとico以外はkoと表示させたりできます。(順番を逆にするとすべてkoになります)
ko,co
ico,iko
...
ちなみに
A,a
B,b
...
Z,z
...
とすれば大文字表示設定ができます。
※csvやtxt(特にtxt)を編集して遊ぶ場合は元のデータを消さないように注意してください。また、書き換えたtxtでも統計分析ツールは対象ファイルにしてしまうため編集したtxtは別フォルダに移動するなど取り扱いには注意してください。
(18:17)
作りました。ダウンロード、Readme、ソース(欲しい人のみ)
と言いつつリプレイとの対戦がメインですけど。
国語Rと英単語のみ対応です。
利用にはtwhookの利用がほぼ必須で、twhookから生成されるDetailLogの中身のファイルを指定するとそのリプレイと対戦ができます。
ちなみにリプレイの速さでローマ字は消えていき(消えた文字でも一応打てます)、日本語は流れていきます(流れ方はタイプウェルのものとは異なります)。
リプレイに32文字くらい差を付けられると負け、リプレイより速く打ち切れば勝ちになります。(F8でお気に入り登録した物のみ勝敗が記録されます)
F11を押すとリプレイモードになり、勝ち負けがつかなくなり、最後までリプレイを再生することができます。
F12はハードモードです。一瞬でもリプレイに抜かれると即終了です。
[操作法]
F5 新しくファイルを開く
F8 お気に入りに追加
F11 リプレイモード(勝ち負けがつかないモード、対戦自体は可能)
F12 ハードモード(CPUに抜かれた瞬間に即終了)
Delete お気に入りから削除
カーソル上下 お気に入りからファイルを選ぶ
Control お気に入り一覧表示
カーソル左右 CSVを対象にした場合にCPUの速さを変更することができます(100%以外では勝敗は記録されません)
Home 倍率を100%に
Esc トライアルの終了
Enter 開始
その他の使用法。
統計分析ツール(国語Rの場合はver.3が必要)で出力したCSVを指定することで、これまで打った平均的な速さのリプレイと対戦することができます(初速は0.5秒+1打目にかかる時間)。
起動するとoption.datというファイルが作られますが最後の行にローマ字表示設定を追加していくことができます。左に表示したい文字,右に変更したい文字を書くと好きなローマ字表示設定ができるようになっています。
例
ka,ca
cu,ku
co,co
...
※4/15追記fav.datが存在しない状態で起動した場合にまともに使えない不具合を確認。とりあえずこのファイルを同じフォルダに入れて起動してください。
※5/15 セーブデータが存在しなくてもちゃんと動くように修正(↑のファイルは不要)
と言いつつリプレイとの対戦がメインですけど。
国語Rと英単語のみ対応です。
利用にはtwhookの利用がほぼ必須で、twhookから生成されるDetailLogの中身のファイルを指定するとそのリプレイと対戦ができます。
ちなみにリプレイの速さでローマ字は消えていき(消えた文字でも一応打てます)、日本語は流れていきます(流れ方はタイプウェルのものとは異なります)。
リプレイに32文字くらい差を付けられると負け、リプレイより速く打ち切れば勝ちになります。(F8でお気に入り登録した物のみ勝敗が記録されます)
F11を押すとリプレイモードになり、勝ち負けがつかなくなり、最後までリプレイを再生することができます。
F12はハードモードです。一瞬でもリプレイに抜かれると即終了です。
[操作法]
F5 新しくファイルを開く
F8 お気に入りに追加
F11 リプレイモード(勝ち負けがつかないモード、対戦自体は可能)
F12 ハードモード(CPUに抜かれた瞬間に即終了)
Delete お気に入りから削除
カーソル上下 お気に入りからファイルを選ぶ
Control お気に入り一覧表示
カーソル左右 CSVを対象にした場合にCPUの速さを変更することができます(100%以外では勝敗は記録されません)
Home 倍率を100%に
Esc トライアルの終了
Enter 開始
その他の使用法。
統計分析ツール(国語Rの場合はver.3が必要)で出力したCSVを指定することで、これまで打った平均的な速さのリプレイと対戦することができます(初速は0.5秒+1打目にかかる時間)。
起動するとoption.datというファイルが作られますが最後の行にローマ字表示設定を追加していくことができます。左に表示したい文字,右に変更したい文字を書くと好きなローマ字表示設定ができるようになっています。
例
ka,ca
cu,ku
co,co
...
※4/15追記fav.datが存在しない状態で起動した場合にまともに使えない不具合を確認。とりあえずこのファイルを同じフォルダに入れて起動してください。
※5/15 セーブデータが存在しなくてもちゃんと動くように修正(↑のファイルは不要)
(17:39)